Oracle PL/SQL कर्सर: उदाहरण के साथ इंप्लिसिट, एक्सप्लिसिट, फॉर लूप

⚡ स्मार्ट सारांश

कर्सर में Oracle PL/SQL कर्सर, SQL स्टेटमेंट द्वारा लौटाई गई पंक्तियों को धारण करने वाले संदर्भ क्षेत्र के पॉइंटर होते हैं। ये दो प्रकार के होते हैं: इम्प्लिसिट कर्सर, जो DML के लिए स्वचालित रूप से बनाए जाते हैं, और एक्सप्लिसिट कर्सर, जिन्हें प्रोग्रामर द्वारा घोषित और नियंत्रित किया जाता है।

  • 📍 संदर्भ क्षेत्र: एक कर्सर उस संदर्भ क्षेत्र की ओर इंगित करता है जो एक SQL कथन और उसके द्वारा लौटाए गए सक्रिय सेट को संग्रहीत करता है।
  • ⚙️ अंतर्निहित कर्सर: Oracle प्रत्येक डीएमएल स्टेटमेंट और सिंगल-रो सेलेक्ट इनटू के लिए स्वचालित रूप से एक अंतर्निहित कर्सर खुलता है।
  • स्पष्ट कर्सर: एक प्रोग्रामर पूर्ण नियंत्रण के लिए एक स्पष्ट कर्सर घोषित करता है, खोलता है, प्राप्त करता है और बंद करता है।
  • 🔎 कर्सर विशेषताएँ: %FOUND, %NOTFOUND, %ISOPEN और %ROWCOUNT सबसे हालिया ऑपरेशन की स्थिति की रिपोर्ट करते हैं।
  • 🔁 कर्सर फॉर लूप: एक FOR लूप बिना किसी मैन्युअल चरण की आवश्यकता के, कर्सर को अप्रत्यक्ष रूप से खोलता है, डेटा प्राप्त करता है और बंद करता है।
  • 🤖 एआई सहायता: GitHub Copilot जैसे AI सहायक कर्सर लूप का ड्राफ्ट तैयार करते हैं और बंद न हुए कर्सर को चिह्नित करते हैं।

Oracle PL/SQL कर्सर, इम्प्लिसिट, एक्सप्लिसिट और फॉर लूप

PL/SQL में कर्सर क्या है?

कर्सर, संदर्भ क्षेत्र का एक सूचक होता है। Oracle यह किसी प्रक्रिया के लिए एक संदर्भ क्षेत्र बनाता है एसक्यूएल यह कथन है, और इस क्षेत्र में कथन से संबंधित सभी जानकारी शामिल है।

PL / SQL यह प्रोग्रामर को कर्सर के माध्यम से कॉन्टेक्स्ट एरिया को नियंत्रित करने की अनुमति देता है। कर्सर SQL स्टेटमेंट द्वारा लौटाई गई पंक्तियों को रखता है, और कर्सर द्वारा रखी गई पंक्तियों के समूह को सक्रिय समूह कहा जाता है। इन कर्सरों को नाम भी दिया जा सकता है ताकि कोड में किसी अन्य स्थान से उन्हें संदर्भित किया जा सके।

कर्सर दो प्रकार के होते हैं:

  • अंतर्निहित कर्सर
  • स्पष्ट कर्सर

अंतर्निहित कर्सर

जब भी कोई डीएमएल ऑपरेशन जब डेटाबेस में कोई ऑपरेशन होता है, तो एक इम्प्लिसिट कर्सर बनता है जिसमें उस विशेष ऑपरेशन से प्रभावित पंक्तियाँ होती हैं। इन कर्सरों को नाम नहीं दिया जा सकता है, इसलिए इन्हें कोड में किसी अन्य स्थान से नियंत्रित या संदर्भित नहीं किया जा सकता है। हम केवल कर्सर एट्रिब्यूट्स के माध्यम से सबसे हाल के कर्सर को ही संदर्भित कर सकते हैं।

स्पष्ट कर्सर

प्रोग्रामर को अपने डीएमएल ऑपरेशन्स को निष्पादित करने और उस पर अधिक नियंत्रण प्राप्त करने के लिए एक नामित संदर्भ क्षेत्र बनाने की अनुमति है। स्पष्ट कर्सर को डिक्लेरेशन सेक्शन में परिभाषित किया जाना चाहिए। PL/SQL ब्लॉकऔर इसे उस SELECT स्टेटमेंट के लिए बनाया गया है जिसका उपयोग कोड में किया जाना है।

