sql >> Databasteknik >  >> RDS >> Oracle

oracle exekvera omedelbart utan exekvering utan fel

Anledningen till att din kod inte gör något är detta:

OPEN c1;
 LOOP
  EXIT WHEN c1%NOTFOUND;   
  EXIT WHEN (c1%ROWCOUNT <> p_SCBCount);

Du testar för c1%ROWCOUNT innan du har utfört en hämtning. Så dess värde är 0; Jag gissar att p_SCBCount är inte noll vid den punkten (eftersom du initierade det till något värde i DECLARE-blocket) så att testet utvärderas till sant och programmet avslutas.

Alternativt är problemet detta:

OPEN c1;
 LOOP
   ...
   FOR i in c1 LOOP

Vi kan inte använda FOR ... IN med en tydlig markör. Du har öppnat markören. Sedan FOR försöker öppna den igen vilket kastar ORA-06511: PL/SQL: cursor already open . Om du inte ser det här felet måste du ha en undantagshanterare som undertrycker det (t.ex. WHEN others then null; ).

I grund och botten är den yttre öglan helt onödig och du bör kassera den.

Explicit loopkontroll är sällan nödvändig:använd bara FOR ... IN konstruera och låt Oracle styra flödet.

All dynamisk SQL är också onödig. SQL fungerar med variabler så du behöver bara skriva statisk SQL som refererar till markörattributen:

 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); 

Jag är inte säker på syftet med c1%ROWCOUNT <> p_SCBCount . Min gissning är att det är överflödigt, eftersom FOR LOOP kontrollerar apporterna exakt. Jag misstänker faktiskt att du lade till det för att undvika biverkningarna av de kapslade slingorna; och jag misstänker att du bara introducerade de kapslade slingorna eftersom din ursprungliga kod kastade PLS-00376: illegal EXIT/CONTINUE statement; it must appear inside a loop (bara en vild gissning).

Men om den tjänar till att implementera någon äkta affärslogik kan du lägga till den i loopen på något sätt.



  1. MySQL-fråga - Summa kapaciteten hos flera lager

  2. SQL, skapa en tabell

  3. MySQL-import - Hur ignorerar jag Drop-tabellen om det finns en rad?

  4. Påskynda radräkningen i MySQL