Powodem, dla którego Twój kod nic nie robi, jest to:
OPEN c1;
LOOP
EXIT WHEN c1%NOTFOUND;
EXIT WHEN (c1%ROWCOUNT <> p_SCBCount);
Testujesz dla c1%ROWCOUNT
zanim wykonasz pobieranie. Więc jego wartość to 0; Zgaduję p_SCBCount
nie jest zerem w tym momencie (ponieważ zainicjalizowałeś go do pewnej wartości w bloku DECLARE), tak że test ma wartość prawda i program się kończy.
Alternatywnie problem polega na tym:
OPEN c1;
LOOP
...
FOR i in c1 LOOP
Nie możemy użyć FOR ... IN
z wyraźnym kursorem. Otworzyłeś kursor. Następnie FOR
próbuje go ponownie otworzyć, co powoduje wyświetlenie ORA-06511: PL/SQL: cursor already open
. Jeśli nie widzisz tego błędu, musisz mieć program obsługi wyjątków, który go pomija (np. WHEN others then null;
).
Zasadniczo zewnętrzna pętla jest całkowicie niepotrzebna i należy ją wyrzucić.
Jawne sterowanie pętlą rzadko jest konieczne:wystarczy użyć FOR ... IN
skonstruuj i pozwól Oracle kontrolować przepływ.
Zbędny jest również cały dynamiczny SQL. SQL działa ze zmiennymi, więc wystarczy napisać statyczny kod SQL, który odwołuje się do atrybutów kursora:
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);
Nie jestem pewien celu c1%ROWCOUNT <> p_SCBCount
. Moje przeczucie jest zbyteczne, ponieważ FOR LOOP
precyzyjnie kontroluje pobieranie. W rzeczywistości podejrzewam, że dodałeś go, aby uniknąć skutków ubocznych zagnieżdżonych pętli; i podejrzewam, że wprowadziłeś tylko zagnieżdżone pętle, ponieważ jesteś oryginalnym kodem rzuconym PLS-00376: illegal EXIT/CONTINUE statement; it must appear inside a loop
(tylko szalone zgadywanie).
Jeśli jednak służy to zaimplementowaniu prawdziwej logiki biznesowej, możesz jakoś dodać ją do pętli.