एक अनाम ब्लॉक कुछ भी वापस नहीं कर सकता। आप ब्लॉक के अंदर एक संग्रह प्रकार या रेफरी कर्सर सहित बाइंड वैरिएबल को मान असाइन कर सकते हैं। लेकिन संग्रह को ब्लॉक के बाहर परिभाषित, साथ ही घोषित करना होगा। यही है, यह एक प्रकार होना चाहिए जिसे आप सादे एसक्यूएल में उपयोग कर सकते हैं, पीएल/एसक्यूएल में परिभाषित कुछ नहीं। फिलहाल आप एक पीएल/एसक्यूएल प्रकार का उपयोग कर रहे हैं जिसे ब्लॉक के भीतर परिभाषित किया गया है, और एक वैरिएबल जिसे ब्लॉक के भीतर भी घोषित किया गया है - इसलिए यह क्लाइंट के दायरे से बाहर है, और इसके बाहर वैध प्रकार भी नहीं होगा . (इसे शुरू करने की भी आवश्यकता नहीं है, लेकिन यह एक छोटी सी समस्या है)।
वास्तव में इसका उपभोग कैसे किया जाएगा, इस पर निर्भर करते हुए, एक विकल्प रेफरी कर्सर का उपयोग करना है, और आप इसे SQL*Plus या SQL Developer के माध्यम से variable
के साथ घोषित और प्रदर्शित कर सकते हैं। और print
आदेश। उदाहरण के लिए:
variable rc sys_refcursor
begin
open :rc for ( select ... /* your cursor statement */ );
end;
/
print rc
आप क्लाइंट एप्लिकेशन से कुछ ऐसा ही कर सकते हैं, उदा। एक रेफरी कर्सर या एक आउट पैरामीटर के साथ एक प्रक्रिया लौटाने वाला एक फ़ंक्शन है जो एक रेफ कर्सर है, और इसे एप्लिकेशन से बांधें। फिर परिणाम सेट के रूप में रेफ कर्सर पर पुनरावृति करें। लेकिन विवरण आपके एप्लिकेशन द्वारा उपयोग की जा रही भाषा पर निर्भर करता है।
एक अन्य विकल्प एक पाइपलाइन फ़ंक्शन है जो एक तालिका प्रकार देता है - फिर से SQL स्तर पर परिभाषित किया जाता है (create type
के साथ) ) पीएल/एसक्यूएल में नहीं - जो एक बार में लौटाए गए संग्रह की तुलना में कम संसाधनों का उपभोग कर सकता है।
लेकिन मुझे सवाल करना होगा कि आप ऐसा क्यों कर रहे हैं। आपने कहा "बाद के बैचों के लिए खुदाई करने में काफी अधिक समय लगता है", ऐसा लगता है कि आप अपनी क्वेरी में एक पेजिंग तंत्र का उपयोग कर रहे हैं, एक पंक्ति संख्या उत्पन्न कर रहे हैं और फिर उसके भीतर 100 की सीमा चुन रहे हैं। यदि आपका क्लाइंट/एप्लिकेशन सभी पंक्तियों को प्राप्त करना चाहता है तो एकल क्वेरी निष्पादन करना आसान होगा लेकिन लाने परिणाम बैचों में सेट किया गया।
दुर्भाग्य से आवेदन के बारे में किसी भी जानकारी के बिना यह सिर्फ अटकलें हैं...