少年阿賓

          那些青春的歲月

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

          這段時(shí)間遇到一個(gè)問題,程序里明明插入了一條記錄,但在后邊的一段Procedure中卻查不到剛剛插入的記錄,最后發(fā)現(xiàn)這個(gè)Procedure的定義中加入了PRAGMA AUTONOMOUS_TRANSACTION

          PRAGMA AUTONOMOUS_TRANSACTION中文翻譯過來叫“自治事務(wù)”(翻譯的還算好理解),對(duì)于定義成自治事務(wù)的Procedure,實(shí)際上相當(dāng)于一段獨(dú)立運(yùn)行的程序段,這段程序不依賴于主程序,也不干涉主程序



          自治事務(wù)的特點(diǎn)

          第一,這段程序不依賴于原有Main程序,比如Main程序中有未提交的數(shù)據(jù),那么在自治事務(wù)中是查找不到的。

          第二,在自治事務(wù)中,commit或者rollback只會(huì)提交或回滾當(dāng)前自治事務(wù)中的DML,不會(huì)影響到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  




          轉(zhuǎn)載請(qǐng)注明出處:http://blog.csdn.net/pan_tian/article/details/7675800




          posted on 2013-03-08 16:29 abin 閱讀(483) 評(píng)論(0)  編輯  收藏 所屬分類: oracle
          主站蜘蛛池模板: 南丹县| 林州市| 西安市| 西乌| 峨眉山市| 昌图县| 贵港市| 榆社县| 西平县| 盐亭县| 安顺市| 犍为县| 遂平县| 新田县| 建瓯市| 太和县| 嫩江县| 东丽区| 甘泉县| 时尚| 渝北区| 三台县| 闽清县| 武邑县| 门头沟区| 河池市| 深州市| 湖北省| 民乐县| 湘潭县| 科技| 内乡县| 大化| 河曲县| 邹城市| 定西市| 无极县| 菏泽市| 汝南县| 灵璧县| 松江区|