Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

oracle execute imediato não executando sem nenhum erro


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.