2016-11-22 15 views
4

配列を単一の引数としてシェルスクリプトからPL/SQLスクリプトに渡し、インデックスを使用してPL/SQLスクリプトの配列要素にアクセスしようとします。どうすればこれを達成できますか?plsqlスクリプトでの配列処理

答えて

3

これを行う方法の1つです。シェル配列をスペースで区切られた文字列としてストアドプロシージャに渡し、それをコレクションに変換します。これにはさまざまな方法があります。この例では、私は内蔵のapex_utilパッケージの機能を使用します。

ここでは定義して、シェルの配列渡し
create or replace procedure p1(p_list in varchar2) 
is 
    l_array apex_application_global.vc_arr2; 
begin 
    -- convert p_list varchar2 sting to a collection 
    l_array := apex_util.string_to_table(p_list, ' '); 
    -- iterate through the collection and print each element 
    for i in l_array.first..l_array.last loop 
    dbms_output.put_line(l_array(i)); 
    end loop; 
end; 

array[0] = 'a' 
array[1] = 'b' 
array[2] = 'c' 

sqlplus testlab/[email protected] <<EOF 
set serveroutput on 
exec p1('${array[*]}'); 
EOF 

結果:

SQL> exec p1('a b c'); 
a 
b 
c 

PL/SQL procedure successfully completed 
+0

あなたの2番目のコードスニペットは、シェルスクリプトではなく、 '$'は、シェルプロンプトを示し、対話型セッションが(それは私のカップルを取ったことは注目に値するかもしれません'$ array [0]'が間違って型付き '$ array [0]'のように見えるので、それは私の愚かさかもしれません。 –

+0

bashでは、より単純な方法で配列を定義することもできます: 'array =(a b c)' –

+0

@FrankSchmittシェルプロンプトを削除しました。はい、配列のインデックスに入力ミスがありました。ありがとうございます。 –

1

をここで

は、プロシージャ(関数であるかもしれない、それはあなた次第です)です下記のOracleの方法をご覧ください。私は、collection(varcharの配列)と定義されたOracleを使用しました。独自のコレクションを作成して同様の方法で渡すことができます。

--- using oracle defined collection for varchar2 
CREATE OR REPLACE procedure array_list_pass_proc(v_acct5 sys.odcivarchar2list) 
as 

begin 

for i in 1..v_acct5.count -- Passing the array list to loop 
loop 
    --Printing its element 
    dbms_output.put_line(v_acct5(i)); 

end loop; 

end; 
/

出力:

SQL> execute array_list_pass_proc(sys.odcivarchar2list('0001','0002','0003')); 
0001 
0002 
0003 

PL/SQL procedure successfully completed. 
+1

質問をもう一度読んでください - OPは配列を受け入れるプロシージャの作成方法ではなく、シェルスクリプト*からPL/SQLに配列*を渡す方法について質問しました。 –