Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

oracle तत्काल निष्पादित करता है बिना किसी त्रुटि के निष्पादित नहीं करता है

आपके कोड के कुछ नहीं करने का कारण यह है:

OPEN c1;
 LOOP
  EXIT WHEN c1%NOTFOUND;   
  EXIT WHEN (c1%ROWCOUNT <> p_SCBCount);

आप c1%ROWCOUNT . के लिए परीक्षण कर रहे हैं इससे पहले कि आप एक फ़ेच निष्पादित करें। तो इसका मान 0 है; मैं अनुमान लगा रहा हूँ p_SCBCount उस बिंदु पर शून्य नहीं है (क्योंकि आपने इसे DECLARE ब्लॉक में कुछ मान के लिए प्रारंभ किया है) ताकि परीक्षण सत्य का मूल्यांकन करे और प्रोग्राम बाहर निकल जाए।

वैकल्पिक रूप से समस्या यह है:

OPEN c1;
 LOOP
   ...
   FOR i in c1 LOOP

हम FOR ... IN . का उपयोग नहीं कर सकते एक स्पष्ट कर्सर के साथ। आपने कर्सर खोल दिया है। फिर FOR इसे फिर से खोलने का प्रयास करता है जो ORA-06511: PL/SQL: cursor already open को नुकसान पहुंचाता है . यदि आपको यह त्रुटि दिखाई नहीं दे रही है तो आपके पास एक अपवाद हैंडलर होना चाहिए जो इसे दबा दे (उदा. WHEN others then null; )

मूल रूप से बाहरी लूप पूरी तरह से अनावश्यक है और आपको इसे त्याग देना चाहिए।

स्पष्ट लूप नियंत्रण शायद ही कभी आवश्यक होता है:बस FOR ... IN . का उपयोग करें निर्माण करें और Oracle को प्रवाह को नियंत्रित करने दें।

सभी गतिशील एसक्यूएल भी अनावश्यक है। SQL चर के साथ काम करता है इसलिए आपको केवल स्थिर SQL लिखने की आवश्यकता है जो कर्सर विशेषताओं का संदर्भ देता है:

 FOR i in (SELECT crs_cust.CUSTOMER_ID AS CUSTOMER_ID
                 , subset.NEW_CUSTOMER_REFERENCE_ID AS CUSTOMER_REF_ID 
           FROM CRS_CUSTOMERS crs_cust 
           INNER JOIN  DAY0_SUBSET subset
           ON crs_cust.CUSTOMER_ID=subset.CURRENT_CUSTOMER_ID )
 LOOP
     UPDATE CRS_CUSTOMERS 
     SET REF_ID = i.CUSTOMER_REF_ID
     WHERE CUSTOMER_ID = i.CUSTOMER_ID; 
     p_TotalUpdatedCRS := p_TotalUpdatedCRS + 1;

     UPDATE CRS_REVIEWS
     SET REF_ID =  i.CUSTOMER_REF_ID
     WHERE CUSTOMER_ID =  i.CUSTOMER_ID; 

     UPDATE CRS_EVENT 
     SET REF_ID = i.CUSTOMER_REF_ID 
     WHERE UNIQUE_ID = i.CUSTOMER_ID;

     UPDATE ALERT_HEADER 
     SET CUSTOMER_SOURCE_REF_ID = i.CUSTOMER_REF_ID 
     WHERE CUSTOMER_ID = i.CUSTOMER_ID; 
END LOOP;
DBMS_OUTPUT.PUT_LINE ('The total updates to CRS table = ' || p_TotalUpdatedCRS); 

मैं c1%ROWCOUNT <> p_SCBCount के उद्देश्य के बारे में निश्चित नहीं हूं . मेरा कूबड़ यह ज़रूरत से ज़्यादा है, क्योंकि FOR LOOP प्राप्तियों को ठीक से नियंत्रित करता है। वास्तव में मुझे संदेह है कि आपने इसे नेस्टेड लूप के दुष्प्रभावों से बचने के लिए जोड़ा है; और मुझे संदेह है कि आपने केवल नेस्टेड लूप पेश किए हैं क्योंकि आप मूल कोड फेंक रहे हैं PLS-00376: illegal EXIT/CONTINUE statement; it must appear inside a loop (सिर्फ एक जंगली अनुमान)।

हालांकि, अगर यह कुछ वास्तविक व्यावसायिक तर्क को लागू करने का काम करता है तो आप इसे किसी भी तरह से लूप में जोड़ सकते हैं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle में वर्ष 1950 से पहले की तिथियां सम्मिलित करना

  2. DBMS_XDB.SETHTTPORT सेट करते समय प्रवेश निषेध

  3. Oracle SQL के साथ सामान्य सुविधाओं को साझा करने वाले व्यक्तियों को फ़्लैग करें

  4. रेल 3.0.3 - Oracle_enhanced काम नहीं करता

  5. मैं जावा के साथ वेब आधारित Oracle डेटाबेस से कैसे जुड़ सकता हूं?