<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(180) 評論(0)  編輯  收藏 所屬分類: 07.Oracle
    主站蜘蛛池模板: 国产偷国产偷亚洲高清在线| 四虎永久在线精品免费观看地址 | 久久噜噜噜久久亚洲va久| 亚洲中文字幕无码一区| 久久国产成人亚洲精品影院 | 青青在线久青草免费观看| 嘿嘿嘿视频免费网站在线观看| 亚洲第一网站免费视频| 国产精品成人观看视频免费| 亚欧在线精品免费观看一区| 国产大片91精品免费观看不卡| 成人免费福利视频| 在线观看免费高清视频| 午夜dj免费在线观看| 免费va在线观看| 亚洲综合图色40p| 亚洲Av无码专区国产乱码DVD| 亚洲AV无码不卡无码| 亚洲欧洲精品视频在线观看| 亚洲av产在线精品亚洲第一站| 亚洲色成人四虎在线观看| 男女猛烈xx00免费视频试看| 狠狠躁狠狠爱免费视频无码| 无码国产精品一区二区免费式芒果 | 亚洲成人免费在线| 亚洲一区二区三区高清| 亚洲美女视频一区| 亚洲第一成年网站视频| 永久免费无码网站在线观看个| 中文字幕在线免费视频| 亚洲精品在线免费看| 日本媚薬痉挛在线观看免费| 国产亚洲精午夜久久久久久| 亚洲视频免费播放| 亚洲狠狠婷婷综合久久蜜芽| 特a级免费高清黄色片| 男的把j放进女人下面视频免费| 青草草色A免费观看在线| 免费中文字幕在线观看| 亚洲AV无码一区东京热久久| 亚洲情A成黄在线观看动漫软件|