2012-10-24 17 views
5

Ich habe eine PLSQL Oracle-Funktion, die ein Array akzeptiert:Pass select-Anweisung zu 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; 
/

Ich möchte, dies zu tun:

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

Irgendwelche Ideen? Vielen Dank im Voraus.

+1

Gibt es einen Grund, dass die Funktion ein Array akzeptieren muss? Könnte es stattdessen einen Cursor akzeptieren? Dies wäre in der Regel sinnvoller, wenn Sie das Ergebnis einer SELECT-Anweisung übergeben möchten. Wenn Sie die Ergebnisse einer Abfrage verwenden, die 10 Zeilen zurückgibt und ein einzelnes Gesamtergebnis erzeugt, sind Sie sicher, dass Sie stattdessen keine benutzerdefinierte Aggregatfunktion schreiben möchten? –

Antwort

5

Sie dies tun können, solange das Array ist ein SQL-Objekt (auf 11gR2 getestet, sollte auf 10g arbeiten):

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 
:

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. 

Sie diese Funktion mit der COLLECT Aggregatfunktion aufrufen

In 9i (und vielleicht sogar 8i, kann jetzt nicht testen), COLLECT gab es nicht, aber sie MULTISET stattdessen verwendet haben könnte:

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