将pl / sql记录作为参数传递给procedure

时间:2013-10-28 13:58:01

标签: oracle plsql

如何将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 loopdbms_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;

这不起作用。这显示错误。我不在我的工作站,因此现在无法重现该问题。

2 个答案:

答案 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)

使用对象类型。对象类型对所有包都可见