sql >> データベース >  >> RDS >> Oracle

例外後もマージを続行します

    これは、error_logging_clause を使用して実行できます。 。 (マージ 挿入と同じ動作をするということです。

    あなたの場合:

    -- You create your Log Table
    EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('copy_emp', 'TAB_ERR_COPY_EMP');
    
    
        MERGE INTO copy_emp c
         USING employees e
         ON (c.employee_id = e.employee_id)
       WHEN MATCHED THEN
         UPDATE SET
           c.first_name     = e.first_name,
           c.last_name      = e.last_name,
           c.email          = e.email,
           c.phone_number   = e.phone_number,
           c.hire_date      = e.hire_date,
           c.job_id         = e.job_id,
           c.salary         = e.salary,
           c.commission_pct = e.commission_pct,
           c.manager_id     = e.manager_id,
           c.department_id  = e.department_id
       WHEN NOT MATCHED THEN
         INSERT VALUES(e.employee_id, e.first_name, e.last_name,
              e.email, e.phone_number, e.hire_date, e.job_id,
              e.salary, e.commission_pct, e.manager_id,
              e.department_id)
        LOG ERRORS INTO TAB_ERR_COPY_EMP('TAG_STATEMENT') REJECT LIMIT 100;
    

    error_logging_clauseにはいくつかの制限があることに注意してください。ドキュメントから:

    1. 次の条件により、ステートメントは失敗し、エラーログ機能を呼び出さずにロールバックします。

      • 延期された制約に違反しました。

      • 一意の制約またはインデックス違反を引き起こすダイレクトパスのINSERTまたはMERGE操作。

      • 一意のコンストレインターインデックス違反を発生させる更新操作UPDATEまたはMERGE)。

    2. LONG、LOB、またはオブジェクトタイプの列のエラーログテーブルでエラーを追跡することはできません。ただし、DML操作のターゲットとなるテーブルには、これらのタイプの列を含めることができます。

      • 対応するエラーログテーブルを作成または変更して、サポートされていないタイプの列が含まれるようにし、その列の名前がターゲットDMLテーブルのサポートされていない列に対応する場合、DMLステートメントは解析時に失敗します。

      • エラーログテーブルにサポートされていない列タイプが含まれていない場合、エラーの拒否制限に達するまで、すべてのDMLエラーがログに記録されます。エラーが発生した行については、エラーログテーブルの対応する列を持つ列値が制御情報とともにログに記録されます。



    1. Postgresがランダムに動作を停止しました(Rails、PGSQL.5432)

    2. ORA-00904:ID:識別子が無効です

    3. Doctrineを使用してデッドロック後にトランザクションを再試行するにはどうすればよいですか?

    4. SELECTPHPから変数を設定します