oracle中的begin...end 语句块自记录

一直以来对oracle中嵌套的begin...end语句块都有一个疑问,

就是不清楚嵌套在同一个begin...end中的两个begin...end语句块是不是能算作同一个事务.

今天终于有点搞明白这个问题了,在此做个记录.

1.创建两个测试用表:

create table TEST1
(
  ID   VARCHAR2(10),
  NAME VARCHAR2(10)
)

insert into TEST1 (ID, NAME)
values ('1', '张三修改');

insert into TEST1 (ID, NAME)
values ('2', '李四');

insert into TEST1 (ID, NAME)
values ('3', '赵五');

create table TEST2
(
  ID  VARCHAR2(10),
  AGE number
)

insert into TEST2 (ID, AGE)
values ('1', '20');

insert into TEST2 (ID, AGE)
values ('2', '21');

2.用于执行测试的sql
DECLARE
  AS_rowcount NUMBER(10) := 0;
BEGIN
  BEGIN --1
    UPDATE TEST1 T SET T.NAME = T.NAME || '修改' WHERE T.ID = '1';
  EXCEPTION
    WHEN OTHERS THEN
      ROLLBACK;
      RETURN;
  END;
  AS_rowcount := 0;
  BEGIN --2
    SELECT COUNT(1) INTO AS_rowcount FROM TEST2 T WHERE T.ID = 3;
    IF AS_rowcount = 0 THEN
      ROLLBACK;
    END IF;
  EXCEPTION
    WHEN OTHERS THEN
      ROLLBACK;
      RETURN;
  END;
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
    RETURN;
END;

3.sql执行结果:

1:第一个begin...end语句块

2:第二个begin...end语句块

(1)

因为 2 中的 if 条件成立,

所以 1 中的sql语句最终也会回滚,update语句最终不会执行成功;

(2)

如果 1 中的update语句后加上commit语句,修改为

UPDATE TEST1 T SET T.NAME = T.NAME || '修改' WHERE T.ID = '1';

commit;

则尽管 2 中的 if 条件成立,1 中的update语句执行的结果已经提交,也不会回滚了.

总结:

自己把oracle中的事务和begin...end语句块理解混了,

以为begin...end语句中的内容就是同一个事务,一旦中途报错,所有操作就会回滚.

现在终于明白了:当中途没有commit语句,最后的end之前commit的时候确实可以算作是同一个事务的内容,中途报错全部回滚.

但是一旦中途出现commit语句的话,commit后面的语句就算报错,已经commit的内容也不会回滚了.

 

 

转载于:https://www.cnblogs.com/x5683f-blog/p/3410862.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值