2012-10-24 123 views
5

我有一個接受一個數組PLSQL Oracle函數:通select語句到Oracle PLSQL

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行並生成單個聚合結果的查詢結果,那麼您確定不想編寫自定義聚合函數嗎? –

回答

5

你可以做到這一點,只要陣列是一個SQL對象(在11gR2的測試,應該萬兆工作):

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,現在不能測試),收取不存在,但你也可以使用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