oracle触发器

数据库触发器:当指定的条件满足时,触发器中的代码自动执行。

有朋友问了个问题,概括下来场景如下:

两个表a、b,a表中插入数据或者更新数据时,会从b表检索记录,找到匹配的记录后,用b表的某个字段更新a表的相应字段。

oracle版

/*

  触发器位于test1表,test1插入数据时,从test2中查找数据更新test1

  例子中是向test1插入c1='c',查找test2中的c2,最终插入test1的数据变为c1='c',c2='cc'

*/

-- 测试数据

create table test1(c1 varchar2(100),c2 varchar2(100),c3 varchar2(100))

create table test2(c1 varchar2(100),c2 varchar2(100),c3 varchar2(100))

insert into test2 (c1,c2,c3) values('c','cc','ccc');

insert into test2 (c1,c2,c3) values('y','yy','yyy');

insert into test2 (c1,c2,c3) values('h','hh','hhh');

commit;

-- 触发器

create or replace trigger test1_tri_1 -- 命名

before insert or update -- 触发时机及触发事件

on test1 -- 在test1触发

for each row -- 行级触发器

declare

str varchar2(100); -- 声明变量

-- pragma autonomous_transaction;

begin

  select c2 into str from test2 where c1=:new.c1; -- 从test2表获取c2字段值

  -- dbms_output.put_line(str);

  :new.c2:=str; -- 更新触发器游标值,之后会被插入或更新到 test1表c2字段中

end;

-- 测试

set serveroutput on

insert into test1 (c1) values('c');

commit;

-- 查询验证

select * from test1

mysql版

mysql貌似不支持oracle那种写法故拆开写了两个,如果有朋友懂得写成一个的方法,可以评论告诉我。

insert

/*

  触发器位于test1表,test1插入数据时,从test2中查找数据更新test1

  例子中是向test1插入c1='c',查找test2中的c2,最终插入test1的数据变为c1='c',c2='cc'

*/

-- 测试数据

create table test1(c1 varchar(100),c2 varchar(100),c3 varchar(100));

create table test2(c1 varchar(100),c2 varchar(100),c3 varchar(100));

insert into test2 (c1,c2,c3) values('c','cc','ccc');

insert into test2 (c1,c2,c3) values('y','yy','yyy');

insert into test2 (c1,c2,c3) values('h','hh','hhh');

commit;

-- 触发器

create trigger test1_tri_1

before insert

on test1

for each row

  set new.c2=(select c2  from test2 where c1=new.c1);

-- 测试

insert into test1 (c1) values('c');

commit;

-- 查询验证

select * from test1

update

-- 触发器

create trigger test1_tri_2

before update 

on test1

for each row

  set new.c3=(select c3  from test2 where c1=new.c1);

-- 测试

update test1 set c1=’c’;

commit;

-- 查询验证

select * from test1

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值