夢幻之旅

          DEBUG - 天道酬勤

             :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            671 隨筆 :: 6 文章 :: 256 評論 :: 0 Trackbacks
          一.觸發(fā)器是什么
              觸發(fā)器是數(shù)據(jù)庫中,隱含被執(zhí)行的存儲(chǔ)過程存儲(chǔ)過程,當(dāng)發(fā)生特定的事件時(shí),orcle會(huì)自動(dòng)執(zhí)行觸發(fā)器相對應(yīng)的代碼.
          二.觸發(fā)器的分類
             1.DML觸發(fā)器
             2.DDL觸發(fā)器
             3.INSTEAD 觸發(fā)器
             4.事件觸發(fā)器
          三.例子
            
          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;


          再來一個(gè)例子:
              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 只出現(xiàn)在insert和update時(shí),old只出現(xiàn)在update和delete時(shí)。在insert時(shí)new表示新插入的行數(shù)據(jù),update時(shí)new 表示要替換的新數(shù)據(jù)、old表示要被更改的原來的數(shù)據(jù)行,delete時(shí)old表示要被刪除的數(shù)據(jù)。

          注意:

          在觸發(fā)器中不能使用commit。

          posted on 2011-07-11 14:09 HUIKK 閱讀(388) 評論(0)  編輯  收藏 所屬分類: DataBase
          主站蜘蛛池模板: 内黄县| 贵阳市| 宜宾县| 崇阳县| 临西县| 巫溪县| 呼和浩特市| 乌兰浩特市| 阿克| 通河县| 扶绥县| 紫金县| 中卫市| 千阳县| 麟游县| 永胜县| 遂溪县| 西乡县| 青川县| 上栗县| 河西区| 渭源县| 南丹县| 盖州市| 江城| 衡东县| 张家川| 沂水县| 阿图什市| 苍溪县| 延庆县| 揭西县| 子洲县| 阳城县| 鹤峰县| 阳朔县| 永寿县| 亚东县| 漾濞| 青海省| 渭源县|