鉴于这种例子( DUP_VAL_ON_INDEX例外 ),才可能捕捉违反了约束,使他们可能会记录值是多少?
请问方法是相同的,如果有一个批量插入产生多个违规?
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;
理想情况下,我会建议使用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
语句来创建例外然后你可以遍历的嵌套表。