コードが何もしない理由は次のとおりです:
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
(ただの大げさな推測です。)
ただし、本物のビジネスロジックを実装するのに役立つ場合は、何らかの方法でループに追加できます。