现有如下四张表,其中SCORE_A表中的stu_a_id对应STU_A的id,SCORE_B表中的stu_b_id对应STU_B的id;
基本语法:
create [or replace] trigger name_trigger--自己定义的触发器名字
{before | after | instead of}
{insert [or update] [or delete]}
on 表名
[for each row]
begin
pl/sql语句
end
要求一:写一个触发器,在对STU_A表进行增删改时,如果名字以Jack开头,则将该数据在STU_B表中进行相应的增删改操作;
create or replace trigger stu_a_trigger
after insert or update or delete
on STU_A
for each row
--pragma autonomous_transaction;
begin
if deleting then
delete from STU_B where id = :old.id;
elsif (:new.name like 'Jcak%') then
if inserting then
insert into STU_B(id,name,age)values(:new.id,:new.name,:new.age);
elsif updating then
update STU_B set name=:new.name,age=:new.age where id=:new.id;
end if;
end if;
--commit;
end;
要求二:写一个触发器,在对SCORE_A表进行增删改时,如果名字以Jack开头,则将该数据在SCORE_B表中进行相应的增删改操作;
分析:SCORE_A表中只存在分数,没有学生的名字,因此,如果需要将Jack学生的成绩备份,则需要去查询STU_A表中学生的name
create or replace trigger score_a_trigger
after insert or update or delete
on SCORE_A
for each row
declare
stuName VARCHAR2(20);
record_num number;
--pragma autonomous_transaction;
begin
stuName := '';
record_num :=0;
if deleting then
delete from SCORE_B where id = :old.id;
else
select count(*) into record_num from STU_A stu where stu.id=:new.stu_a_id;
if(record_num>0) then
select stu.name into stuName from STU_A stu where stu.id=:new.stu_a_id;
end if;
if (stuName like 'Jack%') then
if inserting then
insert into SCORE_B(id,score,Stu_b_Id) values(:new.id,:new.score,:new.stu_a_id);
elsif updating then
update SCORE_B set score=:new.score,stu_b_id=:new.stu_a_id where id=:new.id;
end if;
end if;
end if;
--commit;
end;
结果:
扫描二维码关注公众号,回复:
4639437 查看本文章