plsql脚本中的数组处理

时间:2016-11-22 05:29:17

标签: oracle shell plsql

我想将一个数组从shell脚本传递给我的PL / SQL脚本作为单个参数,然后尝试使用索引访问PL / SQL脚本中的数组元素。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分: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;

这里我们定义并传递shell数组:

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

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

结果:

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

PL/SQL procedure successfully completed

答案 1 :(得分: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.