配列がSQLオブジェクトである限り、これを行うことができます(11gR2でテストされ、10gで動作するはずです):
SQL> create or replace type num_array is table of number;
2 /
Type created.
SQL> CREATE OR REPLACE FUNCTION give_me_an_arrays (p_array IN num_array)
2 RETURN VARCHAR2
3 IS
4 x VARCHAR2 (512);
5 BEGIN
6 x := '';
7 FOR i IN 1 .. p_array.COUNT
8 LOOP
9 DBMS_OUTPUT.put_line (p_array (i));
10 END LOOP;
11
12 RETURN x;
13 END;
14 /
Function created.
COLLECT集計関数でこの関数を呼び出すことができます。
SQL> SELECT give_me_an_arrays((SELECT cast(collect(rownum) AS num_array) value
2 FROM dual
3 CONNECT BY level <= 10)) arr
4 FROM dual;
ARR
--------------------------------------------------------------------------------
1
2
[..]
10
9i (そしておそらく 8i でも、今はテストできません) では、COLLECT は存在しませんでしたが、代わりにMULTISETを使用できました。
SQL> SELECT give_me_an_arrays(cast(MULTISET(SELECT rownum value
2 FROM dual
3 CONNECT BY level <= 10) AS num_array)
4 ) arr
5 FROM dual;
ARR
--------------------------------------------------------------------------------
1
2
[..]
10