La razón por la que su código no hace nada es esta:
OPEN c1;
LOOP
EXIT WHEN c1%NOTFOUND;
EXIT WHEN (c1%ROWCOUNT <> p_SCBCount);
Estás probando para c1%ROWCOUNT antes de haber ejecutado una búsqueda. Entonces su valor es 0; Supongo que p_SCBCount no es cero en ese punto (porque lo inicializó a algún valor en el bloque DECLARE) para que la prueba se evalúe como verdadera y el programa salga.
Alternativamente, el problema es este:
OPEN c1;
LOOP
...
FOR i in c1 LOOP
No podemos usar FOR ... IN con un cursor explícito. Has abierto el cursor. Entonces el FOR intenta abrirlo de nuevo, lo que arroja ORA-06511: PL/SQL: cursor already open . Si no ve este error, debe tener un controlador de excepciones que lo suprima (p. ej., WHEN others then null; ).
Básicamente, el bucle externo es completamente innecesario y debe descartarlo.
El control de bucle explícito rara vez es necesario:solo use FOR ... IN construya y deje que Oracle controle el flujo.
También es innecesario todo el SQL dinámico. SQL funciona con variables, por lo que solo necesita escribir SQL estático que haga referencia a los atributos del cursor:
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);
No estoy seguro del propósito de c1%ROWCOUNT <> p_SCBCount . Mi corazonada es que es superfluo, porque el FOR LOOP controla las búsquedas con precisión. De hecho, sospecho que lo agregó para evitar los efectos secundarios de los bucles anidados; y sospecho que solo introdujo los bucles anidados porque su código original lanzó PLS-00376: illegal EXIT/CONTINUE statement; it must appear inside a loop (solo una suposición descabellada).
Sin embargo, si sirve para implementar alguna lógica comercial genuina, puede agregarla al ciclo de alguna manera.