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

qai*_*pak 0 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;
Run Code Online (Sandbox Code Playgroud)

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

kro*_*lko 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;
/
Run Code Online (Sandbox Code Playgroud)

编辑 - 下面是一个包体的示例 - 该过程循环遍历其第一个参数的元素,并使用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;
/
Run Code Online (Sandbox Code Playgroud)

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

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;
/
Run Code Online (Sandbox Code Playgroud)