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. 2,000万行のデータセットを持つMySQLの重複アイテムを削除するにはどうすればよいですか?

    2. 外部キーとして複数の値を含むMySQL列を持つことは可能ですか?

    3. ORDERBYクエリで制限値に応じて異なるインデックスを使用するMySQL

    4. データベースとデータファイルを移行する方法