एक्सप्लिसिट कर्सर के साथ काम करने में शामिल चरण नीचे दिए गए हैं:

  • कर्सर की घोषणा: कर्सर घोषित करने का सीधा सा मतलब है कि घोषणा भाग में परिभाषित SELECT स्टेटमेंट के लिए एक नाम वाला कॉन्टेक्स्ट एरिया बनाना। इस कॉन्टेक्स्ट एरिया का नाम कर्सर के नाम के समान ही होता है।
  • कर्सर खोलना: कर्सर खोलने से PL/SQL को इस कर्सर के लिए मेमोरी आवंटित करने का निर्देश मिलता है। इससे कर्सर रिकॉर्ड लाने के लिए तैयार हो जाता है।
  • कर्सर से डेटा प्राप्त करना: इस प्रक्रिया में, SELECT स्टेटमेंट निष्पादित होता है और प्राप्त पंक्तियाँ आवंटित मेमोरी में संग्रहीत हो जाती हैं। इन्हें अब सक्रिय सेट कहा जाता है। कर्सर से डेटा प्राप्त करना एक रिकॉर्ड-स्तरीय गतिविधि है, जिसका अर्थ है कि हम डेटा को रिकॉर्ड-दर-रिकॉर्ड तरीके से एक्सेस कर सकते हैं। प्रत्येक फ़ेच स्टेटमेंट एक सक्रिय सेट प्राप्त करता है और उस विशेष रिकॉर्ड की जानकारी रखता है। यह स्टेटमेंट SELECT स्टेटमेंट के समान है जो रिकॉर्ड प्राप्त करता है और उसे INTO क्लॉज़ में वेरिएबल को असाइन करता है, लेकिन यह कोई त्रुटि नहीं उत्पन्न करेगा। अपवाद.
  • कर्सर बंद करना: सभी रिकॉर्ड प्राप्त हो जाने के बाद, हमें कर्सर को बंद करने की आवश्यकता होती है ताकि इस संदर्भ क्षेत्र को आवंटित मेमोरी मुक्त हो जाए।

वाक्य - विन्यास

DECLARE
CURSOR <cursor_name> IS <SELECT statement>;
<cursor_variable declaration>;
BEGIN
OPEN <cursor_name>;
FETCH <cursor_name> INTO <cursor_variable>;
.
.
CLOSE <cursor_name>;
END;

उपरोक्त वाक्य संरचना में, घोषणा भाग में कर्सर और उस कर्सर चर की घोषणा शामिल है जिसमें प्राप्त डेटा असाइन किया जाएगा। कर्सर घोषणा में दिए गए SELECT कथन के लिए कर्सर बनाया जाता है। निष्पादन भाग में, घोषित कर्सर को खोला जाता है, डेटा प्राप्त किया जाता है और बंद किया जाता है।

कर्सर विशेषताएँ

इम्प्लिसिट कर्सर और एक्सप्लिसिट कर्सर दोनों में कुछ ऐसे एट्रिब्यूट होते हैं जिन्हें एक्सेस किया जा सकता है। ये एट्रिब्यूट कर्सर की कार्यप्रणाली के बारे में अधिक जानकारी देते हैं। नीचे विभिन्न कर्सर एट्रिब्यूट और उनके उपयोग दिए गए हैं।

कर्सर विशेषता विवरण
%मिल गया यदि हाल ही में किए गए फ़ेच ऑपरेशन में कोई रिकॉर्ड सफलतापूर्वक प्राप्त हुआ है, तो यह बूलियन परिणाम TRUE लौटाता है; अन्यथा यह FALSE लौटाता है।
%नहीं मिला यह %FOUND के विपरीत काम करता है। यदि हाल ही में किए गए फ़ेच ऑपरेशन में कोई रिकॉर्ड नहीं मिला, तो यह TRUE लौटाता है।
%खुला हैं यदि दिया गया कर्सर पहले से खुला है तो यह बूलियन परिणाम TRUE लौटाता है; अन्यथा यह FALSE लौटाता है।
%पंक्ति गिनती यह ऑपरेशन द्वारा प्रभावित या प्राप्त किए गए रिकॉर्ड की वास्तविक संख्या बताने वाला एक संख्यात्मक मान लौटाता है।

स्पष्ट कर्सर का उदाहरण: इस उदाहरण में, हम देखेंगे कि एक स्पष्ट कर्सर को कैसे घोषित, खोला, प्राप्त किया और बंद किया जाता है। हम कर्सर का उपयोग करके emp टेबल से सभी कर्मचारियों के नाम प्रोजेक्ट करेंगे। हम कर्सर एट्रिब्यूट का उपयोग करके लूप को कर्सर से सभी रिकॉर्ड प्राप्त करने के लिए भी सेट करेंगे।

