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.