अपडेट के मामले में सभी रिकॉर्ड के माध्यम से लूप करने की कोई आवश्यकता नहीं है। इसलिए आपको अपेक्षित 2 के बजाय 4 अपडेट मिल रहे हैं।
इसके बजाय, आपको केवल DUP_VAL_ON_INDEX
. के मामले में ही अपडेट करना चाहिए अपवाद और केवल वह पंक्ति जो अपवाद का कारण बनी।
कुछ इस तरह की कोशिश करो।
DECLARE
ins NUMBER := 0;
upd NUMBER := 0;
CURSOR c1 IS
SELECT cid
FROM tbl_cust
WHERE cid
IN ('1','2','3','4');
BEGIN
FOR rec IN c1 LOOP
begin
INSERT INTO tbl2 (id_tbl2, name_tbl2)
VALUES(rec.cid, DECODE(rec.cid, '1', 'A',
'2', 'B',
'3', 'C',
'4', 'D'));
ins := ins + 1;
EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
UPDATE tbl2 set name_tbl2 = DECODE(rec.cid, '1', 'A',
'2', 'B',
'3', 'C',
'4', 'D'));
WHERE cust_cust_code = rec.cid;
upd := upd + 1;
continue;
end;
END LOOP;
dbms_output.put_line('Updated: ' || upd);
dbms_output.put_line('Inserted: ' || ins);
END;