oracle触发器之数据的增删改

现有如下四张表,其中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 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_27493017/article/details/85163184