2012-10-24 18 views
5

Mam funkcji Oracle PLSQL, która akceptuje tablicy:Przełęcz 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; 
/

chcę, aby to zrobić:

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

jakieś pomysły? Z góry dzięki.

+1

Czy istnieje powód, dla którego funkcja musi akceptować tablicę? Czy może zaakceptować kursor? Byłoby to na ogół bardziej sensowne, jeśli chcesz przekazać wynik instrukcji SELECT. Jeśli bierzesz wyniki zapytania, które zwraca 10 wierszy i generuje pojedynczy wynik zagregowany, czy na pewno nie chcesz zapisać niestandardowej funkcji agregującej? –

Odpowiedz

5

Można to robić tak długo, jak tablica jest obiekt SQL (testowane na 11gR2, powinien działać na 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. 

Można wywołać tę funkcję z COLLECT zagregowanej funkcji:

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 

W 9i (a może nawet 8i, nie można przetestować teraz), zebrać nie istnieją, ale mogłeś używane MULTISET zamiast:

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 
Powiązane problemy