Alasan mengapa kode Anda tidak melakukan apa-apa adalah ini:
OPEN c1;
LOOP
EXIT WHEN c1%NOTFOUND;
EXIT WHEN (c1%ROWCOUNT <> p_SCBCount);
Anda sedang menguji c1%ROWCOUNT
sebelum Anda menjalankan pengambilan. Jadi nilainya adalah 0; Saya menebak p_SCBCount
tidak nol pada saat itu (karena Anda menginisialisasinya ke beberapa nilai di blok DECLARE) sehingga tes bernilai true dan program keluar.
Atau masalahnya adalah ini:
OPEN c1;
LOOP
...
FOR i in c1 LOOP
Kami tidak dapat menggunakan FOR ... IN
dengan kursor eksplisit. Anda telah membuka kursor. Kemudian FOR
mencoba membukanya lagi yang melemparkan ORA-06511: PL/SQL: cursor already open
. Jika Anda tidak melihat kesalahan ini, Anda harus memiliki penangan pengecualian yang menekannya (mis. WHEN others then null;
).
Pada dasarnya loop luar sama sekali tidak perlu dan Anda harus membuangnya.
Kontrol loop eksplisit jarang diperlukan:cukup gunakan FOR ... IN
buat dan biarkan Oracle mengontrol alurnya.
Juga tidak perlu adalah semua SQL dinamis. SQL bekerja dengan variabel sehingga Anda hanya perlu menulis SQL statis yang mereferensikan atribut kursor:
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);
Saya tidak yakin dengan tujuan c1%ROWCOUNT <> p_SCBCount
. Firasat saya itu berlebihan, karena FOR LOOP
mengontrol pengambilan dengan tepat. Sebenarnya saya menduga Anda menambahkannya untuk menghindari efek samping dari loop bersarang; dan saya menduga Anda hanya memperkenalkan loop bersarang karena Anda melemparkan kode asli PLS-00376: illegal EXIT/CONTINUE statement; it must appear inside a loop
(hanya tebakan liar).
Namun, jika itu berfungsi untuk mengimplementasikan beberapa logika bisnis asli, Anda dapat menambahkannya ke dalam loop entah bagaimana.