De reden waarom uw code niets doet, is deze:
OPEN c1;
LOOP
EXIT WHEN c1%NOTFOUND;
EXIT WHEN (c1%ROWCOUNT <> p_SCBCount);
U test voor c1%ROWCOUNT
voordat u een ophaalactie hebt uitgevoerd. Dus de waarde is 0; Ik gok p_SCBCount
is op dat moment niet nul (omdat je het op een bepaalde waarde in het DECLARE-blok hebt geïnitialiseerd), zodat de test wordt geëvalueerd als waar en het programma wordt afgesloten.
Als alternatief is het probleem dit:
OPEN c1;
LOOP
...
FOR i in c1 LOOP
We kunnen de FOR ... IN
. niet gebruiken met een expliciete cursor. U hebt de cursor geopend. Dan de FOR
probeert het opnieuw te openen, wat ORA-06511: PL/SQL: cursor already open
slingert . Als u deze fout niet ziet, moet u een uitzonderingshandler hebben die deze onderdrukt (bijv. WHEN others then null;
).
In principe is de buitenste lus helemaal niet nodig en moet u deze weggooien.
Expliciete loop control is zelden nodig:gebruik gewoon de FOR ... IN
bouw en laat Oracle de stroom controleren.
Ook onnodig is alle dynamische SQL. SQL werkt met variabelen, dus je hoeft alleen maar statische SQL te schrijven die verwijst naar de cursorattributen:
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);
Ik ben niet zeker van het doel van de c1%ROWCOUNT <> p_SCBCount
. Mijn vermoeden is dat het overbodig is, omdat de FOR LOOP
regelt de ophaalacties nauwkeurig. Ik vermoed zelfs dat je het hebt toegevoegd om de bijwerkingen van de geneste lussen te voorkomen; en ik vermoed dat je alleen de geneste lussen hebt geïntroduceerd omdat je de originele code hebt geslingerd PLS-00376: illegal EXIT/CONTINUE statement; it must appear inside a loop
(slechts een wilde gok).
Als het echter dient om echte bedrijfslogica te implementeren, kunt u het op de een of andere manier in de lus toevoegen.