小弟在SqlServer移植到Oracle9i的过程中遇到了一个问题。
具体是这样的:
在原先的SqlServer中有表A(IID,col1,col2,col3),其中IID是序号,col3=col1+col2,col3是用公式实现的。由于Oracle中没有公式这一概念,得用触发器去实现。现在的问题是,我怎么在触发器中得到被更新记录的序列号,要不然我就得对表A中所有记录套用公式:col3=col1+col2,这显然是不现实也不合理的。
还望各位大虾赐教啊,谢谢了。
具体是这样的:
在原先的SqlServer中有表A(IID,col1,col2,col3),其中IID是序号,col3=col1+col2,col3是用公式实现的。由于Oracle中没有公式这一概念,得用触发器去实现。现在的问题是,我怎么在触发器中得到被更新记录的序列号,要不然我就得对表A中所有记录套用公式:col3=col1+col2,这显然是不现实也不合理的。
还望各位大虾赐教啊,谢谢了。
create or replace trigger tgname
after insert on tabname
for each row
declare
v_count number;
begin
select count(1) into v_count from 主表 where id=:new.id;
if v_count=0 then
insert into 主表 values (:new.id,:new....);
else
update 主表 set 数量=数量+:new.数量 where id=:new.id;
end if;
end;
:new表示新值,:old表示旧值。create or replace trigger tgname
before insert or update on tabname
for each row
begin
:new.col3 = nvl(:new.col1,0)+nvl(:new.col2,0);
end;
这样应该就可以了。只针对你插入或者修改的那条记录的(for each row了,行级触发器)。
下面是触发器主体begin
:new.税款合计 = nvl(:new.资源税合计,0)+nvl(:new.个人所得税合计,0)+nvl(:new.企业所得税合计,0)+nvl(:new.营业税合计,0)+nvl(:new.城建税合计,0)+nvl(:new.房产税合计,0)+
nvl(:new.印花税合计,0)+nvl(:new.土地使用税合计,0)+nvl(:new.土地增值税合计,0)+nvl(:new.车船使用税合计,0)+nvl(:new.教育费附加合计,0);
:new.基金合计 = nvl(:new.文化事业建设费收入合计,0)+nvl(:new.防洪保安资金合计,0)+nvl(:new.残疾人就业保障金合计,0)+nvl(:new.工会经费合计,0)+nvl(:new.价格调节基金合计,0)+
nvl(:new.社保基金合计,0);
:new.合计 = nvl(:new.税款合计,0)+nvl(:new.基金合计,0);
end;其中税款合计,基金合计,合计就是所谓的col3
事件我选择了插入和更新列(我将上面等式右边所有的列都勾上了)
高级里面我选择逐行触法
但是编译后的结果是
行号= 2 列号= 19 错误文本= PLS-00103: 出现符号 "="在需要下列之一时: := . ( @ % ; indicator
行号= 4 列号= 5 错误文本= PLS-00103: 出现符号 ""
行号= 5 列号= 29 错误文本= PLS-00103: 出现符号 ";"在需要下列之一时: . ( * % & - + / at mod rem return returning <an exponent (**)> and or || 符号 "(在 ";" 继续之前已插入。
行号= 6 列号= 58 错误文本= PLS-00103: 出现符号 ";"在需要下列之一时: . ( ) , * % & - + / at mod rem <an exponent (**)> and or using ||
把=修正为‘:=’,编译后,又出现:
行号= 2 列号= 5 错误文本= PLS-00201: 必须说明标识符 'NEW.税款合计'
行号= 2 列号= 5 错误文本= PL/SQL: Statement ignored
行号= 4 列号= 5 错误文本= PLS-00201: 必须说明标识符 'NEW.基金合计'
行号= 4 列号= 5 错误文本= PL/SQL: Statement ignored
行号= 6 列号= 5 错误文本= PLS-00201: 必须说明标识符 'NEW.合计'
行号= 6 列号= 5 错误文本= PL/SQL: Statement ignored
但是这三个字段明明是存在于表中的啊,我那里又犯错了,还是我一开始就错了?
(CSDN普通用户不可以编辑帖子,这个)