Смисълът на конвейерните функции е да захранват функциите TABLE(). Не мисля, че има начин да го избегнем. За съжаление трябва да присвоим изхода му на PL/SQL променлива. Не можем да присвоим конвейерна функция на вложена таблица като тази nt := more_rows;
поради
PLS-00653: aggregate/table functions are not allowed in PL/SQL scope
Така че SELECT ... FROM TABLE()
трябва да бъде.
Имам малко по-различно решение за вашето внимание. Не знам дали решава основния ви проблем.
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;
/
Както съм сигурен, че знаете (но в полза на други търсачи), синтаксисът MULTISET UNION за събиране на колекции заедно беше въведен в Oracle 10g.
Тази версия на GO() произвежда същия резултат като първоначалната ви реализация:
SQL> select * from table( tq84_pipelined.go)
2 /
COLUMN_VALUE
-------------------------
Mein
Name
ist
Eugen,
ich
weiss
von
nichts.
8 rows selected.
SQL>