<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
    主站蜘蛛池模板: 免费人成动漫在线播放r18| 亚洲熟妇中文字幕五十中出| 亚洲电影中文字幕| 国产精品免费αv视频| jjzz亚洲亚洲女人| 手机永久免费的AV在线电影网| 亚洲人成激情在线播放| 久久久免费的精品| 亚洲国产精品久久久久婷婷软件| 中文成人久久久久影院免费观看| 亚洲国产无套无码av电影| 免费无码又爽又刺激网站| 亚洲va久久久噜噜噜久久狠狠| 人人玩人人添人人澡免费| 亚洲精品美女久久久久| 18勿入网站免费永久| 亚洲天然素人无码专区| 免费看一级做a爰片久久| 成人精品国产亚洲欧洲| 久久亚洲av无码精品浪潮| 国产免费一区二区三区不卡| 婷婷精品国产亚洲AV麻豆不片 | ASS亚洲熟妇毛茸茸PICS| 国内精品乱码卡1卡2卡3免费| 亚洲中文字幕久久精品无码A| 国产片免费在线观看| XXX2高清在线观看免费视频| 图图资源网亚洲综合网站| 18禁免费无码无遮挡不卡网站| 亚洲精品无码国产片| 久久亚洲精品无码播放| 99re免费视频| 亚洲国产精品自在自线观看| 国产亚洲精品久久久久秋霞| 50岁老女人的毛片免费观看| 亚洲成av人无码亚洲成av人| 亚洲午夜福利在线观看| 99久久免费国产香蕉麻豆| 全部一级一级毛片免费看| 中文字幕亚洲综合久久2| 免费va人成视频网站全|