Anledningen till att din kod inte gör något är detta:
OPEN c1;
LOOP
EXIT WHEN c1%NOTFOUND;
EXIT WHEN (c1%ROWCOUNT <> p_SCBCount);
Du testar för c1%ROWCOUNT
innan du har utfört en hämtning. Så dess värde är 0; Jag gissar att p_SCBCount
är inte noll vid den punkten (eftersom du initierade det till något värde i DECLARE-blocket) så att testet utvärderas till sant och programmet avslutas.
Alternativt är problemet detta:
OPEN c1;
LOOP
...
FOR i in c1 LOOP
Vi kan inte använda FOR ... IN
med en tydlig markör. Du har öppnat markören. Sedan FOR
försöker öppna den igen vilket kastar ORA-06511: PL/SQL: cursor already open
. Om du inte ser det här felet måste du ha en undantagshanterare som undertrycker det (t.ex. WHEN others then null;
).
I grund och botten är den yttre öglan helt onödig och du bör kassera den.
Explicit loopkontroll är sällan nödvändig:använd bara FOR ... IN
konstruera och låt Oracle styra flödet.
All dynamisk SQL är också onödig. SQL fungerar med variabler så du behöver bara skriva statisk SQL som refererar till markörattributen:
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);
Jag är inte säker på syftet med c1%ROWCOUNT <> p_SCBCount
. Min gissning är att det är överflödigt, eftersom FOR LOOP
kontrollerar apporterna exakt. Jag misstänker faktiskt att du lade till det för att undvika biverkningarna av de kapslade slingorna; och jag misstänker att du bara introducerade de kapslade slingorna eftersom din ursprungliga kod kastade PLS-00376: illegal EXIT/CONTINUE statement; it must appear inside a loop
(bara en vild gissning).
Men om den tjänar till att implementera någon äkta affärslogik kan du lägga till den i loopen på något sätt.