1

我有这个表,它代表一个弱实体,是一个用于介绍订购项目的典型表:插入 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”时出错

4

2 回答 2

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));

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

于 2010-01-21T00:53:27.983 回答
0

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

尝试运行以下命令:

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

我敢打赌它会给你一个以上的结果,它不能保存到iva,idprod.

于 2010-01-20T23:28:14.463 回答