鉴于此示例(DUP_VAL_ON_INDEX Exception),是否可以捕获违反约束的值以便记录它们?
如果批量插入产生多个违规,方法是否相同?
BEGIN
-- want to capture '01' and '02'
INSERT INTO Employee(ID)
SELECT ID
FROM (
SELECT '01' ID FROM DUAL
UNION
SELECT '02' ID FROM DUAL
);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
-- log values here
DBMS_OUTPUT.PUT_LINE('Duplicate value on an index');
END;
答案 0 :(得分:5)
理想情况下,我建议使用DML错误日志记录。例如
创建错误日志表
begin
dbms_errlog.create_error_log( dml_table_name => 'EMPLOYEE',
err_log_table_name => 'EMPLOYEE_ERR' );
end;
使用DML错误记录
BEGIN
insert into employee( id )
select id
from (select '01' id from dual
union all
select '02' from dual)
log errors into employee_err
reject limit unlimited;
END;
对于每个失败的行,这会将该行的数据与异常一起记录到EMPLOYEE_ERR
表中。然后,您可以查询错误日志表以查看所有错误,而不是只获取失败的第一行。
如果不能创建错误日志表,则可以使用批量操作从SQL移动到PL / SQL。这会慢一些,但您可以使用SAVE EXCEPTIONS
语句的FORALL
子句创建一个嵌套的异常表,然后您可以迭代它。
答案 1 :(得分:0)
对于有兴趣了解更多信息的人,请阅读此link。