Причината, поради която вашият код не прави нищо, е следната:
OPEN c1;
LOOP
EXIT WHEN c1%NOTFOUND;
EXIT WHEN (c1%ROWCOUNT <> p_SCBCount);
Тествате за c1%ROWCOUNT
преди да сте изпълнили извличане. Така че стойността му е 0; Предполагам, че p_SCBCount
не е нула в този момент (защото сте го инициализирали с някаква стойност в блока DECLARE), така че тестът се оценява на true и програмата излиза.
Алтернативно проблемът е следният:
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 работи с променливи, така че просто трябва да напишете статичен 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
(просто странно предположение).
Ако обаче служи за внедряване на някаква истинска бизнес логика, можете да го добавите по някакъв начин в цикъла.