夢幻之旅

          DEBUG - 天道酬勤

             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            671 隨筆 :: 6 文章 :: 256 評論 :: 0 Trackbacks
          一.觸發器是什么
              觸發器是數據庫中,隱含被執行的存儲過程存儲過程,當發生特定的事件時,orcle會自動執行觸發器相對應的代碼.
          二.觸發器的分類
             1.DML觸發器
             2.DDL觸發器
             3.INSTEAD 觸發器
             4.事件觸發器
          三.例子
            
          CREATE OR REPLACE TRIGGER upd_esp_category
              BEFORE 
          INSERT OR UPDATE
                
          OF email
                
          ON ex_edm_task_detail
                
          FOR EACH ROW

          DECLARE
                v_category  
          VARCHAR2(64);
          BEGIN
                
          SELECT esp_name INTO v_category
                       
          FROM ex_edm_esp
                       
          WHERE mail_suffix=SUBSTR(:new.email,INSTR(:new.email,'@',1,1)+1, LENGTH(:new.email));
                :new.category :
          = v_category;
          EXCEPTION
                
          WHEN no_data_found THEN
                    :new.category :
          = '未知';
                
          WHEN too_many_rows THEN
                    :new.category :
          = '未知';
                
          WHEN OTHERS THEN
                    :new.category :
          = '未知';
          END;


          再來一個例子:
              create or replace trigger wf_tri_user_list before insert or update or delete on user_list   
              
          for each row   
              
          declare  
                 uid 
          varchar2(10); useq varchar2(10); asql varchar2(200); namea varchar2(200); nameb varchar2(200);   
              
          begin  
                 namea:
          =NULL;   
                 nameb:
          =NULL;   
                 
          if inserting then  
                    
          insert into wflow.bpm_org_user(userid,username,diaplayname,seq) values(:NEW.user_id,:NEW.user_name,:NEW.user_realname,:NEW.user_id);   
                    dbms_output.put_line(
          'insert trigger is chufale ..');   
                      
                 
          end if;   
                 
          if updating then  
                    
          if (:NEW.user_name<>:OLD.user_nameand (:NEW.user_realname<>:OLD.user_realname) then  
                       namea:
          =:NEW.user_name;   
                       nameb:
          =:NEW.user_realname;   
                       asql:
          ='update wflow.bpm_org_user set diaplayname=:1 where username=:2';   
                       
          execute immediate asql using namea,nameb;   
                    
          else  
                      
          if :NEW.user_name<>:OLD.user_name then  
                        namea:
          =:NEW.user_name;   
                        asql:
          ='update wflow.bpm_org_user set user_name=:1 where username=:2';   
                        
          execute immediate asql using namea;   
                      
          else  
                        
          if :NEW.user_realname<>:OLD.user_realname then  
                          nameb:
          =:NEW.user_realname;   
                          asql:
          ='update wflow.bpm_org_user set diaplayname=:1 where username=:2';   
                          
          execute immediate asql using nameb,:OLD.user_id;   
                        
          end if;   
                      
          end if;   
                    
          end if;   
                 
          end if;   
                 
          if deleting then  
                    
          update wflow.bpm_org_jobusers set userid = 0 where :OLD.user_id =userid and parentid=-1;   
                    
          delete from wflow.bpm_org_jobusers where userid = :OLD.user_id;   
                    
          delete wflow.bpm_org_user where userid=:OLD.user_id;   
                 
          end if;   
                 
          commit;   
              
          end;   
                



          :NEW 和:OLD使用方法和意義,new 只出現在insert和update時,old只出現在update和delete時。在insert時new表示新插入的行數據,update時new 表示要替換的新數據、old表示要被更改的原來的數據行,delete時old表示要被刪除的數據。

          注意:

          在觸發器中不能使用commit。

          posted on 2011-07-11 14:09 HUIKK 閱讀(388) 評論(0)  編輯  收藏 所屬分類: DataBase
          主站蜘蛛池模板: 清原| 海南省| 光山县| 施秉县| 铜鼓县| 施甸县| 宜城市| 陕西省| 大田县| 平塘县| 永平县| 清镇市| 泌阳县| 宿松县| 宁陵县| 枣庄市| 手游| 杭州市| 西贡区| 库尔勒市| 论坛| 岐山县| 金华市| 平安县| 原阳县| 南和县| 高州市| 宁武县| 东源县| 朝阳区| 建阳市| 子长县| 梅河口市| 桐柏县| 峨眉山市| 彭水| 岳西县| 阜宁县| 河南省| 汝州市| 东山县|