Grunden til, at din kode ikke gør noget, er denne:
OPEN c1;
LOOP
EXIT WHEN c1%NOTFOUND;
EXIT WHEN (c1%ROWCOUNT <> p_SCBCount);
Du tester for c1%ROWCOUNT
før du har udført en hentning. Så dens værdi er 0; Jeg gætter på p_SCBCount
er ikke nul på det tidspunkt (fordi du initialiserede den til en eller anden værdi i DECLARE-blokken), så testen evalueres til sand, og programmet afsluttes.
Alternativt er problemet dette:
OPEN c1;
LOOP
...
FOR i in c1 LOOP
Vi kan ikke bruge FOR ... IN
med en eksplicit markør. Du har åbnet markøren. Derefter FOR
prøver at åbne den igen, hvilket kaster ORA-06511: PL/SQL: cursor already open
. Hvis du ikke ser denne fejl, skal du have en undtagelsesbehandler, som undertrykker den (f.eks. WHEN others then null;
).
Grundlæggende er den ydre løkke fuldstændig unødvendig, og du bør kassere den.
Eksplicit sløjfekontrol er sjældent nødvendig:brug bare FOR ... IN
konstruer og lad Oracle styre flowet.
Også unødvendig er al den dynamiske SQL. SQL arbejder med variabler, så du skal bare skrive statisk SQL, som refererer til markørattributterne:
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);
Jeg er ikke sikker på formålet med c1%ROWCOUNT <> p_SCBCount
. Min fornemmelse er, at det er overflødigt, fordi FOR LOOP
styrer apporteringerne præcist. Faktisk formoder jeg, at du tilføjede det for at undgå bivirkningerne af de indlejrede løkker; og jeg formoder, at du kun introducerede de indlejrede løkker, fordi du er den originale kode, der blev slynget PLS-00376: illegal EXIT/CONTINUE statement; it must appear inside a loop
(bare et vildt gæt).
Men hvis det tjener til at implementere en ægte forretningslogik, kan du tilføje det til løkken på en eller anden måde.