Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Pipeline-Funktion, die eine andere Pipeline-Funktion aufruft

Der Sinn von Pipeline-Funktionen besteht darin, TABLE()-Funktionen zu füttern. Ich glaube nicht, dass es eine Möglichkeit gibt, das zu vermeiden. Leider müssen wir seine Ausgabe einer PL/SQL-Variablen zuweisen. Wir können einer verschachtelten Tabelle wie dieser nt := more_rows; keine Pipeline-Funktion zuweisen wegen

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

Also SELECT ... FROM TABLE() es muss sein.

Ich habe eine etwas andere Lösung für Ihre Überlegung. Ich weiß nicht, ob es Ihr zugrunde liegendes Problem löst.

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; 
/

Wie Sie sicher wissen (aber zum Nutzen anderer Suchender), wurde die MULTISET UNION-Syntax zum gemeinsamen Glomming von Sammlungen in Oracle 10g eingeführt.

Diese Version von GO() erzeugt dieselbe Ausgabe wie Ihre ursprüngliche Implementierung:

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

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

8 rows selected.

SQL>