插入或更新销售项目后的oracle触发器

时间:2010-01-20 23:17:49

标签: sql oracle triggers ora-04088

我有这个表代表弱实体的表,是引入订购商品的典型表:   插入ITEM_FORNECIMENTO值(a_orderId,a_prodId,a_prodQtd,a_buyPrice);

我希望我的触发器更新最后一列(没有iva的产品的总价格)来执行此操作:totalPrice = totalPrice *(1+(iva / 100),每次我在该表上插入或更新条目。

所以,我提出了这个问题,但在处理新旧价值时,我完全错了。

create or replace
trigger t_replaceTotal
after insert or update of id_prod,qtd_if,prec_total_if on item_fornecimento
for each row 

declare
iva produto.iva_prod%type;
idProd  produto.id_prod%type;
r_old item_fornecimento.prec_total_if%type:=null;
r_new item_fornecimento.prec_total_if%type:=null;

begin
  select iva_prod,id_prod into iva,idprod from produto p where p.id_prod = id_prod; 
  r_old:= :old.prec_total_if;
  r_new:= :new.prec_total_if;
  update item_fornecimento item set prec_total_if = r_old * (1+(iva/100)) where item.id_prod = idprod;
end;

有人可以帮忙重写这段代码吗?我收到错误:ORA-01422:确切的提取返回超过请求的行数 ORA-06512:在“FUSION.T_REPLACETOTAL”,第8行 ORA-04088:执行触发'FUSION.T_REPLACETOTAL'

时出错

2 个答案:

答案 0 :(得分:4)

问题是您正在尝试从表中获取每一行,因为您正在将列(id_prod)与其自身匹配。我怀疑你想使用:new.id_prod或:old.id_prod。

select .... from produto p where p.id_prod = id_prod; 

接下来,将其设为BEFORE INSERT / UPDATE触发器并用

替换UPDATE语句
 :new.prec_total_if := r_old * (1+(iva/100));

否则你会得到一堆变异的表错误。

答案 1 :(得分:0)

该错误告诉您将结果保存到变量中的查询返回多个结果。因此,它不知道您想要在变量中保存什么。

尝试运行以下内容:

select iva_prod,id_prod from produto p where p.id_prod = id_prod;

我打赌它会给你不止一个结果,它无法保存到iva,idprod