捕获触发DUP_VAL_ON_INDEX的值

cra*_*aig 2 oracle constraints oracle10g

鉴于此示例(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;
Run Code Online (Sandbox Code Playgroud)

Jus*_*ave 5

理想情况下,我建议使用DML错误日志记录.例如

创建错误日志表

begin
  dbms_errlog.create_error_log( dml_table_name => 'EMPLOYEE',
                                err_log_table_name => 'EMPLOYEE_ERR' );
end;
Run Code Online (Sandbox Code Playgroud)

使用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;
Run Code Online (Sandbox Code Playgroud)

对于每个失败的行,这会将该行的数据EMPLOYEE_ERR与异常一起记录到表中.然后,您可以查询错误日志表以查看所有错误,而不是仅获取失败的第一行.

如果不能创建错误日志表,则可以使用批量操作从SQL移动到PL/SQL.这将会更慢但你可以使用语句的SAVE EXCEPTIONS子句FORALL来创建一个嵌套的异常表,然后你可以迭代它.