(varchar
)データの配列をOracleプロシージャに渡そうとしています。 Oracleプロシージャは、SQL * Plusまたは別のPL/SQLプロシージャから次のように呼び出されます。
_BEGIN
pr_perform_task('1','2','3','4');
END;
_
_pr_perform_task
_は、各入力パラメーターを読み取り、タスクを実行します。
これをどのように達成できるかはわかりません。最初に考えたのは、タイプvarray
の入力パラメーターを使用することでしたが、プロシージャ定義が次のようになったときに_Error: PLS-00201: identifier 'VARRAY' must be declared
_エラーが発生します。
CREATE OR REPLACE PROCEDURE PR_DELETE_RECORD_VARRAY(P_ID VARRAY) IS
まとめると、データを配列として渡すには、SPが各パラメーターをループしてタスクを実行できるようにしますか?
データベースとしてOracle 10gR2を使用しています。
これはそれを行う1つの方法です。
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をすべてのユーザーが使用できるように、すべてのユーザーが参照できるパッケージの定義を要求します。
パラメーターのタイプがすべて同じ場合(varchar2
たとえば)、次のようなパッケージを作成できます。
CREATE OR REPLACE PACKAGE testuser.test_pkg IS
TYPE assoc_array_varchar2_t IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
PROCEDURE your_proc(p_parm IN assoc_array_varchar2_t);
END test_pkg;
CREATE OR REPLACE PACKAGE BODY testuser.test_pkg IS
PROCEDURE your_proc(p_parm IN assoc_array_varchar2_t) AS
BEGIN
FOR i IN p_parm.first .. p_parm.last
LOOP
dbms_output.put_line(p_parm(i));
END LOOP;
END;
END test_pkg;
次に、それを呼び出すには、配列を設定して渡す必要があります。
DECLARE
l_array testuser.test_pkg.assoc_array_varchar2_t;
BEGIN
l_array(0) := 'hello';
l_array(1) := 'there';
testuser.test_pkg.your_proc(l_array);
END;
/