隨筆-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)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 东阳市| 洪泽县| 沿河| 盘山县| 苏尼特右旗| 内丘县| 余干县| 温州市| 柘城县| 葵青区| 高州市| 乃东县| 民勤县| 博湖县| 体育| 库尔勒市| 汉中市| 油尖旺区| 林周县| 皋兰县| 罗甸县| 思南县| 咸丰县| 沭阳县| 抚宁县| 澄城县| 樟树市| 金塔县| 博罗县| 陵川县| 江北区| 昌图县| 旺苍县| 巴林左旗| 沁水县| 公主岭市| 怀集县| 仲巴县| 清原| 丰城市| 烟台市|