oralce 触发器问题 高分200

来源:百度知道 编辑:UC知道 时间:2024/05/08 14:17:07
现在有二张表 比如 表A (字段1、字段2、字段3) 表B(字段A、字段B、字段C、字段D) 这二个表没有关系 现在想用触发器实现 如果在表A中插入数据 对应将表A中的字段复制到表B中,表A与表B字段类型 名称都不相同 比如将字段1的数据放入到字段A中
大家帮我看看 这个触发器哪里错了 该怎么改哈

create or replace trigger tri_gl_voucher
after insert on test_if_bill

declare bill varchar(4),
intbill number
begin
select billtype into bill from test_if_bill
if bill='zzrk'
set intbill='1'
if bill='ddrk'
set intbill='2'
if bill='jkrk'
set intbill='3'

if inserting then
insert into gl_voucher(pk_voucher,discardflag,pk_system,voucherkind,isdifflag,contrastflag,prepareddate,pk_corp,pk_prepared,attachment,signflag,modifyflag,detailmodflag,pk_glbook,pk_glorg,pk_glorgbook,pk_manager)
values
(:new.PK_BILL,'N','GL',intbill,'N',0,:new.COPERATORID,'1021','1021CBJT000000000033',0,'N',

1、触发器里面不能操作本表,就是
[select billtype into bill from test_if_bill]这个是不能用的。
1)如果你是想得到新插入的记录的值的话,请使用[:new.]
if :new.billtype = '1' then
intbill := '1';
end;
注意语法就是这个样的,没有[set]

2)如果你就是想得到表中的数据的话,可以用自治事务解决[触发器里面不能操作本表]的限制。

2、你建的本身就是insert触发器,[if inserting then] 就不要加了。

我按照我的想法给你写了一个供你参考,可能不符合你的业务,自己调整吧

create or replace trigger tri_gl_voucher
after insert on test_if_bill
declare
intbill number
begin
if :new.billtype='zzrk' then
intbill := '1';
end if;
if :new.billtype='ddrk' then
intbill := '2';
end if;
if :new.billtype='jkrk' then
intbill := '3';
end if;
insert into gl_voucher(pk_voucher,discardflag,pk_system,voucherkind,isdifflag,contrastflag,prepareddate,pk_corp,pk_prepared,attachment,si