触发器实例
在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;總結
- 上一篇: ListView优化方案及其原理
- 下一篇: 修改键盘映射、交换按键