PL/SQL block中异常对事物的影响

/*
===========================================================================
================pl/sql block中exception对transaction的影响=================
    没有excepion block的pl/sql中,所有sql语句保持一个原子性,如果发生异常,就
整个roll back(异常一直向外抛出,直到终端)
    如果增加了excepion捕获,就仅roll back发生异常的sql
===========================================================================
*/
DROP TABLE t PURGE;

CREATE TABLE t (x INT CHECK (x>0));

--没有异常捕获,所以整个roll back
DECLARE
BEGIN
  INSERT INTO t(x) VALUES(1);
  INSERT INTO t(x) VALUES(-1);
  COMMIT;
END;
/

--增加异常捕获之后(在异常处理中commit),前面的sql被提交
DECLARE
BEGIN
  INSERT INTO t (x) VALUES (1);
  INSERT INTO t (x) VALUES (-1);
  COMMIT;
EXCEPTION
  WHEN OTHERS THEN
    COMMIT;
END;
/

posted on 2012-02-10 15:26  wait4friend  阅读(283)  评论(0编辑  收藏  举报