Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

नेस्टेड पाइपलाइन समारोह

आपके फ़ंक्शन 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 में थोड़ा बदल गया लेकिन यहां मदद करने के लिए पर्याप्त नहीं है)।

यदि आप उन्हें पैकेज विनिर्देश में घोषित पीएल/एसक्यूएल प्रकार के रूप में रखना चाहते हैं, तो आप गैर-पीएल/एसक्यूएल संदर्भ से फ़ंक्शन को कॉल नहीं कर सकते हैं, और आपको लूप को फ़ंक्शन में कॉल के साथ बदलना होगा इसके बाद लौटाए गए संग्रह पर एक पुनरावृत्ति होती है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एक संग्रहित खरीद चलाने के लिए हाइबरनेट 4 में देशी ओरेकल कनेक्शन के लिए एक हैंडल प्राप्त करना

  2. ODP.NET 2.111 और ODP.NET 4.112 को एक ही मशीन में एक साथ कैसे स्थापित करें जबकि दोनों एक ही डेटाबेस सर्वर की ओर इशारा करते हैं

  3. Oracle SQL:तालिका नामों के स्थान पर उपयोग किए जाने वाले चर

  4. ORACLE प्रोग्रामिंग ऑब्जेक्ट परिभाषाएँ प्राप्त करना

  5. SQL Oracle में रोलिंग 90 दिन की तारीख विंडो