Oracle
 sql >> Datenbank >  >> RDS >> Oracle

MERGE nach AUSNAHME fortsetzen

Sie können dies mit der error_logging_clause tun . (Der Link ist für die Einfügung da in der Dokumentation von VERBINDEN es sagt, dass es das gleiche Verhalten wie eine Einfügung hat.

Für Ihren Fall:

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

Bitte beachten Sie, dass es einige Einschränkungen für die error_logging_clause gibt. Aus der Dokumentation:

  1. Die folgenden Bedingungen führen dazu, dass die Anweisung fehlschlägt und zurückgesetzt wird, ohne die Fehlerprotokollierungsfunktion aufzurufen:

    • Verletzt verzögerte Beschränkungen.

    • Jede INSERT- oder MERGE-Operation im direkten Pfad, die eine Uniqueconstraint- oder Indexverletzung auslöst.

    • Jede Aktualisierungsoperation UPDATE oder MERGE, die eine Verletzung des eindeutigen Einschränkungsindex auslöst).

  2. Sie können Fehler in der Fehlerprotokollierungstabelle für LONG-, LOB- oder Objekttypspalten nicht nachverfolgen. Die Tabelle, die das Ziel der DML-Operation ist, kann jedoch diese Spaltentypen enthalten.

    • Wenn Sie die entsprechende Fehlerprotokollierungstabelle erstellen oder ändern, sodass sie eine Spalte eines nicht unterstützten Typs enthält, und wenn der Name dieser Spalte einer nicht unterstützten Spalte in der Ziel-DML-Tabelle entspricht, schlägt die DML-Anweisung zum Zeitpunkt der Analyse fehl.

    • Wenn die Fehlerprotokollierungstabelle keine nicht unterstützten Spaltentypen enthält, werden alle DML-Fehler protokolliert, bis die Ablehnungsgrenze für Fehler erreicht ist. Für Zeilen, in denen Fehler auftreten, werden Spaltenwerte mit den entsprechenden Spalten in der Fehlerprotokollierungstabelle zusammen mit den Kontrollinformationen protokolliert.