隨筆-94  評(píng)論-56  文章-3  trackbacks-0
          關(guān)于觸發(fā)器、存儲(chǔ)過(guò)程和DBlink的綜合運(yùn)用
          需求描述:
          需要在兩個(gè)不同oracl數(shù)據(jù)庫(kù)實(shí)例中進(jìn)行數(shù)據(jù)邏輯處理。如果A實(shí)例中的表有新數(shù)據(jù)插入或者數(shù)據(jù)更新,那么在B實(shí)例中執(zhí)行與之相關(guān)的存儲(chǔ)過(guò)程。
          先假設(shè)A數(shù)據(jù)用戶中表TEST有變動(dòng),那么觸發(fā)器觸發(fā)調(diào)用實(shí)例B中的存儲(chǔ)過(guò)程改寫TEST_LOG表
          A中操作如下:
          1.建表
          -------------------------------------------------------------------
          create table TEST
          (
            T_ID   NUMBER(4),
            T_NAME VARCHAR2(20),
            T_AGE  NUMBER(2),
            T_SEX  CHAR(1)
          );
          -------------------------------------------------------------------
          2.建立與B對(duì)應(yīng)的DBLINK
          -------------------------------------------------------------------
          create database link INFOSYSTEM
             connect to infosystem identified by infosystem
             using '(DESCRIPTION =
               (ADDRESS_LIST =
                 (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.249)(PORT = 1521))
               )
               (CONNECT_DATA =
                 (SERVICE_NAME = ORCL)
               )
             )';
          ------------------------------------------------------------------
          3.建立觸發(fā)器
          ------------------------------------------------------------------
          CREATE OR REPLACE TRIGGER test_trigger
          AFTER DELETE OR INSERT OR UPDATE ON test
          DECLARE
          v_type VARCHAR2(15);
          BEGIN
          IF INSERTING THEN 
            v_type := 'INSERT';
            DBMS_OUTPUT.PUT_LINE('記錄已經(jīng)成功插入,并已記錄到日志');
          ELSIF UPDATING THEN 
            v_type := 'UPDATE';
            DBMS_OUTPUT.PUT_LINE('記錄已經(jīng)成功更新,并已記錄到日志');
          ELSIF DELETING THEN
            v_type := 'DELETE';
            DBMS_OUTPUT.PUT_LINE('記錄已經(jīng)成功刪除,并已記錄到日志');
          END IF;
            my_pro@infosystem(v_type);
          END;
          ----------------------------------------------------------------

          B中操作如下:
          1.建表
          ----------------------------------------------------------------
          create table TEST_LOG
          (
            L_USER VARCHAR2(15),
            L_TYPE VARCHAR2(15),
            L_DATE VARCHAR2(30)
          );
          ----------------------------------------------------------------
          2.建存儲(chǔ)過(guò)程
          注意一定要加上PRAGMA AUTONOMOUS_TRANSACTION;讓這個(gè)存儲(chǔ)過(guò)程有自治的事務(wù)控制,不然會(huì)影響A的事務(wù)控制
          ----------------------------------------------------------------
          create or replace procedure my_pro(v_type varchar2)
          as
          PRAGMA AUTONOMOUS_TRANSACTION;
          begin
          INSERT INTO test_log VALUES(user,v_type,
                  TO_CHAR(sysdate,'yyyy-mm-dd hh24:mi:ss'));
          commit;
          end;
          ---------------------------------------------------------------

          最后我們?cè)贏中輸入以下測(cè)試語(yǔ)句:
          INSERT INTO test VALUES(101,'zhao',22,'M');
          UPDATE test SET t_age = 30 WHERE t_id = 101;
          DELETE test WHERE t_id = 101;

          SELECT * FROM test;
          SELECT * FROM test_log@INFOSYSTEM;


          結(jié)果可能如下:
          TEST無(wú)數(shù)據(jù)
          TEST_LOG數(shù)據(jù)
          1 AAAPF0AALAAABq8AAA INFOSYSTEM DELETE 2009-06-12 13:45:30
          2 AAAPF0AALAAABq8AAL INFOSYSTEM INSERT 2009-06-12 13:45:30
          3 AAAPF0AALAAABq8AAM INFOSYSTEM UPDATE 2009-06-12 13:45:30
          posted on 2010-02-04 11:57 小言身寸 閱讀(965) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 大渡口区| 浦北县| 蓝山县| 饶平县| 弋阳县| 海林市| 威信县| 页游| 额敏县| 磐石市| 瑞丽市| 双柏县| 鄱阳县| 新竹县| 营山县| 大同县| 温宿县| 治县。| 中宁县| 安徽省| 楚雄市| 巴彦淖尔市| 稻城县| 于田县| 忻州市| 长海县| 台州市| 堆龙德庆县| 休宁县| 当涂县| 台前县| 宜春市| 留坝县| 和平区| 杨浦区| 苗栗县| 南雄市| 嘉兴市| 清水河县| 军事| 郸城县|