पीएल / एसक्यूएल - कर्सर

इस अध्याय में, हम PL / SQL में कर्सर पर चर्चा करेंगे। ओरेकल एक मेमोरी क्षेत्र बनाता है, जिसे एसक्यूएल स्टेटमेंट को संसाधित करने के लिए संदर्भ क्षेत्र के रूप में जाना जाता है, जिसमें स्टेटमेंट को संसाधित करने के लिए आवश्यक सभी जानकारी होती है; उदाहरण के लिए, संसाधित पंक्तियों की संख्या आदि।

cursorइस संदर्भ क्षेत्र का सूचक है। PL / SQL एक कर्सर के माध्यम से संदर्भ क्षेत्र को नियंत्रित करता है। कर्सर SQL कथन द्वारा दी गई पंक्तियों (एक या अधिक) को रखता है। कर्सर को रखने वाली पंक्तियों के सेट को कर्सर के रूप में संदर्भित किया जाता हैactive set

आप एक कर्सर का नाम दे सकते हैं ताकि इसे SQL कथन द्वारा लौटाए गए पंक्तियों को लाने और संसाधित करने के लिए एक कार्यक्रम में संदर्भित किया जा सके, एक बार में। दो प्रकार के अभिशाप हैं -

  • प्रबल शाप देने वाला
  • स्पष्ट श्राप देने वाले

अव्यवस्थित कर्सर

जब भी कोई एसक्यूएल स्टेटमेंट निष्पादित किया जाता है, तब स्टेटस कर्सर को स्वचालित रूप से ओरेकल द्वारा बनाया जाता है, जब स्टेटमेंट के लिए कोई स्पष्ट कर्सर नहीं होता है। प्रोग्रामर्स निहित कर्सर और उसमें मौजूद जानकारी को नियंत्रित नहीं कर सकते।

जब भी कोई DML कथन (INSERT, UPDATE और DELETE) जारी किया जाता है, तो इस कथन के साथ एक अंतर्निहित कर्सर जुड़ा होता है। INSERT संचालन के लिए, कर्सर डेटा रखता है जिसे सम्मिलित करने की आवश्यकता होती है। अद्यतन और DELETE संचालन के लिए, कर्सर प्रभावित पंक्तियों की पहचान करता है।

PL / SQL में, आप सबसे हाल ही में निहित कर्सर को संदर्भित कर सकते हैं SQL cursor, जिसमें हमेशा जैसे गुण होते हैं %FOUND, %ISOPEN, %NOTFOUND, तथा %ROWCOUNT। SQL कर्सर में अतिरिक्त विशेषताएँ हैं,%BULK_ROWCOUNT तथा %BULK_EXCEPTIONSके साथ उपयोग के लिए डिज़ाइन किया गया है FORALLबयान। निम्न तालिका सबसे अधिक इस्तेमाल की जाने वाली विशेषताओं का विवरण प्रदान करती है -

S.No विशेषता और विवरण
1

%FOUND

यदि कोई INSERT, UPDATE, या DELETE स्टेटमेंट एक या एक से अधिक पंक्तियों को प्रभावित करता है या एक सही इन्टो स्टेटमेंट एक या अधिक पंक्तियों को लौटाता है, तो TRUE लौटाता है। अन्यथा, यह FALSE लौटाता है।

2

%NOTFOUND

% ध्वनि का तार्किक विपरीत। यदि कोई INSERT, UPDATE, या DELETE कथन प्रभावित नहीं करता है तो यह TRUE लौटाता है, या किसी INTO कथन ने इन पंक्तियों को वापस कर दिया है। अन्यथा, यह FALSE लौटाता है।

3

%ISOPEN

हमेशा अंतर्निहित कर्सर के लिए FALSE लौटाता है, क्योंकि Oracle अपने संबंधित SQL कथन को निष्पादित करने के बाद SQL कर्सर को स्वचालित रूप से बंद कर देता है।

4

%ROWCOUNT

किसी INSERT, UPDATE, या DELETE स्टेटमेंट से प्रभावित पंक्तियों की संख्या लौटाता है, या एक SELECT INTO स्टेटमेंट द्वारा लौटाया जाता है।

किसी भी SQL कर्सर विशेषता के रूप में पहुँचा जा सकता है sql%attribute_name जैसा कि नीचे उदाहरण में दिखाया गया है।

उदाहरण

हम पिछले तालिका में बनाए गए और उपयोग किए गए ग्राहक तालिका का उपयोग करेंगे।

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
+----+----------+-----+-----------+----------+

