आपके फ़ंक्शन data_type_1
लौटा रहे हैं , और तालिका संग्रह उसका भी उपभोग करने का प्रयास कर रहा है। लेकिन दोनों को एक संग्रह प्रकार की आवश्यकता होती है, भले ही आप उनसे केवल एक ही मान वापस करने की अपेक्षा करते हैं (जिस स्थिति में बहुत अधिक पाइपलाइनिंग नहीं है)। आप संग्रह प्रकार को सीधे पाइप नहीं कर सकते हैं, आप संग्रह के सदस्य को पाइप करते हैं। तो data_type_1
एक अदिश या वस्तु/रिकॉर्ड प्रकार होना चाहिए, और आपको एक अन्य प्रकार की आवश्यकता है जो उनमें से एक संग्रह है।
create type data_type_1 as object (x number, y number)
/
create type table_type_1 as table of data_type_1
/
create or replace package xyz AS
function main_xyz return table_type_1 pipelined;
function sub_func return table_type_1 pipelined;
function sub_func1 return table_type_1 pipelined;
end xyz;
/
create or replace package body xyz as
function main_xyz return table_type_1 pipelined is
begin
--code
for rec in (select * from table(sub_func)) loop
pipe row(data_type_1(rec.x, rec.y));
end loop;
for rec in (select * from table(sub_func1)) loop
pipe row(data_type_1(rec.x, rec.y));
end loop;
end;
function sub_func return table_type_1 pipelined is
def data_type_1;
begin
--code
pipe row(def); --def is data_type_1
end sub_func;
function sub_func1 return table_type_1 pipelined is
abc data_type_1;
begin
--code
loop
pipe row (abc); --abc is data_type_1
end loop;
end sub_func1;
end xyz;
/
इसलिए मैंने आपके मौजूदा data_type_1
. का एक टेबल प्रकार जोड़ा है , और इसके बजाय उस तालिका प्रकार को वापस करने के लिए फ़ंक्शन परिभाषाओं को बदल दिया। pipe row
अभी भी data_type_1
uses का उपयोग करता है - प्रत्येक तालिका प्रकार में एक पंक्ति है। आपके लूप को अपने कर्सर के लिए एक क्वेरी की आवश्यकता है, न कि table()
. पर सीधे कॉल करने के लिए , तो मैंने उसे भी बदल दिया है। और pipe row(sub_func);
किसी क्वेरी पर भी ऐसा ही लूप होना चाहिए।
आपने इसे केवल PL/SQL के रूप में टैग किया है, लेकिन क्योंकि आप main_xyz
को कॉल करने का इरादा कर सकते हैं सादे SQL से, और क्योंकि आप उन लूपों में SQL संदर्भ से उप-फ़ंक्शंस को कॉल कर रहे हैं, data_type_1
और table_type_1
पीएल/एसक्यूएल के बजाय स्कीमा स्तर पर बनाने की जरूरत है। (इसमें 12c में थोड़ा बदल गया
लेकिन यहां मदद करने के लिए पर्याप्त नहीं है)।
यदि आप उन्हें पैकेज विनिर्देश में घोषित पीएल/एसक्यूएल प्रकार के रूप में रखना चाहते हैं, तो आप गैर-पीएल/एसक्यूएल संदर्भ से फ़ंक्शन को कॉल नहीं कर सकते हैं, और आपको लूप को फ़ंक्शन में कॉल के साथ बदलना होगा इसके बाद लौटाए गए संग्रह पर एक पुनरावृत्ति होती है।