觸發器 trigger

          create or replace trigger tr_in
            before insert on doptin  
            
          for each row
          declare
            v_count number;
            
            
          -- local variables here
          begin
            select count(
          *) into v_count from dopt 
            where doptid 
          =:new.proid;
            
            
          if v_count =0 then
              insert into dopt(非變異表) values(sq_dopt.nextval,:
          new.proid,:new.innum);
            
          else
              update dopt set dopt.doptnum 
          = doptnum+:new.innum where proid = :new.proid;
            end 
          if;
            
          --檢測是否第一次入庫記錄,如果第一次入庫,則在dopt表中
            
          --建立一條記錄,否則修改dopt表中庫存數量
            exception when others then
              dbms_output.put_line(sqlerrm);
          end tr_in;


          --------------------


          create or replace trigger tr_out
            before insert on doptout  
          --觸發表
            
          for each row
          declare
            v_num number;
            
          -- local variables here
          begin
            select dopt.doptnum into v_num from dopt where dopt.proid 
          = :new.proid;
            
          if :new.outnum > v_num then
              raise_application_error(
          -20001,'庫存不足');
            
          else
              update dopt set doptnum 
          = doptnum - :new.outnum where doptid = :new.proid;
            end 
          if;
          end tr_out;



          ---------------------------------------
          --1觸發事件 insert delete update
          --2觸發時機
          --對dml語句之前還是之后讓他工作
          --3觸發表,觸發器為之工作的表
          --4觸發類型:
          -- 4.1行級,語句級觸發器即(表級觸發器)
          create or replace trigger tr_row_after
            after update on emp  
            
          for each row
          declare
            
          -- local variables here
          begin
            dbms_output.put_line(
          '××行級后觸發器工作××');
          end tr_row_after; 

          -------------------
          create or replace trigger tr_row_before
            before update on emp  
            
          for each row
          declare
            
          -- local variables here
          begin
            dbms_output.put_line(
          'row before trigger test');
          end tr_row_before;
          ----------------------------------------
          create or replace trigger tr_tab_before
            before update on emp  
            
          declare
            
          -- local variables here
          begin
            dbms_output.put_line(
          'table  grade before working');
          end tr_tab_before;
          -------------------------
          create or replace trigger tr_tab_after
            before update on emp  
            
          declare
            
          -- local variables here
          begin
            dbms_output.put_line(
          'table  grade after working');
          end tr_tab_after;
          ------------------------------------------執行結果:
          table  grade after working
          table  grade before working
          row before trigger test
          row after trigger test
          row before trigger test
          row after trigger test
          row before trigger test
          row after trigger test
          ----------------------
          -----------觸發操作(觸發器中語句塊
          ---周末不能對員工表做操作

          create or replace trigger tr_emp2_in_up_de
            before insert or update or delete on emp2  
            
          declare
            v_day varchar2(
          20);
            
          -- local variables here
          begin
            select to_char(sysdate,
          'dy') into v_day from dual;

              
          if inserting then
                  raise_application_error(
          -20001,'have the rest day can not control employ');
              elseif updating then
                  raise_application_error(
          -20001,'have the rest day not control employ');
              elseif deleting then
                  raise_application_error(
          -20001,'have the rest day cnot control employ');
              end 
          if;

          end tr_emp2_in_up_de;
          ---------觸發器執行
          --ml操作請求---》觸發器工作---》dml操作結束----》commit or roback
          --觸發器不能還有事務控制語句;commit roback
          ---不能含有ddl語句,因為ddl語句會自動提交;
          ---觸發器代碼大小不能超過512k,可以使用觸發器調用過程或者函數調用,解決較大代碼調用問題
          ---注意,觸發器都是在dml結束前執行 ,delete中 :old指刪除的要操作de舊記錄,insert中:new指要插入的新記錄
          --after,與 before觸發器的區別,update即可以:new,又可以:old,他們只能在行集觸發器中使用..
          --行級before觸發器可以修改:new的值,而行級后after觸發器則不行
          --1觸發時機,before比after先執行,
          --2-定義取編號觸發器
          create or replace trigger tr_teb_before
            before insert on teb  
            
          for each row
          declare
            
          -- local variables here
            v_num number;
          begin
             select sq_teb.nextval into v_num from dual;
             :
          new.tebid := v_num;
          end tr_teb_before;
          ---instead of 觸發器 視圖觸發器 做修改操作,視圖只是用來查詢的,一旦用修改則用instead of觸發器
          ---多表復雜視圖 不能通過dml操作修改,
          --和普通dml觸發器的區別:instead of 操作會中斷dml操作
          --普通觸發器是dml操作事務的一部分
          --instead of觸發器會結束當前dml操作
          --dml操作請求(即dml操作結束)---》instead of觸發器工作, set serveroutput on;insert into v_teb2 values(1,'a');
          create or replace trigger tr_teb2
            instead of insert on v_teb2  
            
          for each row
          declare
            
          -- local variables here
          begin
            dbms_output.put_line(
          'instead of trigger working');
            insert into teb2 values(sq_teb.nextval,
          'trigger working');
          end tr_teb2;

          ----約束表,觸發表,觸發器工作的表,example:部門表就是員工表的約束表
          ----變異表,就是dml操作過程的觸發表
          ----舊數據--臟數據--》新數據
          ---long double 8b  1101 0100 -----1021 2121----->1200 1323
          ----DML開始操作--》行級觸發器工作---》end結束操作。
          ----每個部門最多6人,6人后,不允許往這個部門添加員工,和修改其他部門為這個部門員工
          ----行級觸發器不能讀取變異表,
          ---觸發表:對于觸發器而言,就是觸發器為之定義的表
          ----變異表:就是當前dml操作所影響的表(經常來說觸發表就是變異表)
          create or replace trigger tri_emp
            before insert or update on emp3   
            
          for each row
          declare
            
          -- local variables hereer
            v_count number;
          begin
            select count(
          *) into v_count from emp3(本表:(即變異表行級觸發器不允許讀取)) where emp3.deptno = :new.deptno;
            
          if v_count >= 6 then
              raise_application_error(
          -20001,'every dept can not over 6 peaple');
            end 
          if;
          end tri;

          ---矛盾;行級觸發器不允許查詢變異表,而表級觸發器不允許使用:new
          ----解決方案:
          --1,建立包,定義一個共同變量,用來存放部門編號變量
          create or replace 
          package pak_deptno is
            v_deptno number;
          end pak_deptno;
          --2,建立一個行級前或者后觸發器,僅僅將操作行的部門編號放入包中。
          create or replace trigger tri_row_emp3
            after insert or update on emp3   
            
          for each row
          declare
           
          begin
            pak_deptno.v_deptno:
          =:new.deptno;
          end tri_row_emp3;
          --3,建立一個表級后觸發器中查詢變異表,來確定是否可以添加.
          create or replace trigger tri_table_emp
            after insert or update on emp3   
          declare
            
          -- local variables hereer
            v_count number;
          begin
            select count(
          *) into v_count from emp3 where emp3.deptno = pak_deptno.v_deptno;
            
          if v_count >= 6 then
              raise_application_error(
          -20001,'every dept can not over 6 peaple');
            end 
          if;
          end tri_table_emp;


          ----如果是一條insert語句,僅僅插入一行記錄,則oracle中行級觸發器允許查詢變異表..
          ---insert into emp3 select * from emp where deptno=10;

          posted on 2012-06-03 23:06 youngturk 閱讀(295) 評論(0)  編輯  收藏 所屬分類: Oracle

          <2012年6月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          導航

          統計

          公告

          this year :
          1 jQuery
          2 freemarker
          3 框架結構
          4 口語英語

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          EJB學習

          Flex學習

          learn English

          oracle

          spring MVC web service

          SQL

          Struts

          生活保健

          解析文件

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 石阡县| 康保县| 师宗县| 东丰县| 竹北市| 垫江县| 呼玛县| 曲麻莱县| 井研县| 分宜县| 河源市| 吐鲁番市| 镇江市| 峡江县| 阳谷县| 云林县| 黑水县| 五指山市| 新邵县| 潮州市| 舒兰市| 遂平县| 阿拉善左旗| 南皮县| 高州市| 秭归县| 无极县| 通江县| 巢湖市| 康马县| 松阳县| 南充市| 新绛县| 嘉禾县| 门源| 军事| 隆化县| 克什克腾旗| 岐山县| 大厂| 股票|