Bạn có thể thực hiện việc này với error_logging_clause . (Liên kết dành cho phần chèn vì trong tài liệu của MERGE nó nói rằng nó có hành vi giống như một phần chèn.
Đối với trường hợp của bạn:
-- 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;
Xin lưu ý rằng có một số hạn chế đối với error_logging_clause. Từ tài liệu:
-
Các điều kiện sau đây khiến câu lệnh bị lỗi và quay ngược trở lại mà không cần gọi khả năng ghi lỗi:
-
Các ràng buộc hoãn lại bị vi phạm.
-
Bất kỳ thao tác INSERT hoặc MERGE đường dẫn trực tiếp nào gây ra vi phạm chỉ mục hoặc ràng buộc đơn.
-
Bất kỳ hoạt động cập nhật UPDATE hoặc MERGE nào làm tăng vi phạm chỉ mục trình giới hạn duy nhất).
-
-
Bạn không thể theo dõi lỗi trong bảng ghi lỗi cho các cột DÀI, LOB, loại đối tượng. Tuy nhiên, bảng là mục tiêu của hoạt độngDML có thể chứa các loại cột này.
-
Nếu bạn tạo hoặc sửa đổi bảng ghi lỗi tương ứng để chứa một cột thuộc loại không được hỗ trợ và nếu tên của cột đó tương ứng với cột không được hỗ trợ trong bảng DML đích, thì câu lệnh DML không thành công tại thời điểm phân tích cú pháp.
-
Nếu bảng ghi lỗi không chứa bất kỳ kiểu cột nào không được hỗ trợ, thì tất cả các lỗi DML sẽ được ghi lại cho đến khi đạt đến giới hạn loại bỏ lỗi. Đối với các hàng có lỗi xảy ra, giá trị cột với các cột tương ứng trong bảng ghi lỗi được ghi cùng với thông tin điều khiển.
-