Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle wykonuje natychmiastowe wykonanie bez żadnego błędu

Powodem, dla którego Twój kod nic nie robi, jest to:

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

Testujesz dla c1%ROWCOUNT zanim wykonasz pobieranie. Więc jego wartość to 0; Zgaduję p_SCBCount nie jest zerem w tym momencie (ponieważ zainicjalizowałeś go do pewnej wartości w bloku DECLARE), tak że test ma wartość prawda i program się kończy.

Alternatywnie problem polega na tym:

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

Nie możemy użyć FOR ... IN z wyraźnym kursorem. Otworzyłeś kursor. Następnie FOR próbuje go ponownie otworzyć, co powoduje wyświetlenie ORA-06511: PL/SQL: cursor already open . Jeśli nie widzisz tego błędu, musisz mieć program obsługi wyjątków, który go pomija (np. WHEN others then null; ).

Zasadniczo zewnętrzna pętla jest całkowicie niepotrzebna i należy ją wyrzucić.

Jawne sterowanie pętlą rzadko jest konieczne:wystarczy użyć FOR ... IN skonstruuj i pozwól Oracle kontrolować przepływ.

Zbędny jest również cały dynamiczny SQL. SQL działa ze zmiennymi, więc wystarczy napisać statyczny kod SQL, który odwołuje się do atrybutów kursora:

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

Nie jestem pewien celu c1%ROWCOUNT <> p_SCBCount . Moje przeczucie jest zbyteczne, ponieważ FOR LOOP precyzyjnie kontroluje pobieranie. W rzeczywistości podejrzewam, że dodałeś go, aby uniknąć skutków ubocznych zagnieżdżonych pętli; i podejrzewam, że wprowadziłeś tylko zagnieżdżone pętle, ponieważ jesteś oryginalnym kodem rzuconym PLS-00376: illegal EXIT/CONTINUE statement; it must appear inside a loop (tylko szalone zgadywanie).

Jeśli jednak służy to zaimplementowaniu prawdziwej logiki biznesowej, możesz jakoś dodać ją do pętli.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zrobić dynamiczny pivot z datą i kolejną kolumną w Oracle?

  2. Struktura i typy bloków Oracle PLSQL

  3. Odpytywanie podciągów na liście wartości

  4. Jak uzyskać prawe 10 miejsc sznurka w wyroczni?

  5. Limit znaków zwracanych w zapytaniu Oracle sql