2016-11-22 70 views
4

我想從shell腳本將數組作爲單個參數傳遞給我的PL/SQL腳本,然後嘗試使用索引訪問PL/SQL腳本中的數組元素。我怎樣才能做到這一點?plsql腳本中的數組處理

回答

3

以下是一種方法。將shell數組作爲空格分隔的字符串傳遞給存儲過程,然後將其轉換爲集合 - 有許多方法可以實現。在這個例子中,我使用string_to_table()函數的內置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

你的第二代碼片段是不是一個shell腳本,但其中'$'表示shell提示符下交互式會話這可能是值得一提的(我花了一對夫婦因爲'$ array [0]'看起來像一個錯誤類型的'$ array [0]',但這可能就是我的愚蠢)。 –

+0

在bash中,你也可以用更簡單的方式定義數組:'array =(a b c)' –

+0

@FrankSchmitt Shell提示符被刪除,Frank。是的,數組索引中存在拼寫錯誤,謝謝。 –

1

請看下面如何在Oracle中做到這一點。我用了一個Oracle定義的collection(varchar數組)。您可以創建自己的收藏集並以類似的方式傳遞它。

--- 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詢問如何將數組*從shell腳本*傳遞到PL/SQL,而不是如何創建一個接受數組的過程。 –