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)
理想情况下,我建议使用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来创建一个嵌套的异常表,然后你可以迭代它.
| 归档时间: |
|
| 查看次数: |
1624 次 |
| 最近记录: |