パイプライン関数のポイントは、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;
/
ご存じのとおり(ただし、他のシーカーの利益のために)、コレクションをまとめてグロミングするためのMULTISETUNION構文がOracle10gで導入されました。
このバージョンのGO()は、元の実装と同じ出力を生成します。
SQL> select * from table( tq84_pipelined.go)
2 /
COLUMN_VALUE
-------------------------
Mein
Name
ist
Eugen,
ich
weiss
von
nichts.
8 rows selected.
SQL>