A razão pela qual seu código não faz nada é esta:
OPEN c1;
LOOP
EXIT WHEN c1%NOTFOUND;
EXIT WHEN (c1%ROWCOUNT <> p_SCBCount);
Você está testando para
c1%ROWCOUNT
antes de executar uma busca. Portanto, seu valor é 0; Acho que p_SCBCount
não é zero nesse ponto (porque você o inicializou com algum valor no bloco DECLARE) para que o teste seja avaliado como verdadeiro e o programa seja encerrado. Alternativamente o problema é este:
OPEN c1;
LOOP
...
FOR i in c1 LOOP
Não podemos usar o
FOR ... IN
com um cursor explícito. Você abriu o cursor. Então o FOR
tenta abri-lo novamente o que lança ORA-06511: PL/SQL: cursor already open
. Se você não estiver vendo este erro, você deve ter um manipulador de exceção que o suprima (por exemplo, WHEN others then null;
). Basicamente, o loop externo é completamente desnecessário e você deve descartá-lo.
O controle de loop explícito raramente é necessário:basta usar o
FOR ... IN
construir e deixar o Oracle controlar o fluxo. Também desnecessário é todo o SQL dinâmico. SQL funciona com variáveis, então você só precisa escrever SQL estático que referencia os atributos do 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);
Não tenho certeza da finalidade do
c1%ROWCOUNT <> p_SCBCount
. Meu palpite é que é supérfluo, porque o FOR LOOP
controla as buscas com precisão. Na verdade, suspeito que você o adicionou para evitar os efeitos colaterais dos loops aninhados; e eu suspeito que você só introduziu os loops aninhados porque você é o código original lançado PLS-00376: illegal EXIT/CONTINUE statement; it must appear inside a loop
(apenas um palpite). No entanto, se servir para implementar alguma lógica de negócios genuína, você poderá adicioná-la ao loop de alguma forma.