捕获触发DUP_VAL_ON_INDEX的值

时间:2012-11-26 16:35:15

标签: oracle oracle10g constraints

鉴于此示例(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;

2 个答案:

答案 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