निम्न कार्यक्रम तालिका को अद्यतन करेगा और प्रत्येक ग्राहक के वेतन में 500 से वृद्धि करेगा और उपयोग करेगा SQL%ROWCOUNT प्रभावित पंक्तियों की संख्या निर्धारित करने की विशेषता -

DECLARE  
   total_rows number(2); 
BEGIN 
   UPDATE customers 
   SET salary = salary + 500; 
   IF sql%notfound THEN 
      dbms_output.put_line('no customers selected'); 
   ELSIF sql%found THEN 
      total_rows := sql%rowcount;
      dbms_output.put_line( total_rows || ' customers selected '); 
   END IF;  
END; 
/

जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

6 customers selected  

PL/SQL procedure successfully completed.

यदि आप ग्राहकों की तालिका में रिकॉर्ड की जांच करते हैं, तो आप पाएंगे कि पंक्तियों को अपडेट किया गया है -

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2500.00 | 
|  2 | Khilan   |  25 | Delhi     |  2000.00 | 
|  3 | kaushik  |  23 | Kota      |  2500.00 | 
|  4 | Chaitali |  25 | Mumbai    |  7000.00 | 
|  5 | Hardik   |  27 | Bhopal    |  9000.00 | 
|  6 | Komal    |  22 | MP        |  5000.00 | 
+----+----------+-----+-----------+----------+

स्पष्ट कर्सर

स्पष्ट नियंत्रण प्रोग्रामर-परिभाषित कर्सर हैं जो अधिक नियंत्रण प्राप्त करने के लिए हैं context area। एक स्पष्ट कर्सर को पीएल / एसक्यूएल ब्लॉक के घोषणा अनुभाग में परिभाषित किया जाना चाहिए। यह एक सेलेक्ट स्टेटमेंट पर बनाया गया है जो एक से अधिक पंक्ति देता है।

एक स्पष्ट कर्सर बनाने का सिंटैक्स है -

CURSOR cursor_name IS select_statement;

स्पष्ट कर्सर के साथ कार्य करने में निम्नलिखित चरण शामिल हैं -

  • मेमोरी को इनिशियलाइज़ करने के लिए कर्सर की घोषणा करना
  • मेमोरी आवंटित करने के लिए कर्सर खोलना
  • डेटा पुनर्प्राप्त करने के लिए कर्सर लाना
  • आवंटित मेमोरी को जारी करने के लिए कर्सर को बंद करना

Cursor की घोषणा

कर्सर की घोषणा करना कर्सर को एक नाम और संबंधित चयन विवरण के साथ परिभाषित करता है। उदाहरण के लिए -

CURSOR c_customers IS 
   SELECT id, name, address FROM customers;

कर्सर को खोलना

कर्सर को खोलना कर्सर के लिए मेमोरी आवंटित करता है और इसे एसक्यूएल स्टेटमेंट द्वारा लौटाए गए पंक्तियों को लाने के लिए तैयार करता है। उदाहरण के लिए, हम ऊपर दिए गए परिभाषित कर्सर को निम्नानुसार खोलेंगे -

OPEN c_customers;

कर्सर लाना

कर्सर ले जाने में एक समय में एक पंक्ति तक पहुंचना शामिल है। उदाहरण के लिए, हम ऊपर-खुले कर्सर से पंक्तियाँ इस प्रकार लेंगे-

FETCH c_customers INTO c_id, c_name, c_addr;

कर्सर को बंद करना

कर्सर को बंद करने का मतलब आवंटित मेमोरी को जारी करना है। उदाहरण के लिए, हम उपरोक्त खुले कर्सर को निम्नानुसार बंद करेंगे -

CLOSE c_customers;

उदाहरण

निम्नलिखित स्पष्ट कर्सर और मिनुआ की अवधारणाओं का वर्णन करने के लिए एक पूर्ण उदाहरण है;

DECLARE 
   c_id customers.id%type; 
   c_name customer.name%type; 
   c_addr customers.address%type; 
   CURSOR c_customers is 
      SELECT id, name, address FROM customers; 
BEGIN 
   OPEN c_customers; 
   LOOP 
   FETCH c_customers into c_id, c_name, c_addr; 
      EXIT WHEN c_customers%notfound; 
      dbms_output.put_line(c_id || ' ' || c_name || ' ' || c_addr); 
   END LOOP; 
   CLOSE c_customers; 
END; 
/

जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

1 Ramesh Ahmedabad  
2 Khilan Delhi  
3 kaushik Kota     
4 Chaitali Mumbai  
5 Hardik Bhopal   
6 Komal MP  
  
PL/SQL procedure successfully completed.