पाइपलाइन किए गए कार्यों का बिंदु तालिका () कार्यों को खिलाना है। मुझे नहीं लगता कि इससे बचने का कोई उपाय है। दुर्भाग्य से हमें इसके आउटपुट को 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>