sql >> Databáze >  >> RDS >> Oracle

Oracle provést okamžité neprovedení bez jakékoli chyby

Důvod, proč váš kód nic nedělá, je tento:

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

Testujete c1%ROWCOUNT než provedete načtení. Jeho hodnota je tedy 0; Hádám p_SCBCount není v tomto bodě nula (protože jste jej inicializovali na nějakou hodnotu v bloku DECLARE), takže test se vyhodnotí jako true a program se ukončí.

Alternativně je problém tento:

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

Nemůžeme použít FOR ... IN s explicitním kurzorem. Otevřeli jste kurzor. Poté FOR pokusí se jej znovu otevřít, což mrští ORA-06511: PL/SQL: cursor already open . Pokud se tato chyba nezobrazuje, musíte mít obslužnou rutinu výjimky, která ji potlačí (např. WHEN others then null; ).

Vnější smyčka je v podstatě zcela zbytečná a měli byste ji zahodit.

Explicitní řízení smyčky je zřídka nutné:stačí použít FOR ... IN vytvořit a nechat Oracle řídit tok.

Zbytečný je také veškerý dynamický SQL. SQL pracuje s proměnnými, takže stačí napsat statické SQL, které odkazuje na atributy kurzoru:

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

Nejsem si jistý účelem c1%ROWCOUNT <> p_SCBCount . Domnívám se, že je to zbytečné, protože FOR LOOP přesně řídí aporty. Ve skutečnosti mám podezření, že jste to přidali, abyste se vyhnuli vedlejším účinkům vnořených smyček; a mám podezření, že jste zavedli pouze vnořené smyčky, protože jste vrhli původní kód PLS-00376: illegal EXIT/CONTINUE statement; it must appear inside a loop (jen divoký odhad).

Pokud však slouží k implementaci nějaké skutečné obchodní logiky, můžete ji do smyčky nějak přidat.



  1. Jak uložit více položek do sloupce databáze?

  2. Jak získat neseskupené sloupce v příkazu SQL (podobně jako v MySQL)

  3. Chyba MySQL 1452 (23000):Nelze přidat nebo aktualizovat podřízený řádek

  4. Jak zjistit, zda funkce v PostgreSQL existuje?