sql >> Database teknologi >  >> RDS >> Oracle

oracle eksekver med det samme og eksekverer ikke uden fejl

Grunden til, at din kode ikke gør noget, er denne:

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

Du tester for c1%ROWCOUNT før du har udført en hentning. Så dens værdi er 0; Jeg gætter på p_SCBCount er ikke nul på det tidspunkt (fordi du initialiserede den til en eller anden værdi i DECLARE-blokken), så testen evalueres til sand, og programmet afsluttes.

Alternativt er problemet dette:

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

Vi kan ikke bruge FOR ... IN med en eksplicit markør. Du har åbnet markøren. Derefter FOR prøver at åbne den igen, hvilket kaster ORA-06511: PL/SQL: cursor already open . Hvis du ikke ser denne fejl, skal du have en undtagelsesbehandler, som undertrykker den (f.eks. WHEN others then null; ).

Grundlæggende er den ydre løkke fuldstændig unødvendig, og du bør kassere den.

Eksplicit sløjfekontrol er sjældent nødvendig:brug bare FOR ... IN konstruer og lad Oracle styre flowet.

Også unødvendig er al den dynamiske SQL. SQL arbejder med variabler, så du skal bare skrive statisk SQL, som refererer til markørattributterne:

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

Jeg er ikke sikker på formålet med c1%ROWCOUNT <> p_SCBCount . Min fornemmelse er, at det er overflødigt, fordi FOR LOOP styrer apporteringerne præcist. Faktisk formoder jeg, at du tilføjede det for at undgå bivirkningerne af de indlejrede løkker; og jeg formoder, at du kun introducerede de indlejrede løkker, fordi du er den originale kode, der blev slynget PLS-00376: illegal EXIT/CONTINUE statement; it must appear inside a loop (bare et vildt gæt).

Men hvis det tjener til at implementere en ægte forretningslogik, kan du tilføje det til løkken på en eller anden måde.



  1. Bindestreger i kolonnenavne i MySQL DB

  2. Indsæt hele værdien af ​​DataTable-bulk i postgreSQL-tabellen

  3. Opdater kolonner, hvis inputværdier ikke er null, ellers ignorer og behold de eksisterende værdier for kolonne i databasen

  4. Fejl:pg_config eksekverbar fil blev ikke fundet ved installation af psycopg2 på Alpine i Docker