首页 文章

传递pl / sql记录作为程序的争论

提问于
浏览
2

如何将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 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 回答

  • 1

    您不能在 EXECUTE IMMEDIATE 语句的 USING 子句中使用 RECORD 类型 . 如果您只想传递一个数字列表,为什么不只使用 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
    

    Edit

    试试这个:

    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;
    
  • 0

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

相关问题