U kunt dit doen met de error_logging_clause . (De link is voor de insert omdat in de documentatie van MERGE er staat dat het hetzelfde gedrag heeft als een insert.
Voor jouw geval:
-- 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;
Houd er rekening mee dat er enkele beperkingen zijn voor de error_logging_clause. Uit de documentatie:
-
De volgende omstandigheden zorgen ervoor dat de instructie mislukt en terugdraait zonder de mogelijkheid voor foutregistratie aan te roepen:
-
Overtreden uitgestelde beperkingen.
-
Elke directe-pad INSERT- of MERGE-bewerking die een unieke beperking of indexschending veroorzaakt.
-
Elke update-bewerking UPDATE of MERGE die een unieke schending van de beperkingsindex oplevert).
-
-
U kunt geen fouten volgen in de foutregistratietabel voor kolommen LONG, LOB of objecttype. De tabel die het doel is van de DML-bewerking kan dit soort kolommen echter bevatten.
-
Als u de corresponderende foutregistratietabel maakt of wijzigt zodat deze een kolom van een niet-ondersteund type bevat, en als de naam van die kolom overeenkomt met een niet-ondersteunde kolom in de doel-DML-tabel, mislukt de DML-instructie tijdens het parseren.
-
Als de foutregistratietabel geen niet-ondersteunde kolomtypen bevat, worden alle DML-fouten geregistreerd totdat de afwijzingslimiet voor fouten is bereikt. Voor rijen waarin fouten optreden, worden kolomwaarden met corresponderende kolommen in de foutregistratietabel samen met de controle-informatie gelogd.
-