关于commit 和 rollback
在存储过程中
1、没有显示commit;
不退出session的话,是不会提交的,此时如果rollback,则回滚,如果commit则提交, 如果disconn的话,会自动提交;
2、有显示commit; 那么会自动提交
3、既有commit也有rollback,commit之前的就提交,commit和rollback之间的就回滚.
4、没有显示commit和rollback, 如果程序出错,则强制退出程序并回滚.
捕捉异常回滚
DECLARE
dept_no NUMBER (2) := 70;
BEGIN
--开始事务
INSERT INTO dept
VALUES (dept_no, '市场部', '北京'); --插入部门记录
INSERT INTO dept
VALUES (dept_no, '后勤部', '上海'); --插入相同编号的部门记录
INSERT INTO emp --插入员工记录
VALUES (7997, '威尔', '销售人员', NULL, TRUNC (SYSDATE), 5000,300, dept_no);
--提交事务
COMMIT;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN --捕足异常
DBMS_OUTPUT.PUT_LINE(SQLERRM); --显示异常消息
ROLLBACK; --回滚异常
WHEN OTHERS THEN
ROLLBACK;
END;
DECLARE
dept_no NUMBER (2) :=90;
BEGIN
--开始事务
SAVEPOINT A;
INSERT INTO dept
VALUES (dept_no, '市场部', '北京'); --插入部门记录
SAVEPOINT B;
INSERT INTO emp --插入员工记录
VALUES (7997, '威尔', '销售人员', NULL, TRUNC (SYSDATE), 5000,300, dept_no);
SAVEPOINT C;
INSERT INTO dept
VALUES (dept_no, '后勤部', '上海'); --插入相同编号的部门记录
--提交事务
COMMIT;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN --捕足异常
DBMS_OUTPUT.PUT_LINE(SQLERRM); --显示异常消息
ROLLBACK TO B; --回滚异常
END;