मुझे त्रुटि मिलती रहती है: ORA-06502: PL/SQL: प्रक्रिया के दूसरे भाग के दौरान संख्यात्मक या मान त्रुटि। पहली बार चलने पर निम्नलिखित भाग उसी तरह काम करता है जैसा उसे करना चाहिए। पढ़ता है १५०,००० रिकॉर्ड इसे संसाधित करता है, हेरफेर करता है .. जब मैं इसे दूसरी बार चलाता हूं, तो my_cursor खाली होता है क्योंकि सभी १५०,००० रिकॉर्ड पहले रन में संसाधित होते हैं। मैं NO_DATA_FOUND प्राप्त करने के लिए यहां छोड़ दूंगा लेकिन मुझे त्रुटि मिलती रहती है: ORA-06502: PL/SQL: संख्यात्मक या मान त्रुटि।

दूसरे निष्पादन के बाद लॉग के साथ प्रिंट लाइन-> पढ़ें/सम्मिलित: 0. यह भी ठीक है क्योंकि संसाधित करने के लिए कोई डेटा नहीं बचा है...

OPEN my_cursor;
LOOP
    FETCH my_cursor BULK COLLECT INTO var_t LIMIT 100000; 
    FOR i IN var_t.FIRST .. var_t.LAST  
    LOOP
    var_read_cnt := var_read_cnt + 1;
    END LOOP;
    EXIT WHEN my_cursor%NOTFOUND; 
END LOOP;
close my_cursor;
EXCEPTION
WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.put_line('OK no data found  SQLCODE: '||SQLCODE||' -- ERROR: '||SQLERRM);
WHEN OTHERS THEN  
    DBMS_OUTPUT.put_line(' Unexcpected exception SQLCODE: '||SQLCODE||' -- ERROR: '||SQLERRM);
END;
DBMS_OUTPUT.put_line('read/inserted : '|| var_read_cnt);
0
Jeremy 22 नवम्बर 2020, 10:15

1 उत्तर

सबसे बढ़िया उत्तर

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

LOOP
    FETCH my_cursor BULK COLLECT INTO var_t LIMIT 100000; 
    IF var_t.FIRST IS NOT NULL THEN
       FOR i IN var_t.FIRST .. var_t.LAST  
       LOOP
          var_read_cnt := var_read_cnt + 1;
       END LOOP;
    END IF;
    EXIT WHEN my_cursor%NOTFOUND; 
END LOOP;

एनबी, एक OPEN cursor ... संरचना कभी भी NO_DATA_FOUND अपवाद नहीं उठाएगी, ताकि आप उस अपवाद हैंडलर को छोड़ सकें।

0
Wernfried Domscheit 22 नवम्बर 2020, 12:03