sql >> Database >  >> RDS >> Oracle

oracle uitvoeren onmiddellijk niet uitvoeren zonder enige fout

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.



  1. PostgreSQL-schema maken

  2. Overzicht van T-SQL PRINT-verklaring

  3. Genereer een zoekopdracht met 5 tabellen

  4. 5 trucs voor het garanderen van piekprestaties van SQL Server