नीचे दिए गए स्क्रीनशॉट में इस स्पष्ट कर्सर का उदाहरण और इसका आउटपुट दिखाया गया है। Oracle.

एम्प्लॉई टेबल से कर्मचारियों के नाम प्राप्त करने के लिए स्पष्ट कर्सर का उदाहरण। Oracle PL / SQL

DECLARE
CURSOR guru99_det IS SELECT emp_name FROM emp;
lv_emp_name emp.emp_name%type;
BEGIN
OPEN guru99_det;
LOOP
FETCH guru99_det INTO lv_emp_name;
IF guru99_det%NOTFOUND
THEN
EXIT;
END IF;
Dbms_output.put_line('Employee Fetched:'||lv_emp_name);
END LOOP;
Dbms_output.put_line('Total rows fetched is'||guru99_det%ROWCOUNT);
CLOSE guru99_det;
END;
/

उत्पादन

Employee Fetched:BBB
Employee Fetched:XXX
Employee Fetched:YYY
Total rows fetched is 3

Code व्याख्या

  • Code पंक्ति 2: 'SELECT emp_name FROM emp' कथन के लिए कर्सर guru99_det घोषित करना।
  • Code पंक्ति 3: lv_emp_name नामक वेरिएबल को घोषित करना %प्रकार emp.emp_name से जुड़ा हुआ।
  • Code पंक्ति 5: कर्सर guru99_det खोलना।
  • Code पंक्ति 6: खाली टेबल में मौजूद सभी रिकॉर्ड को लाने के लिए बेसिक लूप स्टेटमेंट सेट करना।
  • Code पंक्ति 7: guru99_det डेटा प्राप्त करता है और उस मान को lv_emp_name को असाइन करता है।
  • Code पंक्ति 8: कर्सर एट्रिब्यूट %NOTFOUND का उपयोग करके यह जांचा जाता है कि कर्सर में मौजूद सभी रिकॉर्ड प्राप्त हो गए हैं या नहीं। यदि सभी रिकॉर्ड प्राप्त हो गए हैं, तो TRUE रिटर्न होता है और कंट्रोल लूप से बाहर निकल जाता है; अन्यथा कंट्रोल कर्सर से डेटा प्राप्त करना जारी रखता है और उसे प्रिंट करता है।
  • Code पंक्ति 10: लूप कथन के लिए EXIT शर्त.
  • Code पंक्ति 12: प्राप्त कर्मचारी का नाम प्रिंट करें.
  • Code पंक्ति 14: कर्सर द्वारा प्राप्त किए गए कुल रिकॉर्डों की संख्या ज्ञात करने के लिए कर्सर विशेषता %ROWCOUNT का उपयोग करें।
  • Code पंक्ति 15: लूप से बाहर निकलने के बाद, कर्सर बंद हो जाता है और आवंटित मेमोरी मुक्त हो जाती है।

FOR लूप कर्सर कथन

एक कर्सर पाश के लिए इसका उपयोग कर्सर के साथ काम करने के लिए किया जा सकता है। हम FOR लूप स्टेटमेंट में रेंज लिमिट के बजाय कर्सर का नाम दे सकते हैं, ताकि लूप कर्सर के पहले रिकॉर्ड से लेकर अंतिम रिकॉर्ड तक काम करे। कर्सर वेरिएबल, कर्सर खोलना, कर्सर से डेटा प्राप्त करना और कर्सर बंद करना, ये सभी कार्य FOR लूप द्वारा स्वतः ही किए जाते हैं।

वाक्य - विन्यास

DECLARE
CURSOR <cursor_name> IS <SELECT statement>;
BEGIN
FOR I IN <cursor_name>
LOOP
.
.
END LOOP;
END;

उपरोक्त वाक्य संरचना में, घोषणा भाग में कर्सर की घोषणा शामिल है। कर्सर घोषणा में दिए गए SELECT कथन के लिए कर्सर बनाया जाता है। निष्पादन भाग में, घोषित कर्सर को FOR लूप में स्थापित किया जाता है, और इस स्थिति में लूप चर 'I' कर्सर चर के रूप में कार्य करता है।

Oracle लूप के लिए कर्सर का उदाहरण: इस उदाहरण में, हम कर्सर-फॉर लूप का उपयोग करके एम्प्लॉई टेबल से सभी कर्मचारियों के नाम प्रोजेक्ट करेंगे।

