Cách duy nhất (tôi biết) để tìm ra hàng nào gây ra sự cố là sử dụng tính năng "đăng nhập lỗi vào" của Oracle. Bằng cách đó, insert
sẽ không đưa ra ngoại lệ và bất kỳ hàng nào vi phạm bất kỳ ràng buộc nào sẽ được ghi vào bảng lỗi được chỉ định.
Để làm điều đó, trước tiên bạn cần tạo một bảng nhật ký chứa các hàng bị từ chối:
EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('BD_VEHICLES_TEMP');
Điều đó sẽ tạo một bảng có tên ERR$_BD_VEHICLES_TEMP
Sau đó chạy thay đổi câu lệnh của bạn thành sau:
insert into bd_vehicles_temp
select *
from bd_vehicles_temp_1
LOG ERRORS REJECT LIMIT UNLIMITED;
Câu lệnh sẽ tiếp tục ngay cả khi một hàng không xác thực được các ràng buộc. Sau khi câu lệnh kết thúc, bạn có thể kiểm tra nội dung của bảng ERR$_BD_VEHICLES_TEMP
cho các hàng vi phạm một ràng buộc bao gồm thông báo lỗi và các giá trị.
(Chỉnh sửa):Nếu bạn muốn dừng ở lỗi đầu tiên (và xem điều đó trong bảng nhật ký), hãy bỏ đi REJECT LIMIT UNLIMITED
mệnh đề.
Thông tin chi tiết có trong sách hướng dẫn:
- cho DBMS_ERRLOG http:// docs. oracle.com/cd/B28359_01/appdev.111/b28419/d_errlog.htm#CEGBBABI
- đối với mệnh đề LOG ERRORS INTO: http ://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9014.htm#BGBEIACB