आपके कोड के कुछ नहीं करने का कारण यह है:
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
(सिर्फ एक जंगली अनुमान)।
हालांकि, अगर यह कुछ वास्तविक व्यावसायिक तर्क को लागू करने का काम करता है तो आप इसे किसी भी तरह से लूप में जोड़ सकते हैं।