Lý do tại sao mã của bạn không có gì là sau:
OPEN c1;
LOOP
EXIT WHEN c1%NOTFOUND;
EXIT WHEN (c1%ROWCOUNT <> p_SCBCount);
Bạn đang kiểm tra c1%ROWCOUNT
trước khi bạn thực hiện tìm nạp. Vậy giá trị của nó là 0; Tôi đoán p_SCBCount
không phải là 0 tại thời điểm đó (vì bạn đã khởi tạo nó thành một giá trị nào đó trong khối DECLARE) để kiểm tra đánh giá là true và chương trình sẽ thoát.
Ngoài ra, vấn đề là sau:
OPEN c1;
LOOP
...
FOR i in c1 LOOP
Chúng tôi không thể sử dụng FOR ... IN
với một con trỏ rõ ràng. Bạn đã mở con trỏ. Sau đó, FOR
cố gắng mở lại nó làm hỏng ORA-06511: PL/SQL: cursor already open
. Nếu bạn không thấy lỗi này, bạn phải có một trình xử lý ngoại lệ loại bỏ nó (ví dụ:WHEN others then null;
).
Về cơ bản vòng lặp bên ngoài là hoàn toàn không cần thiết và bạn nên loại bỏ nó.
Điều khiển vòng lặp rõ ràng hiếm khi cần thiết:chỉ cần sử dụng FOR ... IN
xây dựng và để Oracle kiểm soát luồng.
Cũng không cần thiết là tất cả SQL động. SQL hoạt động với các biến vì vậy bạn chỉ cần viết SQL tĩnh tham chiếu đến các thuộc tính con trỏ:
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);
Tôi không chắc về mục đích của c1%ROWCOUNT <> p_SCBCount
. Linh cảm của tôi là không cần thiết, bởi vì FOR LOOP
kiểm soát các lần tìm nạp một cách chính xác. Trên thực tế, tôi nghi ngờ bạn đã thêm nó để tránh tác dụng phụ của các vòng lặp lồng nhau; và tôi nghi ngờ rằng bạn chỉ giới thiệu các vòng lặp lồng nhau vì mã gốc của bạn đã gặp trở ngại PLS-00376: illegal EXIT/CONTINUE statement; it must appear inside a loop
(chỉ là phỏng đoán hoang đường).
Tuy nhiên, nếu nó thực sự phục vụ cho việc triển khai một số logic kinh doanh chính hãng, bạn có thể thêm nó vào vòng lặp bằng cách nào đó.