日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

触发器实例

發布時間:2024/8/1 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 触发器实例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在student表中增加一列冗余列sum_grade,在sc表中作一觸發器,當添加,刪除,修改時,student表中sum_grade改變

create or replace trigger sc_ins_del_upd after insert or delete or update of grade,sno on sc for each rowdeclareisum_grade number;beginif inserting thenif :new.grade is null then--插入為空則不管return;else select sum_grade into isum_grade from student where sno=:new.sno;if isum_grade is null then--原來總成績為空則插入成績為總成績update student set sum_grade=:new.grade where sno=:new.sno;else--否則總成績為現在成績加插入成績update student set sum_grade=sum_grade+:new.grade where sno=:new.sno;end if;end if;end if;--刪除思路:因為行級觸發器不能對變化表查詢,所以我們先將總成績減去刪除成績,如果刪除后成績為0,那么我們將會檢查它是否擁有成績為0的課if deleting thenif :old.grade is null thenreturn;else ?????????update student set sum_grade = sum_grade-:old.grade where sno=:old.sno; select sum_grade into isum_grade from student where sno=:old.sno; if isum_grade=0 then pk1.isNull:=1; end if; end if; end if; if updating then null; end if; end; create or replace trigger sc_del after delete on scbeginif pk1.isNull=1 then--如果需要檢查,我們可以設置一個語句級觸發器,直接將成績為0的學生總成績行重置update student set sum_grade=(select sum(grade) from sc where sno=student.sno) where sum_grade=0;pk1.isNull:=0;end if;end;

這里,我們設置了一個全局變量的參數,這是我們將參數放在包中,只定義參數沒有定義過程,這樣就不用實現包體了,而且通過包名.參數名就可以調用全局變量了>.<就是這樣

create or replace package pk1 isisNull number:= 0; end pk1;

異常

create or replace trigger stu_ins_upd_del before insert or delete or update of sage on student for each rowdeclareavg_grade number;beginif inserting thenif :new.sage>30 and :new.sdept='RG' thenraise_application_error(-20000,'RG系的學生年齡不能大于30');end if;end if;if updating thenif :new.sage<:old.sage thenraise_application_error(-20001,'年齡只能增不能加');end if;end if;if deleting thenselect avg(grade) into avg_grade from sc where sno=:old.sno;if avg_grade>60 thenraise_application_error(-20002,'學生平均成績大于60,不能刪除');end if; delete from sc where sno=:old.sno;end if; end;

總結

以上是生活随笔為你收集整理的触发器实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。