0

我坚持将日期作为数组参数从 Oracle Apex 页面传递到包中。包包含一个带有日期类型数组的过程。所以我想做的是从 Apex 页面 pl/sql 块中传递一个简单的日期。到目前为止,这是我的代码:

create or replace PACKAGE PK_NAME AS 

TYPE DATES_ARRAY_TYPE IS VARRAY(100) OF DATE;

PROCEDURE PASS_DATES (
      DATES DATES_ARRAY_TYPE
);

END PK_NAME;

create or replace PACKAGE BODY PK_NAME AS 

PROCEDURE PASS_DATES (
    DATES DATES_ARRAY_TYPE
) AS     
BEGIN    
for i in 1..DATES.count loop                 
   HTP.P(DATES(i));
end loop;
 END;
 END PASS_DATES;

 END PK_NAME;

就那么简单。我从 Apex 页面 pl/sql 块中调用此过程:

PK_NAME.PASS_DATES (
  DATES => '15-JAN-15', '16-JAN-15', '17-JAN-15'
);

但是,它不起作用,每次我尝试保存它时,它都会给我一个错误:

•ORA-06550:第 3 行,第 25 列:PLS-00312:位置参数关联可能不遵循命名关联 ORA-06550:第 2 行,第 1 列:PL/SQL:语句被忽略

它有什么问题或我错过了什么?

4

1 回答 1

2

https://docs.oracle.com/cd/A97630_01/appdev.920/a96624/05_colls.htm

你必须初始化构造函数 DATES_ARRAY_TYPE() 我认为它必须看起来像这样

create TYPE DATES_ARRAY_TYPE IS VARRAY(100) OF DATE;

create or replace procedure test_case( p_dates DATES_ARRAY_TYPE) is 
begin
  dbms_output.put_line(p_dates(1));
end;

declare
 a DATES_ARRAY_TYPE;
begin
a := DATES_ARRAY_TYPE(sysdate, sysdate + 1,to_date('1.01.2016','dd.mm.yyyy'));
  test_case(a);
end;

此外,如果您想在 PACKAGE PK_NAME(非全局)中使用 TYPE,则必须在代码中使用 PK_NAME.DATES_ARRAY_TYPE 之类的对象。

好的,让我们开始吧: 1. 创建包和正文: https ://gyazo.com/789b875ce47852e859c395c2021f9cd4

create or replace PACKAGE PCK AS 
  -- your type in pck
  TYPE DATES_ARRAY_TYPE IS VARRAY(100) OF DATE;
  procedure test_case(p_dates DATES_ARRAY_TYPE);      
END PCK;

create or replace PACKAGE body PCK AS 
  procedure test_case(p_dates DATES_ARRAY_TYPE) IS
   BEGIN
    --here just raise second element in array for DEMO
    raise_application_error('-20000',p_dates(2) );
   END;
END PCK;

2.创建页面和按钮并在提交过程后: https ://gyazo.com/755f6e089db0a6a8ea058567d2b3384b

declare
  asd PCK.DATES_ARRAY_TYPE := PCK.DATES_ARRAY_TYPE('31-JUL-15', '01-AUG-15', '02-AUG-13', '03-AUG-13'); 
begin
  pck.test_case(asd);
end;
  1. 在提交页面的按钮之后,我得到了这个: https ://gyazo.com/b894fc6b9b6dd28964ba2e6548244bc8
于 2016-07-15T12:26:22.487 回答