隨筆-94  評論-56  文章-3  trackbacks-0
          關于觸發器、存儲過程和DBlink的綜合運用
          需求描述:
          需要在兩個不同oracl數據庫實例中進行數據邏輯處理。如果A實例中的表有新數據插入或者數據更新,那么在B實例中執行與之相關的存儲過程。
          先假設A數據用戶中表TEST有變動,那么觸發器觸發調用實例B中的存儲過程改寫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對應的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.建立觸發器
          ------------------------------------------------------------------
          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('記錄已經成功插入,并已記錄到日志');
          ELSIF UPDATING THEN 
            v_type := 'UPDATE';
            DBMS_OUTPUT.PUT_LINE('記錄已經成功更新,并已記錄到日志');
          ELSIF DELETING THEN
            v_type := 'DELETE';
            DBMS_OUTPUT.PUT_LINE('記錄已經成功刪除,并已記錄到日志');
          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.建存儲過程
          注意一定要加上PRAGMA AUTONOMOUS_TRANSACTION;讓這個存儲過程有自治的事務控制,不然會影響A的事務控制
          ----------------------------------------------------------------
          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;
          ---------------------------------------------------------------

          最后我們在A中輸入以下測試語句:
          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;


          結果可能如下:
          TEST無數據
          TEST_LOG數據
          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 小言身寸 閱讀(968) 評論(0)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 周至县| 成武县| 湘潭县| 巫山县| 宕昌县| 山东省| 佛教| 尉氏县| 达孜县| 荃湾区| 浑源县| 吴桥县| 芮城县| 大同县| 惠安县| 湘乡市| 岳西县| 大冶市| 安远县| 霍林郭勒市| 沂南县| 淮北市| 收藏| 上林县| 夏津县| 武清区| 江油市| 孝义市| 改则县| 甘南县| 海口市| 高碑店市| 天等县| 新乐市| 自治县| 浑源县| 拜泉县| 七台河市| 鄢陵县| 沂南县| 南安市|