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

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

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

    觸發(fā)器 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表中庫存數(shù)量
      exception when others then
        dbms_output.put_line(sqlerrm);
    end tr_in;


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


    create or replace trigger tr_out
      before insert on doptout  
    --觸發(fā)表
      
    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觸發(fā)事件 insert delete update
    --2觸發(fā)時機
    --對dml語句之前還是之后讓他工作
    --3觸發(fā)表,觸發(fā)器為之工作的表
    --4觸發(fā)類型:
    -- 4.1行級,語句級觸發(fā)器即(表級觸發(fā)器)
    create or replace trigger tr_row_after
      after update on emp  
      
    for each row
    declare
      
    -- local variables here
    begin
      dbms_output.put_line(
    '××行級后觸發(fā)器工作××');
    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;
    ------------------------------------------執(zhí)行結(jié)果:
    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
    ----------------------
    -----------觸發(fā)操作(觸發(fā)器中語句塊
    ---周末不能對員工表做操作

    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;
    ---------觸發(fā)器執(zhí)行
    --ml操作請求---》觸發(fā)器工作---》dml操作結(jié)束----》commit or roback
    --觸發(fā)器不能還有事務(wù)控制語句;commit roback
    ---不能含有ddl語句,因為ddl語句會自動提交;
    ---觸發(fā)器代碼大小不能超過512k,可以使用觸發(fā)器調(diào)用過程或者函數(shù)調(diào)用,解決較大代碼調(diào)用問題
    ---注意,觸發(fā)器都是在dml結(jié)束前執(zhí)行 ,delete中 :old指刪除的要操作de舊記錄,insert中:new指要插入的新記錄
    --after,與 before觸發(fā)器的區(qū)別,update即可以:new,又可以:old,他們只能在行集觸發(fā)器中使用..
    --行級before觸發(fā)器可以修改:new的值,而行級后after觸發(fā)器則不行
    --1觸發(fā)時機,before比after先執(zhí)行,
    --2-定義取編號觸發(fā)器
    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 觸發(fā)器 視圖觸發(fā)器 做修改操作,視圖只是用來查詢的,一旦用修改則用instead of觸發(fā)器
    ---多表復(fù)雜視圖 不能通過dml操作修改,
    --和普通dml觸發(fā)器的區(qū)別:instead of 操作會中斷dml操作
    --普通觸發(fā)器是dml操作事務(wù)的一部分
    --instead of觸發(fā)器會結(jié)束當(dāng)前dml操作
    --dml操作請求(即dml操作結(jié)束)---》instead of觸發(fā)器工作, 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;

    ----約束表,觸發(fā)表,觸發(fā)器工作的表,example:部門表就是員工表的約束表
    ----變異表,就是dml操作過程的觸發(fā)表
    ----舊數(shù)據(jù)--臟數(shù)據(jù)--》新數(shù)據(jù)
    ---long double 8b  1101 0100 -----1021 2121----->1200 1323
    ----DML開始操作--》行級觸發(fā)器工作---》end結(jié)束操作。
    ----每個部門最多6人,6人后,不允許往這個部門添加員工,和修改其他部門為這個部門員工
    ----行級觸發(fā)器不能讀取變異表,
    ---觸發(fā)表:對于觸發(fā)器而言,就是觸發(fā)器為之定義的表
    ----變異表:就是當(dāng)前dml操作所影響的表(經(jīng)常來說觸發(fā)表就是變異表)
    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(本表:(即變異表行級觸發(fā)器不允許讀取)) 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;

    ---矛盾;行級觸發(fā)器不允許查詢變異表,而表級觸發(fā)器不允許使用:new
    ----解決方案:
    --1,建立包,定義一個共同變量,用來存放部門編號變量
    create or replace 
    package pak_deptno is
      v_deptno number;
    end pak_deptno;
    --2,建立一個行級前或者后觸發(fā)器,僅僅將操作行的部門編號放入包中。
    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,建立一個表級后觸發(fā)器中查詢變異表,來確定是否可以添加.
    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中行級觸發(fā)器允許查詢變異表..
    ---insert into emp3 select * from emp where deptno=10;

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

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

    導(dǎo)航

    統(tǒng)計

    公告

    this year :
    1 jQuery
    2 freemarker
    3 框架結(jié)構(gòu)
    4 口語英語

    常用鏈接

    留言簿(6)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    相冊

    EJB學(xué)習(xí)

    Flex學(xué)習(xí)

    learn English

    oracle

    spring MVC web service

    SQL

    Struts

    生活保健

    解析文件

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 日本免费v片一二三区| 国产中文字幕在线免费观看| 亚洲av永久无码精品三区在线4| 久久久亚洲精品视频| 亚洲精品你懂的在线观看| 国产亚洲精品免费视频播放| 亚洲?V乱码久久精品蜜桃| 免费观看午夜在线欧差毛片| 国产精品无码一区二区三区免费| 日本免费中文字幕在线看| 免费永久看黄在线观看app| 日韩一品在线播放视频一品免费| 国产青草视频免费观看97| 免费大片黄手机在线观看| 国产精品亚洲精品日韩已方| 亚洲一区二区三区乱码A| 丁香五月亚洲综合深深爱| 中文字幕亚洲专区| 亚洲成av人影院| 久久久无码精品亚洲日韩按摩 | a一级爱做片免费| 手机看片国产免费永久| 日韩电影免费在线观看中文字幕| 久久99青青精品免费观看| 99re热精品视频国产免费| 99在线精品免费视频九九视| 岛国片在线免费观看| 四虎影永久在线高清免费| 亚洲精品无码鲁网中文电影| 亚洲天天做日日做天天欢毛片 | 婷婷综合缴情亚洲狠狠尤物| 亚洲真人日本在线| 亚洲AV成人一区二区三区AV| 亚洲人成影院午夜网站| 国产精品亚洲а∨无码播放麻豆| 国产无限免费观看黄网站| 国产免费拔擦拔擦8X高清在线人 | 无遮挡免费一区二区三区| 最近的2019免费中文字幕| 最近中文字幕无免费| 老司机永久免费网站在线观看|