如何在plsql包规范中传递数组类型?

时间:2016-06-27 18:58:33

标签: oracle plsql

我是plsql的新手。我试图在同一个包下放两个脚本。这些脚本处理数组。如何将数组传递给过程?如果我要声明数组,我是在规范还是正文中做到的?我现在正在尝试这个但是它不起作用。

CREATE PACKAGE cop_cow_script AS

PROCEDURE COP_COW_DATALOAD_V2(arr_claims VARRAY(15000) OF VARCHAR2(10), arr_sql VARRAY(500) OF VARCHAR2(1000));

END cop_cow_script;

如你所见,我想传递这两个数组。

2 个答案:

答案 0 :(得分:5)

您需要在包规范中声明类型,并在过程声明中将它们用作参数类型:

CREATE OR REPLACE PACKAGE cop_cow_script AS

   TYPE arr_claims_t   IS VARRAY(15000) OF VARCHAR2(10);
   TYPE arr_sql_t       IS VARRAY(500) OF VARCHAR2(1000);

PROCEDURE COP_COW_DATALOAD_V2(arr_claims arr_claims_t, arr_sql arr_sql_t);

END cop_cow_script;
/

编辑 - 下面是一个包体的示例 - 该过程循环遍历它的第一个参数元素并使用DBMS_OUTPUT.PUT_LINE打印它们

PROCEDURE COP_COW_DATALOAD_V2(arr_claims arr_claims_t, arr_sql arr_sql_t)
IS
BEGIN 
   FOR i IN arr_claims.FIRST .. arr_claims.LAST
   LOOP
     DBMS_OUTPUT.PUT_LINE( arr_claims( i ) );
   END LOOP;
END;

END cop_cow_script;
/

那么你可以初始化它们并以这种方式传递给过程调用(这是一个匿名块,它声明了两个变量,初始化它们并调用将两个参数传递给它的过程:

DECLARE 
   my_array1 cop_cow_script.arr_claims_t := cop_cow_script.arr_claims_t();
   my_array2 cop_cow_script.arr_sql_t := cop_cow_script.arr_sql_t();
BEGIN
   my_array1.extend;
   my_array1( 1 ) := 'string 1';

   my_array2.extend;
   my_array2( 1 ) := 'string 2';

   cop_cow_script.COP_COW_DATALOAD_V2( my_array1, my_array2 );
END;
/

答案 1 :(得分:1)

首先,我很难想象你实际上想要使用PL / SQL varray而不是嵌套表或关联数组的情况。声明固定大小的集合确实没有任何好处。

无论您想要什么类型的集合类型,您都需要在程序包规范中或在SQL级别(取决于集合的类型)声明集合类型,与程序规范分开

CREATE PACKAGE cop_cow_script AS
  TYPE arr_claims IS varray(15000) of varchar(10);
  TYPE arr_sql    IS varray(500)   of varchar(1000);

  PROCEDURE COP_COW_DATALOAD_V2(p_claims arr_claims, 
                                p_sql arr_sql);

END cop_cow_script;