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的内容也不会回滚了.