DECLARE
CURSOR guru99_det IS SELECT emp_name FROM emp;
BEGIN
FOR lv_emp_name IN guru99_det
LOOP
Dbms_output.put_line('Employee Fetched:'||lv_emp_name.emp_name);
END LOOP;
END;
/

उत्पादन

Employee Fetched:BBB
Employee Fetched:XXX
Employee Fetched:YYY

Code व्याख्या

  • Code पंक्ति 2: 'SELECT emp_name FROM emp' कथन के लिए कर्सर guru99_det घोषित करना।
  • Code पंक्ति 4: लूप वेरिएबल lv_emp_name का उपयोग करके कर्सर के लिए FOR लूप का निर्माण करना।
  • Code पंक्ति 6: लूप के प्रत्येक पुनरावृति में कर्मचारी का नाम मुद्रित करना।
  • Code पंक्ति 7: लूप से बाहर निकलें (END LOOP)।

नोट: कर्सर-फॉर लूप में, कर्सर एट्रिब्यूट्स का उपयोग नहीं किया जा सकता है, क्योंकि कर्सर को खोलना, फ़ेच करना और बंद करना फॉर लूप द्वारा अप्रत्यक्ष रूप से किया जाता है।

अक्सर पूछे जाने वाले प्रश्न

एक REF कर्सर (कर्सर वेरिएबल) क्वेरी परिणाम सेट का एक पॉइंटर होता है। स्टैटिक कर्सर के विपरीत, यह रनटाइम पर विभिन्न क्वेरी खोल सकता है और PL/SQL ब्लॉक के बीच या क्लाइंट प्रोग्राम को परिणाम पास कर सकता है।

एक सामान्य कर्सर प्रत्येक FETCH कॉल पर एक पंक्ति को फ़ेच करता है, जिससे कई कॉन्टेक्स्ट स्विच होते हैं। थोक संग्रह यह एक ही बार में कई पंक्तियों को एक संग्रह में लोड करता है, जिससे बड़े परिणाम सेटों पर ओवरहेड में काफी कमी आती है।

जी हाँ। CURSOR c(dept NUMBER) IS SELECT … जैसा पैरामीटरयुक्त कर्सर घोषित करें, फिर OPEN c(10) पर मान पास करें। पैरामीटर आपको अलग-अलग फ़िल्टर मानों के साथ एक ही कर्सर परिभाषा का पुन: उपयोग करने की अनुमति देते हैं।

FOR UPDATE कर्सर द्वारा चयनित पंक्तियों को लॉक कर देता है ताकि कोई और उन्हें बदल न सके। WHERE CURRENT OF फिर WHERE शर्त को दोहराए बिना, अभी-अभी चुनी गई पंक्ति को अपडेट या डिलीट कर देता है।

ओपन कर्सर अपनी मेमोरी आरक्षित रखते हैं और OPEN_CURSORS सीमा में गिने जाते हैं। कई कर्सर खुले छोड़ने से अंततः ORA-01000 त्रुटि उत्पन्न होती है: अधिकतम ओपन कर्सर सीमा पार हो गई है, इसलिए उपयोग के बाद हमेशा स्पष्ट कर्सर को बंद कर दें।

प्रत्येक FETCH कमांड PL/SQL और SQL इंजन के बीच स्विच करता है। ऐसे हजारों कॉन्टेक्स्ट स्विच मिलकर समय लेते हैं, इसलिए एक सिंगल सेट-आधारित SQL स्टेटमेंट या BULK COLLECT आमतौर पर उन्हीं पंक्तियों को कहीं अधिक तेज़ी से प्रोसेस करता है।

हां. गिटहब कोपिलॉट यह ड्राफ्ट स्पष्ट OPEN, FETCH, और CLOSE लूप या किसी टिप्पणी से कर्सर FOR लूप तैयार करता है, %NOTFOUND निकास जांच जोड़ता है, और विशेषता नामों का सुझाव देता है, हालांकि आपको पहले तर्क की समीक्षा कर लेनी चाहिए।

एआई सहायक पंक्ति-दर-पंक्ति कर्सर लूप को चिह्नित करते हैं जो सेट-आधारित SQL या बल्क कलेक्ट बन सकते हैं, अधूरे कर्सर का पता लगाते हैं और % एट्रिब्यूट व्यवहार की व्याख्या करते हैं। यह मशीन लर्निंग समीक्षा कोड के उत्पादन में जाने से पहले प्रदर्शन में सुधार करती है।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: