【问题标题】:oracle trigger after inserting or updating a sales item插入或更新销售项目后的 oracle 触发器
【发布时间】: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' 期间出错

【问题讨论】:

    标签: sql oracle triggers ora-04088


    【解决方案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

      【讨论】:

        猜你喜欢
        • 2019-07-28
        • 2017-06-26
        • 2021-02-26
        • 1970-01-01
        • 1970-01-01
        • 2010-12-22
        • 2013-07-01
        • 2021-03-08
        • 2015-06-11
        相关资源
        最近更新 更多