我试图传递一个(varchar)数据到Oracle过程的数组。 Oracle过程将从sql * Plus或其他PL / sql过程中调用,如下所示:
BEGIN pr_perform_task('1','2','3','4'); END;
pr_perform_task将读取每个输入参数并执行任务。
我不知道如何我可以实现这一点。我第一个想法是使用类型varray的输入参数,但我得到错误:PLS-00201:标识符’VARRAY’必须声明错误,当过程定义看起来像这样:
创建或更换过程PR_DELETE_RECORD_VARRAY(P_ID VARRAY)IS
总而言之,如何将数据作为数组传递,让SP循环遍历每个参数并执行任务?
我使用Oracle 10gR2作为我的数据库。
这是一种方法:
sql> set serveroutput on sql> CREATE OR REPLACE TYPE MyType AS VARRAY(200) OF VARCHAR2(50); 2 / Type created sql> CREATE OR REPLACE PROCEDURE testing (t_in MyType) IS 2 BEGIN 3 FOR i IN 1..t_in.count LOOP 4 dbms_output.put_line(t_in(i)); 5 END LOOP; 6 END; 7 / Procedure created sql> DECLARE 2 v_t MyType; 3 BEGIN 4 v_t := MyType(); 5 v_t.EXTEND(10); 6 v_t(1) := 'this is a test'; 7 v_t(2) := 'A second test line'; 8 testing(v_t); 9 END; 10 / this is a test A second test line
要扩展我对@ dcp的回答的评论,下面是如何实现提出的解决方案,如果你想使用关联数组:
sql> CREATE OR REPLACE PACKAGE p IS 2 TYPE p_type IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER; 3 4 PROCEDURE pp (inp p_type); 5 END p; 6 / Package created sql> CREATE OR REPLACE PACKAGE BODY p IS 2 PROCEDURE pp (inp p_type) IS 3 BEGIN 4 FOR i IN 1..inp.count LOOP 5 dbms_output.put_line(inp(i)); 6 END LOOP; 7 END pp; 8 END p; 9 / Package body created sql> DECLARE 2 v_t p.p_type; 3 BEGIN 4 v_t(1) := 'this is a test of p'; 5 v_t(2) := 'A second test line for p'; 6 p.pp(v_t); 7 END; 8 / this is a test of p A second test line for p PL/sql procedure successfully completed sql>
这种交易创建一个独立的Oracle TYPE(不能是一个关联数组),要求定义一个可以被所有人看到的包,以便它定义的TYPE可以被所有人使用。