插入或更新销售项目后的 oracle 触发器
Posted
技术标签:
【中文标题】插入或更新销售项目后的 oracle 触发器【英文标题】:oracle trigger after inserting or updating a sales item 【发布时间】:2010-01-20 23:17:48 【问题描述】:我有这张表,它代表一个弱实体,是一个用于介绍订购项目的典型表: 插入 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' 期间出错
【问题讨论】:
【参考方案1】:问题是您试图从表中获取每一行,因为您将列 (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));
否则你会得到一堆变异表错误。
【讨论】:
【参考方案2】:该错误告诉您将其结果保存到变量中的查询返回了多个结果。因此,它不知道您要在变量中保存什么。
尝试运行以下命令:
select iva_prod,id_prod from produto p where p.id_prod = id_prod;
我敢打赌它会给你一个以上的结果,它不能保存到iva,idprod
。
【讨论】:
以上是关于插入或更新销售项目后的 oracle 触发器的主要内容,如果未能解决你的问题,请参考以下文章