插入或更新销售项目后的 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 触发器的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 触发器在插入或更新时更新字段

在 oracle 中创建一个触发器,它不允许使用 if 条件进行任何插入或更新

ORACLE 和触发器(插入、更新、删除)

Oracle中的触发器是请求的一部分吗?

Oracle 触发器将所有插入/更新写入文件

Oracle——触发器和游标练习题