暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 每当SQLERROR行为

ASKTOM 2019-06-12
599

问题描述

嗨,汤姆,


我们正在编写一个脚本来清理一些表格。在脚本中,我正在做以下事情

1.使用所需数据创建临时表
2.禁用原始表的fk约束
3.截断表
4.从临时表中插入数据
5.启用具有验证和异常的约束到异常表中

在脚本中我已经提到每当SQLERROR退出SQL.SQLCODE作为第一个语句。

我现在面临一个问题,即使我使用将约束异常启用到异常表选项,SQL脚本也会出现SQL错误 “无法启用约束 <约束名称>-找不到父键”。

我的问题是,无论何时SQLERROR,这种行为都是正确的,尽管我将异常放入异常表中,但错误将使语句强制退出。

感谢您提前提供的时间。

拉格德斯
拉文德·巴哈杜尔

专家解答

约束验证失败。将例外添加到子句不会使语句 “起作用”。它只是捕获所有违反约束的行。

你仍然会得到一个例外。所以每当SQLERROR退出触发,关闭连接

但你仍然应该有异常表中的冒犯性rowid:

create table exceptions (
  row_id     rowid,
  owner      varchar2(30),
  table_name varchar2(30),
  constraint varchar2(30)
);

whenever sqlerror exit

create table par ( c1 primary key ) as
  select level c1 from dual
  connect by level <= 10;
  
create table chd (
  c1 constraint fk 
    references par ( c1 ) 
    disable
);

insert into chd values ( -1 );
insert into chd values ( 0 );
insert into chd values ( 1 );

commit;

alter table chd 
  modify constraint fk
  enable
  exceptions into exceptions;

ERROR at line 2:
ORA-02298: cannot validate (CHRIS.FK) - parent keys not found

Disconnected from Oracle Database 18c EE High Perf Release 18.0.0.0.0 - Production
Version 18.6.0.0.0

C:\Users\csaxon>sqlplus chris@db18c

SQL*Plus: Release 18.0.0.0.0 - Production on Wed Jun 12 09:09:12 2019
Version 18.3.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

Last Successful login time: Wed Jun 12 2019 09:08:29 +01:00

Connected to:
Oracle Database 18c EE High Perf Release 18.0.0.0.0 - Production
Version 18.6.0.0.0

select rowid from exceptions;

ROWID
------------------
AAASQ6AAMAAAACeAAA
AAASQ6AAMAAAACeAAB

select * from exceptions;

ROW_ID               OWNER   TABLE_NAME   CONSTRAINT   
AAASQtAAMAAAACTAAA   CHRIS   CHD          FK            
AAASQtAAMAAAACTAAB   CHRIS   CHD          FK    

select status
from   user_constraints
where  constraint_name = 'FK';

STATUS
--------
DISABLED 
复制


在解决垃圾数据之前,验证外键时仍然会出现异常。你的脚本将终止。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论