日期:2014-05-16  浏览次数:20527 次

(转)Oracle存储过程异常处理事务特性分析

?Oracle存储过程中的事务是如何处理的?通常情况下。整个过程是作为一个事务整体被提交或回滚的,这属于数据库的基本知识,这里简单说明:
??1通常情况
通常情况下,oralce将整个存储过程作为一个事务整体,整个过程内的事务,要么都提交,要么都回滚。?
如下例所示:
例1

  1. SQL*Plus: Release 11.2.0.1.0 Production on 星期三 1月 4 13:24:22 2012
  2. Copyright (c) 1982, 2010, Oracle.??All rights reserved.
  3. 请输入用户名:??SYSTEM
  4. 输入口令:
  5. 连接到:
  6. Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
  7. With the Partitioning, OLAP, Data Mining and Real Application Testing options
  8. SQL> CREATE TABLE T1 (C INT,D INT NOT NULL);
  9. 表已创建。
  10. SQL> create or replace procedure pt1 is begin
  11. ??2? ? insert into t1 values(1,1);
  12. ??3? ? INSERT INTO T1 VALUES(2,NULL);
  13. ??4? ? end;
  14. ??5??/
  15. 过程已创建。
  16. SQL> CALL PT1();
  17. CALL PT1()
  18. ? ???*
  19. 第 1 行出现错误:
  20. ORA-01400: 无法将 NULL 插入 ("SYSTEM"."T1"."D")
  21. ORA-06512: 在 "SYSTEM.PT1", line 3
  22. ?
  23. SQL> SELECT * FROM T1;
  24. 未选定行

在这个例子中,我们构造了D列不允许为空的表,并故意在过程中执行一个违反约束的插入语句,造成过程调用的回滚操作,最终通过查询表T1,我们发现执行过程的时候,整个过程内的2条INSERT语句都被回滚了。这证明了在通常情况下,存储过程是作为一个事务整体的。
另一方面需要说明的是,在非自动提交的情况下,存储过程除非内部显式的执行了commit操作,否则即便整个过程执行成功,当前事务也是未提交的,这是存储过程的另一个特点:存储过程并不会自动提交。?例子如下:
例2

  1. SQL> create or replace procedure pt1 is begin
  2. ??2? ? insert into t1 values(1,1);
  3. ??3? ?-- INSERT INTO T1 VALUES(2,NULL);
  4. ??4? ? end;
  5. ??5??/
  6. 过程已创建。
  7. SQL> select * from t1;
  8. 未选定行
  9. SQL> call pt1();
  10. 调用完成。
  11. SQL> select * from t1;
  12. ? ?? ?? ?C? ?? ?? ? D
  13. ---------- ----------
  14. ? ?? ?? ?1? ?? ?? ? 1
  15. SQL> commit; --在这里显式提交
  16. 提交完成。