我是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;
如你所见,我想传递这两个数组。
答案 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;