我有这个表代表弱实体的表,是引入订购商品的典型表: 插入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'
时出错答案 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
。