2012-10-24 4 views
5

私は配列を受け入れPLSQLオラクル機能を持​​っている:パスselect文

CREATE OR REPLACE FUNCTION CM.give_me_an_arrays (p_array IN num_array) 
RETURN VARCHAR2 
IS 
x VARCHAR2 (512); 
BEGIN 
x := ''; 
    FOR i IN 1 .. p_array.COUNT 
    LOOP 
     DBMS_OUTPUT.put_line (p_array (i)); 
    END LOOP; 

    RETURN x; 
END; 
/

私はそれをしたい:

select CM.give_me_an_arrays(select COM.COM_ID 
           from CM.XLP_SE_COMPONENT com 
          where rownum < 10) 
    from dual 

任意のアイデア? ありがとうございます。

+1

関数が配列を受け入れる必要があるのはなぜですか?代わりにカーソルを受け入れることができますか? 'SELECT'文の結果を渡したいのであれば、それは一般的に意味があります。 10行を返して1つの集計結果を生成するクエリの結果を取得する場合は、代わりにカスタム集計関数を作成しないことを確認してください。 –

答えて

5

あなたは(11gR2の上でテストされ、10グラムで動作するはずです)限り、配列は、SQLオブジェクトであるとして、これを行うことができます。

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