登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

明月凉

再不记录,就忘了

 
 
 

日志

 
 

触发器1  

2012-10-30 00:17:24|  分类: 计算机 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

触发器

语句级触发器,未使用for each row,被触发后只执行一次

create or replace trigger YHStrig1

  before insert or update or delete

  on  td_b_action

begin

  insert into td_b_attr_define(attr_code,attr_name)

  values (sysdate,'YHS');

end YHStrig1;

 

update td_b_action set action_name='YHS1111' where action_id in ('100000022','100000023','100000024');

update语句影响了3行

 

触发器1 - 糊涂生 - 某丶丶人

 

td_b_attr_define里插入一行,触发器内容被执行了一次

select * from td_b_attr_define

 

触发器1 - 糊涂生 - 某丶丶人

 

每一个IF里面可以是作更多的操作

create or replace trigger YHStrig1

  before insert or update or delete

  on  td_b_action

  declare

    Action varchar2(20);

begin

  if inserting then

    Action :='INSERT';

  elsif updating then

    Action :='UPDATE';

    insert into td_b_attr_define(attr_code,attr_name)

    values (sysdate,'YHS_PP');

  elsif deleting then

    Action :='DELETE';

  end if; 

  insert into td_b_attr_define(attr_code,attr_name)

  values (sysdate,Action);

end YHStrig1;

 

update td_b_action set action_name='YHS1111' where action_id in ('100000022','100000023','100000024');

 

select * from td_b_attr_define

触发器1 - 糊涂生 - 某丶丶人
  

Before,在语句执行前被触发,当要记录操作日志时使用

 

行级触发器,使用for each row,如果一个DML语句操作影响多行,触发器执行多次

create sequence seq;

create or replace trigger YHStrig2

  before insert or update or delete

  on  td_b_action

  for each row

begin

  if inserting then

    select seq.nextval

    into :new.action_id--action_id使用这个seq.nextval的值

    from dual;

  elsif updating then

insert into td_b_attr_define(attr_code,attr_name)values('111','222HHH');

  elsif deleting then

dbms_output.put_line(:old.action_id);--insert对应:new,delete对应:old  

 end if;

end YHStrig2;

 

指不指定action_id,它都将是seq.nextval。

insert into td_b_action(action_id,action_name) values('12323','YYYHHH');

update td_b_action set action_name='YHS1111' where action_id in ('100000001','100000002','100000003');

受影响3条,执行3次

触发器1 - 糊涂生 - 某丶丶人

 delete from td_b_action where action_id in ('1','2','3','4');

触发器1 - 糊涂生 - 某丶丶人

 

 
 

Instead of触发器

  定义在视图上,通常情况是,视图是由多个表的字段构成的,是不能直接进行增删改的。

用instead of触发器也就可以像操作一般的表一样操作视图,其实是在触发器内部对各个表进行操作的。

create or replace view YHS_views

  as

  select attr_code,attr_name,action_name

  from td_b_action,td_b_attr_define

  where td_b_attr_define.attr_value = td_b_action.action_id;

 

create or replace trigger YHS_INS

instead of

insert on YHS_views

for each row

  declare

  bianliang td_b_action.action_id%type;

  begin

    insert into td_b_attr_define(attr_code,attr_name)

    values(:new.attr_code,:new.attr_name);

    --根据传入的name去查id作为value的值

    select action_id

    into bianliang

    from td_b_action

    where action_name=:new.action_name;

   

    update td_b_attr_define

    set attr_value=bianliang

    where attr_code=:new.attr_code;

 end YHS_INS;  

 

--像操作表一样操作视图

insert into YHS_views(attr_code,attr_name,action_name) 

  values('100','用action_name的ID作value','宝视通资费变更');

 

select * from YHS_views;

触发器1 - 糊涂生 - 某丶丶人 
触发器1 - 糊涂生 - 某丶丶人
所以,在实际的td_b_attr_define里插入了预期的内容

 

 

  评论这张
 
阅读(105)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018