खोज…


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

  • कर्सर कर्सर_नाम आपका_सेप्ट_स्टैटमेंट है
  • कर्सर कर्सर_नाम (परम टाइप) आपकी_सेप्ट_स्टैटमेंट_यूज़िंग_परम है
  • X के लिए ( your_select_statement ) LOOP ...

टिप्पणियों

घोषित कर्सर का उपयोग करना मुश्किल है, और आपको ज्यादातर मामलों में छोरों के FOR पसंद करना चाहिए। क्या साधारण की तुलना में कर्सर में बहुत दिलचस्प है FOR , छोरों है कि आप उन्हें parameterize कर सकते हैं है।

वैसे भी Oracle SQL का उपयोग करने के बजाय PL / SQL और कर्सर के साथ छोरों को करने से बचना बेहतर है। हालाँकि, प्रक्रियात्मक भाषा के आदी लोगों के लिए, इसे समझना बहुत आसान हो सकता है।

यदि आप यह देखना चाहते हैं कि कोई रिकॉर्ड मौजूद है या नहीं, और फिर रिकॉर्ड मौजूद है या नहीं, इसके आधार पर अलग-अलग चीजें करते हैं, तो कर्सर लूप का उपयोग करने के बजाय शुद्ध ORACLE SQL प्रश्नों में MERGE स्टेटमेंट का उपयोग करना समझ में आता है। (कृपया ध्यान दें कि MERGE केवल Oracle रिलीज> = 9i में उपलब्ध है)।

पैरामीटर "लूप के लिए" कर्सर

DECLARE
  CURSOR c_emp_to_be_raised(p_sal emp.sal%TYPE) IS 
    SELECT * FROM emp WHERE  sal < p_sal;
BEGIN
  FOR cRowEmp IN c_emp_to_be_raised(1000) LOOP
    dbms_Output.Put_Line(cRowEmp .eName ||' ' ||cRowEmp.sal||'... should be raised ;)');
  END LOOP;
END;
/

"लूप के लिए" कर्सर लागू करें

BEGIN
  FOR x IN (SELECT * FROM emp WHERE sal < 100) LOOP
    dbms_Output.Put_Line(x.eName ||' '||x.sal||'... should REALLY be raised :D');
  END LOOP;
END;
/
  • पहला फायदा यह है कि ऐसा करने के लिए कोई थकाऊ घोषणा नहीं की गई है (इस भयानक "CURSOR" के बारे में सोचें जो आपके पिछले संस्करणों में थी)
  • दूसरा फायदा यह है कि आप पहले अपनी चुनिंदा क्वेरी का निर्माण करते हैं, फिर जब आपके पास वह होता है, तो आप तुरंत अपने PL / SQL लूप में अपने क्वेरी ( x.<myfield> ) के क्षेत्रों तक पहुँच सकते हैं x.<myfield>
  • लूप कर्सर को खोलता है और प्रत्येक लूप के लिए एक समय में एक रिकॉर्ड प्राप्त करता है। लूप के अंत में कर्सर बंद हो जाता है।
  • नकल करने वाले शाप देने वाले तेज़ होते हैं क्योंकि कोड के लंबा होते ही दुभाषिया का काम बढ़ता जाता है। कम कोड को दुभाषिया को कम काम करना पड़ता है।

SYS_REFCURSOR के साथ कार्य करना

SYS_REFCURSOR का उपयोग एक वापसी प्रकार के रूप में किया जा सकता है जब आपको आसानी से तालिका से नहीं लौटी सूची को संभालने की आवश्यकता होती है, लेकिन विशेष रूप से एक फ़ंक्शन से:

फ़ंक्शन एक कर्सर लौटाता है

CREATE OR REPLACE FUNCTION list_of (required_type_in IN VARCHAR2)
   RETURN SYS_REFCURSOR
IS
   v_ SYS_REFCURSOR;
BEGIN
   CASE required_type_in
      WHEN 'CATS'
      THEN
         OPEN v_ FOR
           SELECT nickname FROM (
                select 'minou' nickname from dual
      union all select 'minâ'           from dual
      union all select 'minon'          from dual         
           );
      WHEN 'DOGS'
      THEN
         OPEN v_ FOR
              SELECT dog_call FROM (
                select 'bill'   dog_call from dual
      union all select 'nestor'          from dual
      union all select 'raoul'           from dual         
           );
   END CASE;
   -- Whit this use, you must not close the cursor.
   RETURN v_;
END list_of;
/

और इसका उपयोग कैसे करें:

DECLARE
   v_names   SYS_REFCURSOR;
   v_        VARCHAR2 (32767);
BEGIN
   v_names := list_of('CATS');
   LOOP
      FETCH v_names INTO v_;
      EXIT WHEN v_names%NOTFOUND;
      DBMS_OUTPUT.put_line(v_);
   END LOOP;
   -- here you close it
   CLOSE v_names;
END;
/

एक कूर्स को संभालना

  • रिकॉर्ड की सूची को स्कैन करने के लिए कर्सर को घोषित करें
  • खोलो इसे
  • चर में वर्तमान रिकॉर्ड प्राप्त करें (यह वेतन वृद्धि की स्थिति)
  • सूची के अंत का पता लगाने के लिए %notfound का उपयोग करें
  • वर्तमान संदर्भ में संसाधनों की खपत को सीमित करने के लिए कर्सर को बंद करना न भूलें

-

DECLARE
  CURSOR curCols IS -- select column name and type from a given table
         SELECT column_name, data_type FROM all_tab_columns where table_name='MY_TABLE';
  v_tab_column all_tab_columns.column_name%TYPE;
  v_data_type all_tab_columns.data_type%TYPE;
  v_ INTEGER := 1;
BEGIN
  OPEN curCols;
  LOOP
     FETCH curCols INTO v_tab_column, v_data_type;
     IF curCols%notfound OR v_ > 2000 THEN
       EXIT;
     END IF;
     dbms_output.put_line(v_||':Column '||v_tab_column||' is of '|| v_data_type||' Type.');
     v_:= v_ + 1;
  END LOOP;

  -- Close in any case
  IF curCols%ISOPEN THEN  
     CLOSE curCols;
  END IF;
END;
/


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow