少年阿宾

那些青春的岁月

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

这段时间遇到一个问题,程序里明明插入了一条记录,但在后边的一段Procedure中却查不到刚刚插入的记录,最后发现这个Procedure的定义中加入了PRAGMA AUTONOMOUS_TRANSACTION

PRAGMA AUTONOMOUS_TRANSACTION中文翻译过来叫“自治事务”(翻译的还算好理解),对于定义成自治事务的Procedure,实际上相当于一段独立运行的程序段,这段程序不依赖于主程序,也不干涉主程序



自治事务的特点

第一,这段程序不依赖于原有Main程序,比如Main程序中有未提交的数据,那么在自治事务中是查找不到的。

第二,在自治事务中,commit或者rollback只会提交或回滚当前自治事务中的DML,不会影响到Main程序中的DML。


Autonomous Transaction Demo 1

Without Pragma Autonomous Transaction

CREATE TABLE t (  
test_value VARCHAR2(25));  
  
CREATE OR REPLACE PROCEDURE child_block IS  
  
BEGIN  
  INSERT INTO t  
  (test_value)  
  VALUES  
  ('Child block insert');  
  COMMIT;  
END child_block;  
/  
  
CREATE OR REPLACE PROCEDURE parent_block IS  
  
BEGIN  
  INSERT INTO t  
  (test_value)  
  VALUES  
  ('Parent block insert');  
  
   child_block;  
  
   ROLLBACK;  
END parent_block;  
/  
  
-- run the parent procedure   
exec parent_block  
  
-- check the results   
SELECT * FROM t;  



Output:  
Parent block insert  
Child block insert  




With Pragma Autonomous Transaction

CREATE OR REPLACE PROCEDURE child_block IS  
  
PRAGMA AUTONOMOUS_TRANSACTION;  
  
BEGIN  
  INSERT INTO t  
  (test_value)  
  VALUES  
  ('Child block insert');  
  
  COMMIT;  
END child_block;  
/  
  
CREATE OR REPLACE PROCEDURE parent_block IS  
  
BEGIN  
  INSERT INTO t  
  (test_value)  
  VALUES  
  ('Parent block insert');  
  
   child_block;  
  
   ROLLBACK;  
END parent_block;  
/  
-- empty the test table   
TRUNCATE TABLE t;  
  
-- run the parent procedure   
exec parent_block;  
  
-- check the results   
SELECT * FROM t;  

 



Output:  
Child block insert  



Autonomous Transaction Demo 2

Without Pragma Autonomous Transaction
DROP TABLE t; 
 
CREATE TABLE t (testcol NUMBER); 
 
CREATE OR REPLACE FUNCTION howmanyrows RETURN INTEGER IS 
 i INTEGER; 
BEGIN 
  SELECT COUNT(*) 
  INTO i 
  FROM t; 
 
  RETURN i; 
END howmanyrows; 

 
CREATE OR REPLACE PROCEDURE testproc IS 
 a INTEGER; 
 b INTEGER; 
 c INTEGER; 
BEGIN 
  SELECT COUNT(*) 
  INTO a 
  FROM t; 
 
  INSERT INTO t VALUES (1); 
  COMMIT; 
 
  INSERT INTO t VALUES (2); 
  INSERT INTO t VALUES (3); 
 
  b := howmanyrows; 
 
  INSERT INTO t VALUES (4); 
  INSERT INTO t VALUES (5); 
  INSERT INTO t VALUES (6); 
  COMMIT; 
 
  SELECT COUNT(*) 
  INTO c 
  FROM t; 
 
  dbms_output.put_line(a); 
  dbms_output.put_line(b); 
  dbms_output.put_line(c); 
END testproc; 

 
set serveroutput on 
 
exec testproc 




Output:  
0  
3  
6  
Total execution time 2.782 sec.  




With Pragma Autonomous Transaction



Output:  
0  
1  
6  




转载请注明出处:http://blog.csdn.net/pan_tian/article/details/7675800




posted on 2013-03-08 16:29 abin 阅读(462) 评论(0)  编辑  收藏 所属分类: oracle

只有注册用户登录后才能发表评论。


网站导航: