如何将pl / sql记录类型传递给过程:
CREATE OR REPLACE PACKAGE BODY PKGDeleteNumber
AS
PROCEDURE deleteNumber (
list_of_numbers IN List_Numbers
)
IS
i_write VARCHAR2(5);
BEGIN
--do something
END deleteNumber;
END PKGDeleteNumber;
/
在此过程中deleteNumber
我使用了List_Numbers
,这是一种记录类型。相同的包声明是:
CREATE OR REPLACE PACKAGE PKGDeleteNumber
AS
TYPE List_Numbers IS RECORD (
IID NUMBER
);
TYPE list_of_numbers IS TABLE OF List_Numbers;
PROCEDURE deleteNumber (
list_of_numbers IN List_Numbers
);
END PKGDeleteNumber;
我必须执行传递值列表的过程deleteNumber
。我在temp_test
表中插入了数字,然后使用游标U从中获取数据:
SELECT *
BULK COLLECT INTO test1
FROM temp_test;
现在,调用我正在使用的程序
execute immediate 'begin PKGDELETENUMBER.DELETENUMBER(:1); end;'
using test1;
我也尝试过很多其他事情(for loop
,dbms_binding
等)。如何将pl / sql记录类型作为参数传递给过程?
编辑:
基本上,我想传递一个数字列表,仅使用原生动态sql ...
添加表temp_test defn(无索引或约束):
create table test_temp (
IID number
);
然后使用普通insert
语句插入1,2,3,4,5。
对于此解决方案,
In a package testproc
CREATE TYPE num_tab_t IS TABLE OF NUMBER;
CREATE OR REPLACE PROCEDURE my_dyn_proc_test (p_num_array IN num_tab_t) AS
BEGIN
dbms_output.put_line(p_num_array.COUNT);
END;
/
这是从sql prompt / toad调用的 宣布 v_tab testproc.num_tab_t:= testproc.num_tab_t(1,10); 开始 EXECUTE IMMEDIATE'BEGIN testproc.my_dyn_proc_test(:1);结束;'使用v_tab; END;
这不起作用。这显示错误。我不在我的工作站,因此现在无法重现该问题。
答案 0 :(得分:1)
您不能在RECORD
语句的USING
子句中使用EXECUTE IMMEDIATE
类型。如果您只想传递一个数字列表,为什么不只使用TABLE OF NUMBER
类型的变量?检查以下示例:
CREATE TYPE num_tab_t IS TABLE OF NUMBER;
CREATE OR REPLACE PROCEDURE my_dyn_proc_test (p_num_array IN num_tab_t) AS
BEGIN
dbms_output.put_line(p_num_array.COUNT);
END;
/
DECLARE
v_tab num_tab_t := num_tab_t(1, 10);
BEGIN
EXECUTE IMMEDIATE 'BEGIN my_dyn_proc_test(:1); END;' USING v_tab;
END;
输出:
2
修改强>
试试这个:
CREATE TYPE num_tab_t IS TABLE OF NUMBER;
CREATE OR REPLACE PACKAGE testproc AS
PROCEDURE my_dyn_proc_test (p_num_array IN num_tab_t);
END;
/
CREATE OR REPLACE PACKAGE BODY testproc AS
PROCEDURE my_dyn_proc_test (p_num_array IN num_tab_t) AS
BEGIN
dbms_output.put_line(p_num_array.COUNT);
END;
END;
/
DECLARE
v_tab num_tab_t := num_tab_t(1, 10);
BEGIN
EXECUTE IMMEDIATE 'BEGIN testproc.my_dyn_proc_test(:1); END;' USING v_tab;
END;
答案 1 :(得分:0)
使用对象类型。对象类型对所有包都可见