如何将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 DECLARE v_tab testproc.num_tab_t:= testproc.num_tab_t(1,10)调用的; BEGIN EXECUTE IMMEDIATE'BEGIN testproc.my_dyn_proc_test(:1);结束;'使用v_tab;结束;
这不会起作用 . 这显示错误 . 我不在我的工作站,因此现在无法重现该问题 .
2 回答
您不能在
EXECUTE IMMEDIATE
语句的USING
子句中使用RECORD
类型 . 如果您只想传递一个数字列表,为什么不只使用TABLE OF NUMBER
类型的变量?检查以下示例:输出:
Edit
试试这个:
使用对象类型 . 对象类型对所有包都可见