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 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 提示符/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; 结尾;

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

4

2 回答 2

1

您不能在语句的子句中使用RECORD类型。如果你只想传递一个数字列表,为什么不直接使用类型变量呢?检查以下示例:USINGEXECUTE IMMEDIATETABLE 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;
于 2013-10-28T14:17:23.687 回答
0

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

于 2016-09-02T13:27:08.877 回答