क्या कोई मुझे इस बारे में एक छोटी सी व्याख्या दे सकता है कि किसी को sys_refcursor का उपयोग कब और कैसे करना चाहिए?
क्या कोई मुझे इस बारे में एक छोटी सी व्याख्या दे सकता है कि किसी को sys_refcursor का उपयोग कब और कैसे करना चाहिए?
जवाबों:
कर्सर क्वेरी के लिए निर्धारित परिणाम के लिए एक संकेतक है। लौटकर sys_refcursor
आप ग्राहक को क्वेरी से कई या कुछ पंक्तियों को लाने की अनुमति देते हैं, जैसे कि इसकी आवश्यकता होती है। स्टेटफुल एप्लिकेशन में यह परिणाम के माध्यम से पृष्ठ पर उपयोग किया जा सकता है।
एक पीएल / एसक्यूएल फ़ंक्शन लिखने की तुलना में एक कर्सर अधिक लचीलेपन की अनुमति दे सकता है जो एक सरणी देता है क्योंकि यह पूरी तरह से क्लाइंट के लिए है कि कितने पंक्तियों को लाना है और कब रोकना है। उस ने कहा, मुझे कई मामले नहीं मिले हैं जहां यह अतिरिक्त लचीलापन उपयोगी है।
यह ध्यान देने योग्य है कि sys_refcursor
कमजोर रूप से टाइप किया गया है, इसलिए आप पॉइंटर्स को उन प्रश्नों पर वापस ला सकते हैं, जो न केवल अलग हैं या जहां क्लॉस हैं, बल्कि अलग-अलग संख्या और प्रकार के कॉलम भी हैं। वैकल्पिक रूप से आप दृढ़ता से टाइप किए गए कर्सर का उपयोग कर सकते हैं जहां परिणाम सेट में कॉलम तय किए गए हैं।
यह आपको ऐसे कार्य लिखने में सक्षम बनाता है जो विभिन्न प्रश्नों को लौटाते हैं, जैसे:
create function get_data ( type varchar2 ) return sys_refcursor as
ret_cur sys_refcursor;
begin
if type = 'EMP' then
open ret_cur for select * from emp;
elsif type = 'DEPT' then
open ret_cur for select * from dept;
end if;
return ret_cur;
end;
हालाँकि, यदि आप sys_refcursor
एक जेनेरिक "ओपन क्वैरी" फ़ंक्शन बनाने के लिए उपयोग कर रहे हैं, तो ऊपर जैसा आप शायद कुछ गलत कर रहे हैं!
get_emps
और get_depts
कार्य करना बेहतर है
संभावनाओं के उदाहरण के रूप में: क्योंकि यह pl / sql पीछे है, कोई एक पंक्ति को दर्शाने के लिए किसी वस्तु को परिभाषित कर सकता है, उन वस्तुओं के pl / sql तालिका को परिभाषित कर सकता है,
create type T_MY_TABLE as table of t_my_object;
और अंत के साथ
OPEN p_recordset FOR select * from table( v_my_table );
इसलिए मानगो का निर्माण करने के बजाय, डेटाबेस तालिका पर अक्सर घने और / या गूढ़ प्रत्यक्ष प्रश्न, कोई आंतरिक तालिका बना सकता है और उसे आबाद करने के लिए pl / sql की पूरी शक्ति रखता है। और परिणाम सेट करने वाले ग्राहक कोई भी समझदार नहीं है। और आंतरिक तालिका की परिभाषा को बदलना एक प्रबंधन तालिका से डेटाबेस तालिका को बदलने से आसान है।
जैस्पर जैसे रिपोर्ट-जनरेटर्स का उपयोग करते समय, आप एसक्यूएल को रिपोर्ट से बाहर और डेटाबेस में धकेल सकते हैं, और फॉर्मेटिंग पर ध्यान केंद्रित करने के लिए रिपोर्ट-साइड को छोड़कर, रिकॉर्डसेट प्राप्त करने के लिए प्रक्रिया को कॉल कर सकते हैं।