Oracle
 sql >> база данни >  >> RDS >> Oracle

oracle изпълнява незабавно не се изпълнява без никаква грешка

Причината, поради която вашият код не прави нищо, е следната:

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

Тествате за c1%ROWCOUNT преди да сте изпълнили извличане. Така че стойността му е 0; Предполагам, че p_SCBCount не е нула в този момент (защото сте го инициализирали с някаква стойност в блока DECLARE), така че тестът се оценява на true и програмата излиза.

Алтернативно проблемът е следният:

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

Не можем да използваме FOR ... IN с явен курсор. Отворихте курсора. След това FOR опитва да го отвори отново, което извежда ORA-06511: PL/SQL: cursor already open . Ако не виждате тази грешка, трябва да имате манипулатор на изключения, който я потиска (напр. WHEN others then null; ).

По принцип външният цикъл е напълно ненужен и трябва да го изхвърлите.

Рядко е необходимо изрично управление на цикъл:просто използвайте FOR ... IN конструирайте и оставете Oracle да контролира потока.

Също така ненужен е целият динамичен SQL. SQL работи с променливи, така че просто трябва да напишете статичен SQL, който препраща към атрибутите на курсора:

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

Не съм сигурен за целта на c1%ROWCOUNT <> p_SCBCount . Моето предчувствие е, че е излишно, защото FOR LOOP контролира извличанията прецизно. Всъщност подозирам, че сте го добавили, за да избегнете страничните ефекти от вложените цикли; и подозирам, че сте въвели само вложените цикли, защото сте хвърлили оригиналния код PLS-00376: illegal EXIT/CONTINUE statement; it must appear inside a loop (просто странно предположение).

Ако обаче служи за внедряване на някаква истинска бизнес логика, можете да го добавите по някакъв начин в цикъла.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Актуализирайте множество колони въз основа на процентно изчисление в Oracle

  2. Oracle:Как да открием прекратяване на процес на клиент, както работи за sqlplus?

  3. MySQL COALESCE и NULLIF функция

  4. Как да стартирате sql скриптове от pl sql процедура

  5. Увеличете производителността с групово събиране в Oracle