首页  »   Oracle技术

Oracle PL/SQL 错误处理中的回滚有关问题:删除父表记录,在错误处理中回滚后,只能恢复父表记录,对应的子表记录自动随父表记录删除后无法恢复

网友分享于:2015-09-11  浏览:1次
Oracle PL/SQL 异常处理中的回滚问题:删除父表记录,在异常处理中回滚后,只能恢复父表记录,对应的子表记录自动随父表记录删除后无法恢复

       -- 【测试用表】
DROP TABLE child CASCADE CONSTRAINTS PURGE;
CREATE TABLE child(
c1 NUMBER CONSTRAINT child_c1_pk PRIMARY KEY,
c2 NUMBER
);
DROP TABLE parent CASCADE CONSTRAINTS PURGE;
CREATE TABLE parent(
c1 NUMBER CONSTRAINT parent_c1_pk  PRIMARY KEY
);
INSERT INTO parent (c1) values (1);
INSERT INTO parent (c1) values (2);
INSERT INTO parent (c1) values (3);
ALTER TABLE child
ADD CONSTRAINT child_c2_parent_c1_fk 
FOREIGN KEY(c2) 
REFERENCES parent(c1);
INSERT INTO child VALUES(1,2);
SELECT * FROM child;
SELECT * FROM parent;
       /*
【ORA-02292: 违反完整约束条件 (JSD1403.CHILD_C2_PARENT_C1_FK) - 已找到子记录】
若 child 表中已存在某记录的字段 c2=2 ,则由于该字段添加了外键约束,
外键关联了 parent 表的 c1 字段, 不能将 parent 表中 c1=2  的记录删除。
*/
-- 未定义异常处理器,自动回滚。
DECLARE
e_childExist EXCEPTION;
PRAGMA EXCEPTION_INIT(e_childExist, -2292);
BEGIN
DELETE FROM PARENT WHERE c1=2;
END;
/
-- 【遗留问题】:PL/SQL 删除外键关联的父表记录,回滚后子表记录无法恢复
-- 外键关联:子表数据无法回滚?
DECLARE
e_childExist EXCEPTION;
PRAGMA EXCEPTION_INIT(e_childExist, -2292);
BEGIN
DELETE FROM PARENT WHERE c1=2;
EXCEPTION
WHEN e_childExist THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('错误类型:e_childExist');
END;
/

------解决思路----------------------
这个不是 ORACLE 的问题

INSERT INTO child VALUES(1,2);

上面的语句执行后,你应该 commit 一下,但是你没的,所以 rollback 把这个语句也 一起回滚了。

------解决思路----------------------
你手动加一个 commit 试试。

相关解决方案

最新解决方案