Decode360's Blog

          業精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
            397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
          DML觸發器學習
          ?
          ??? 來了解一下觸發器的建立方法,以及各類觸發器的簡單介紹。首先看DML觸發器的語法:

          ??? CREATE [OR REPLACE] TRIGGER trigger_name
          ??? {BEFORE | AFTER }
          ??? {INSERT | DELETE | UPDATE [OF column [, column ...]]}
          ??? ON {[schema.] table_name | [schema.] view_name}
          ??? [PRFERENCING {OLD [AS] old | NEW [AS] new | PARENT as parent}]
          ??? [FOR EACH ROW ]
          ??? [WHEN condition]
          ??? Trigger body;
          ?
          ??? 說明:
          ??? 1、BEFORE/AFTER:指觸發時間在DML操作之前還是之后(對表配置約束時特別有用)
          ??? 2、DML包括INSERT、DELETE、UPDATE(可以只針對某幾列)
          ??? 3、FOR EACH ROW:表明是行級觸發器
          ?
          ?
          DML觸發器示例
          ?
          ??? 1、創建信息表和最終表
          ?
          ??? create table t11(a int,b varchar2(100));
          ??? insert into t11 values(1,'aaa');
          ??? insert into t11 values(1,'bbb');
          ??? insert into t11 values(1,'ccc');
          ??? insert into t11 values(2,'ddd');
          ??? insert into t11 values(2,'eee');
          ??? insert into t11 values(3,'fff');
          ??? insert into t11 values(4,'ggg');
          ??? insert into t11 values(5,'hhh');
          ??? commit;
          ?
          ??? create table t1_log(
          ?????? who varchar2(30),
          ?????? poer_date date
          ?????? );
          ?
          ??? 2、創建觸發器
          ?
          ??? create or replace trigger delete_trigger
          ????? after delete
          ????? on t11
          ????? for each row --行級觸發器
          ??? begin
          ????? insert into t1_log values(user,sysdate);
          ??? end;
          ?
          ??? 3、測試
          ?
          ??? delete from t11 where a=1;
          ?
          ??? SQL> select * from t1_log;
          ?
          ??? WHO????? POER_DATE
          ??? ------- -------------------
          ??? WXQ????? 2008-11-2 14:04:38
          ??? WXQ????? 2008-11-2 14:04:38
          ??? WXQ????? 2008-11-2 14:04:38
          ?
          ??? 注:若沒有for each row語句,則只插入一行記錄。
          ?
          ?
          觸發器的級聯
          ?
          ??? create table t1_a(id int);
          ??? create table t1_b(id int);
          ??? create table t1_c(id int);
          ?
          ??? create trigger tr_a
          ????? after insert
          ????? on t1_a
          ??? begin
          ????? insert into t1_b values(1);
          ??? end; --插入t1_a時,插入t1_b
          ?
          ??? create trigger tr_b
          ????? after insert
          ????? on t1_b
          ??? begin
          ????? insert into t1_c values(1);
          ??? end; --插入t1_b時,插入t1_c
          ?
          ??? create trigger tr_c
          ????? after insert
          ????? on t1_c
          ??? begin
          ????? update tr_a set tr_a.id=tr_a.id+10;
          ??? end; --插入t1_c時,更新t1_a
          ?
          ??? 測試:
          ?
          ??? SQL> insert into t1_a values(5);
          ??? 1 row inserted
          ?
          ??? SQL> select * from t1_a;
          ?????? ID
          ??? -----
          ?????? 15
          ?
          ?
          多條件觸發器
          ?
          ??? CREATE OR REPLACE TRIGGER
          ??? BEFORE INSERT OR UPDATE OR DELETE
          ??? BEGIN
          ????? IF inserting THEN
          ????? --insert語句觸發
          ????? ELSIF updating THEN
          ????? --update語句觸發
          ????? ELSIF deleting THEN
          ????? --delete語句觸發
          ????? END IF;
          ??? END;
          ?
          ??? 注:若要針對update某一列,則用 IF UPDATING('xx') THEN...
          ?
          ??? 具體舉例:
          ?
          ??? create or replace trigger oper_trigger
          ????? before insert or update or delete
          ????? on t1
          ??? declare
          ????? str_action varchar2(100);
          ??? begin
          ????? if inserting then
          ??????? str_action:='Insert';
          ????? end if;
          ????? if updating then
          ??????? str_action:='Update';
          ????? end if;
          ????? if deleting then
          ??????? str_action:='Delete';
          ????? end if;
          ????? insert into t1_log values(str_action,sysdate);
          ??? end;
          ?
          ?
          ?
          行級觸發器特性
          ?
          1、簡單舉例
          ?
          ??? create or replace trigger reco_trigger
          ????? after delete
          ????? on t11
          ????? for each row
          ??? begin
          ????? insert into t22 values(:old.a,:old.b);
          ??? end;
          ?
          2、說明:
          ?
          ??? * 可以通過:new和:old來獲得操作前后的不同數據映像
          ??? * update可同時使用:new、:old,insert只能用:new,delete只能用:old
          ?
          3、通過REFERENCING修改映像標識符
          ?
          ??? create or replace trigger reco_trigger
          ????? before update
          ????? on t11
          ????? referencing new as my_value --注意格式
          ????? for each row
          ????? when (my_value.a > 10) --新值大于10時才觸發
          ??? begin
          ????? insert into t22 values(:my_value.a,:my_value.b);
          ??? end;
          ?
          ??? 注意:即使重命名了,但是還是要在前面加“:”,但是在referencing和when字句中不用加
          ?
          ?
          ?
          posted on 2008-10-21 19:35 decode360 閱讀(184) 評論(0)  編輯  收藏 所屬分類: 07.Oracle
          主站蜘蛛池模板: 施甸县| 塔河县| 霍邱县| 怀化市| 安新县| 美姑县| 湖口县| 北碚区| 仁布县| 吴忠市| 务川| 清流县| 怀远县| 黄浦区| 霞浦县| 临安市| 普陀区| 怀安县| 平利县| 日喀则市| 普格县| 焦作市| 乌审旗| 灵寿县| 古蔺县| 苏州市| 岑巩县| 东源县| 融水| 张家界市| 延吉市| 长白| 东阳市| 竹溪县| 三穗县| 图木舒克市| 蓝田县| 建平县| 成武县| 长武县| 雷波县|