Het punt van pijplijnfuncties is om TABLE()-functies te voeden. Ik denk niet dat er een manier is om het te vermijden. Helaas moeten we de uitvoer ervan toewijzen aan een PL/SQL-variabele. We kunnen geen pijplijnfunctie toewijzen aan een geneste tabel zoals deze nt := more_rows;
vanwege
PLS-00653: aggregate/table functions are not allowed in PL/SQL scope
Dus SELECT ... FROM TABLE()
het moet wel.
Ik heb een iets andere oplossing voor uw overweging. Ik weet niet of het je onderliggende probleem oplost.
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;
/
Zoals u ongetwijfeld weet (maar ten behoeve van andere zoekers), is de MULTISET UNION-syntaxis voor het samenvoegen van collecties geïntroduceerd in Oracle 10g.
Deze versie van GO() produceert dezelfde uitvoer als uw oorspronkelijke implementatie:
SQL> select * from table( tq84_pipelined.go)
2 /
COLUMN_VALUE
-------------------------
Mein
Name
ist
Eugen,
ich
weiss
von
nichts.
8 rows selected.
SQL>