【问题标题】:Oracle trigger depending on virtual column produces wrong dataOracle触发器依赖于虚拟列产生错误数据
【发布时间】:2017-02-06 04:44:18
【问题描述】:

我有这个触发器

create or replace trigger upd_totprc_trg
after insert or update or delete of total_price on sales_detail
for each row
declare
 v_diff   number := 0;
 v_master number;
begin

 if inserting then
  v_master := :new.master_id;
  v_diff   := :new.total_price;
elsif updating then
  v_master := :new.master_id;
  v_diff   := :new.total_price - :old.total_price;
elsif deleting then
  v_master := :old.master_id;
  v_diff   := :old.total_price * -1;
end if;

update sales_master
 set value = value + v_diff
 where id = v_master;
end;
/

它计算sales_detail.total_price 的变化并更新sales_master.value

问题是total_price 列是一个虚拟列,定义为数量和单位价格的乘积。 当我输入新的详细信息行时,即使它是after,触发器似乎也没有捕捉到新的计算值。我的问题是:虚拟列表达式的执行与触发器的运行是否冲突?请注意,当我再次将 total_price 设置为普通列时,它返回了正确的值。

我正在使用 Oracle 12c

【问题讨论】:

    标签: oracle triggers oracle12c virtual-column


    【解决方案1】:

    您的触发器用于更新、插入或删除虚拟列。但是此列未插入或更新。它是在有人请求数据时计算的。所以不触发触发器是正确的值。更何况它不允许更新或插入虚拟列。尝试直接更新虚拟列时将产生ORA-54017: UPDATE operation disallowed on virtual columns
    您需要的是在用于计算虚拟一(quantityunit_price)的基础列上触发。这是很明显的逻辑,当有人改变基值时,结果也会改变。

    【讨论】:

      猜你喜欢
      • 2019-01-31
      • 1970-01-01
      • 2018-05-01
      • 2018-12-20
      • 2020-10-10
      • 1970-01-01
      • 2018-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多