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

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

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

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

कर्सर दो प्रकार का होता है।

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

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

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

स्पष्ट कर्सर

प्रोग्रामर को अपने DML ऑपरेशन को निष्पादित करने के लिए नामित संदर्भ क्षेत्र बनाने की अनुमति है ताकि उस पर अधिक नियंत्रण प्राप्त किया जा सके। स्पष्ट कर्सर को घोषणा अनुभाग में परिभाषित किया जाना चाहिए 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' लौटाता है
%पंक्ति गिनती यह संख्यात्मक मान लौटाता है। यह DML गतिविधि से प्रभावित रिकॉर्ड्स की वास्तविक संख्या देता है।

स्पष्ट कर्सर उदाहरण:

इस उदाहरण में, हम देखेंगे कि स्पष्ट कर्सर को कैसे घोषित, खोला, लाया और बंद किया जाए।

हम कर्सर का उपयोग करके emp टेबल से सभी कर्मचारियों के नाम प्रोजेक्ट करेंगे। हम कर्सर से सभी रिकॉर्ड लाने के लिए लूप सेट करने के लिए कर्सर विशेषता का भी उपयोग करेंगे।

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%R0WCOUNT);
CLOSE guru99_det;
END:
/

उत्पादन

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

कोड स्पष्टीकरण

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

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

कर्सर के साथ काम करने के लिए “FOR LOOP” कथन का उपयोग किया जा सकता है। हम FOR लूप कथन में रेंज सीमा के बजाय कर्सर का नाम दे सकते हैं ताकि लूप कर्सर के पहले रिकॉर्ड से लेकर कर्सर के अंतिम रिकॉर्ड तक काम करे। कर्सर चर, कर्सर का खुलना, कर्सर को लाना और बंद करना FOR लूप द्वारा निहित रूप से किया जाएगा।

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

DECLARE
CURSOR <cursor_name> IS <SELECT statement>;
BEGIN
  FOR I IN <cursor_name>
  LOOP
  .
  .
  END LOOP;
END;
  • उपरोक्त सिंटैक्स में, घोषणा भाग में कर्सर की घोषणा शामिल है।
  • कर्सर घोषणा में दिए गए 'SELECT' कथन के लिए कर्सर बनाया जाता है।
  • निष्पादन भाग में, घोषित कर्सर FOR लूप में सेटअप किया जाता है और लूप वेरिएबल 'I' इस मामले में कर्सर वेरिएबल के रूप में व्यवहार करेगा।

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

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

कोड स्पष्टीकरण

  • कोड लाइन 2: 'SELECT emp_name FROM emp' कथन के लिए कर्सर guru99_det घोषित करना।
  • कोड लाइन 4: लूप वेरिएबल lv_emp_name के साथ कर्सर के लिए 'FOR' लूप का निर्माण करना।
  • कोड पंक्ति 5: लूप के प्रत्येक पुनरावृति में कर्मचारी का नाम मुद्रित करना।
  • कोड पंक्ति 8: लूप से बाहर निकलें

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