如何将一组值从 Oracle Apex Page 传递到 Oracle 存储过程
How to pass an array of values from Oracle Apex Page into Oracle stored procedure
我坚持将日期作为数组参数从 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: line 3, column 25: PLS-00312: a positional parameter association may not follow a named association ORA-06550: line 2, column 1: PL/SQL: Statement ignored
它有什么问题或我错过了什么?
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.create 页面和按钮以及提交过程之后:
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;
- 在提交页面的按钮之后我得到了这个:
https://gyazo.com/b894fc6b9b6dd28964ba2e6548244bc8
我坚持将日期作为数组参数从 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: line 3, column 25: PLS-00312: a positional parameter association may not follow a named association ORA-06550: line 2, column 1: PL/SQL: Statement ignored
它有什么问题或我错过了什么?
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.create 页面和按钮以及提交过程之后: 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;
- 在提交页面的按钮之后我得到了这个: https://gyazo.com/b894fc6b9b6dd28964ba2e6548244bc8