Oracle में sys_refcursor का उपयोग कैसे और कब करें


जवाबों:


10

कर्सर क्वेरी के लिए निर्धारित परिणाम के लिए एक संकेतक है। लौटकर 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एक जेनेरिक "ओपन क्वैरी" फ़ंक्शन बनाने के लिए उपयोग कर रहे हैं, तो ऊपर जैसा आप शायद कुछ गलत कर रहे हैं!


@ क्रिस ... आपका उदाहरण फ़ंक्शन "गलत क्यों है?"
जॉनी वू

2
@JohnnyWu एक "मुझे कुछ भी प्राप्त करें" फ़ंक्शन को प्रबंधित करना कठिन होगा। आप यह सुनिश्चित करने के लिए परीक्षण कैसे करते हैं कि आपको सभी मामलों में सही परिणाम मिले हैं? सुरक्षा के बारे में क्या? यदि आप एक रूपरेखा का निर्माण कर रहे हैं तो यह आवश्यक हो सकता है। लेकिन सामान्य व्यापार तर्क के लिए, अलग होना get_empsऔर get_deptsकार्य करना बेहतर है
क्रिस सैक्सन

1

संभावनाओं के उदाहरण के रूप में: क्योंकि यह 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 की पूरी शक्ति रखता है। और परिणाम सेट करने वाले ग्राहक कोई भी समझदार नहीं है। और आंतरिक तालिका की परिभाषा को बदलना एक प्रबंधन तालिका से डेटाबेस तालिका को बदलने से आसान है।

जैस्पर जैसे रिपोर्ट-जनरेटर्स का उपयोग करते समय, आप एसक्यूएल को रिपोर्ट से बाहर और डेटाबेस में धकेल सकते हैं, और फॉर्मेटिंग पर ध्यान केंद्रित करने के लिए रिपोर्ट-साइड को छोड़कर, रिकॉर्डसेट प्राप्त करने के लिए प्रक्रिया को कॉल कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.