俊星的BLOG

          ORACLE Autonomous Transactions(自治事務)試用

          ORACLE自治事務是一個不錯的功能,關鍵字是AUTONOMOUS_TRANSACTION,下面是我試用:
          1、測試:
          創建一個測試表:
          CREATE TABLE TBL_TEST(
            TEST_ID 
          NUMBER NOT NULL,
            TEST_DESC 
          VARCHAR2(100NOT NULL
          );

          新增兩條記錄(注意沒有進行提交):
          INSERT INTO TBL_TEST VALUES(1,'DESC 1');
          INSERT INTO TBL_TEST VALUES(2,'DESC 2');

          通過自治事務添加6兩條記錄:
          DECLARE PRAGMA AUTONOMOUS_TRANSACTION;
          BEGIN
           
          FOR i IN 3..8 LOOP
            
          INSERT INTO TBL_TEST VALUES(i,'DESC '||i);
           
          END LOOP;
           
          COMMIT;
          END;
          /

          查看執行結果如下:
          SQL> SELECT * FROM TBL_TEST;
           
             TEST_ID TEST_DESC
          ---------- --------------------------------------------------------------------------------
                   
          1 DESC 1
                   
          2 DESC 2
                   
          3 DESC 3
                   
          4 DESC 4
                   
          5 DESC 5
                   
          6 DESC 6
                   
          7 DESC 7
                   
          8 DESC 8
           
          8 rows selected

          回滾后再次查看結果(通過結果可以看到采用自治事務的新增沒有被回滾掉):
          SQL> ROLLBACK;
           
          Rollback complete
          SQL> SELECT * FROM TBL_TEST
          ;
           
             TEST_ID TEST_DESC
          ---------- --------------------------------------------------------------------------------
                   
          3 DESC 3
                   
          4 DESC 4
                   
          5 DESC 5
                   
          6 DESC 6
                   
          7 DESC 7
                   
          8 DESC 8
           
          6 rows selected

          2、應用自治事務實現日志記錄:
          創建一個日志表:
          CREATE TABLE TBL_LOG(
            LOG_ID 
          NUMBER(10PRIMARY KEY,
            LOG_MSG 
          VARCHAR2(4000NOT NULL,
            LOG_TIME DATE 
          NOT NULL
          );

          創建一個序列:
          CREATE SEQUENCE SEQ_TBL_LOG;

          創建一個記錄日志的存儲過程:
          CREATE OR REPLACE PROCEDURE DO_LOG(P_MSG IN VARCHAR2AS 
           PRAGMA AUTONOMOUS_TRANSACTION;
          BEGIN
            
          INSERT INTO TBL_LOG VALUES(SEQ_TBL_LOG.NEXTVAL,P_MSG,SYSDATE);
            
          COMMIT;
          END;
          /

          測試上面的存儲過程:
          BEGIN
            
          INSERT INTO TBL_TEST VALUES (100,'DESC 100');
            
          -- test the do_log
            INSERT INTO TBL_TEST VALUES (101,NULL);
          EXCEPTION
            
          WHEN OTHERS THEN
              DO_LOG(P_MSG 
          =>SQLERRM);
              
          ROLLBACK;
          END;
          /

          查看運行結果:
          SQL> SELECT * FROM TBL_TEST WHERE TEST_ID>=100;
           
             TEST_ID TEST_DESC
          ---------- --------------------------------------------------------------------------------
          SQL> SELECT * FROM TBL_LOG
          ;
           
               LOG_ID LOG_MSG                                                                          LOG_TIME
          ----------- -------------------------------------------------------------------------------- -----------
                    
          1 ORA-01400: 無法將 NULL 插入 ("FWMS4ZH_TEST"."TBL_TEST"."TEST_DESC")              2009-5-15 2

          posted on 2009-05-15 20:19 俊星 閱讀(246) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 宿松县| 米易县| 龙井市| 大化| 扶风县| 永州市| 成都市| 广宗县| 曲沃县| 淮阳县| 措勤县| 宁城县| 湖州市| 广宁县| 故城县| 滦平县| 襄汾县| 垣曲县| 颍上县| 介休市| 铜山县| 娱乐| 连南| 珠海市| 惠安县| 平定县| 谢通门县| 涡阳县| 容城县| 阳城县| 永兴县| 青铜峡市| 十堰市| 花莲市| 徐州市| 永川市| 彰化县| 龙南县| 井研县| 潼关县| 贵阳市|