Pointen med pipelinede funktioner er at føde TABLE()-funktioner. Jeg tror ikke, der er nogen måde at undgå det på. Desværre er vi nødt til at tildele dens output til en PL/SQL-variabel. Vi kan ikke tildele en pipelinet funktion til en indlejret tabel som denne nt := more_rows;
på grund af
PLS-00653: aggregate/table functions are not allowed in PL/SQL scope
Så SELECT ... FROM TABLE()
det skal være.
Jeg har en lidt anden løsning til din overvejelse. Jeg ved ikke, om det løser dit underliggende problem.
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;
/
Som jeg er sikker på du er klar over (men til gavn for andre søgende) blev MULTISET UNION-syntaksen for glomming-samlinger sammen introduceret i Oracle 10g.
Denne version af GO() producerer det samme output som din oprindelige implementering:
SQL> select * from table( tq84_pipelined.go)
2 /
COLUMN_VALUE
-------------------------
Mein
Name
ist
Eugen,
ich
weiss
von
nichts.
8 rows selected.
SQL>