Oracle
 sql >> Database >  >> RDS >> Oracle

Funzione pipeline che chiama un'altra funzione pipeline

Lo scopo delle funzioni pipeline è alimentare le funzioni TABLE(). Non credo ci sia modo per evitarlo. Sfortunatamente dobbiamo assegnare il suo output a una variabile PL/SQL. Non possiamo assegnare una funzione pipeline a una tabella nidificata come questa nt := more_rows; a causa di

PLS-00653: aggregate/table functions are not allowed in PL/SQL scope

Quindi SELECT ... FROM TABLE() deve essere.

Ho una soluzione leggermente diversa per la tua considerazione. Non so se risolve il tuo problema di fondo.

create or replace package body tq84_pipelined as 

    function more_rows return tq84_line pipelined is 
    begin 

        pipe row('ist'); 
        pipe row('Eugen,'); 

        return; 

    end more_rows; 

    function go return tq84_line pipelined is 
        nt1 tq84_line;
        nt2 tq84_line;
        nt3 tq84_line;
        nt0 tq84_line;
    begin 

        nt1 := tq84_line('Mein','Name'); 

        select * 
        bulk collect into nt2
        from table(more_rows);

        nt3 := tq84_line('ich','weiss','von','nichts.'); 

        nt0 := nt1 multiset union nt2 multiset union nt3; 

        for i in nt0.first..nt0.last
        loop 
          pipe row(nt0(i)); 
        end loop; 

        return;

    end go; 

end tq84_pipelined; 
/

Come sicuramente saprai (ma a beneficio di altri ricercatori) la sintassi MULTISET UNION per le raccolte glomming insieme è stata introdotta in Oracle 10g.

Questa versione di GO() produce lo stesso output dell'implementazione originale:

SQL> select * from table( tq84_pipelined.go)
  2  /

COLUMN_VALUE
-------------------------
Mein
Name
ist
Eugen,
ich
weiss
von
nichts.

8 rows selected.

SQL>