簡體   English   中英

依賴於虛擬列的Oracle觸發器會產生錯誤的數據

[英]Oracle trigger depending on virtual column produces wrong data

我有這個觸發器

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列是一個虛擬列,定義為quantity和total_price的乘積。 當我輸入新的細節行時,觸發器似乎不會捕獲新的計算值,即使它是after 我的問題是:虛擬列表達式的執行是否與觸發器的運行沖突? 請注意,當我再次將total_price設置為普通列時,它會返回正確的值。

我正在使用Oracle 12c

您的觸發器用於在虛擬列上更新,插入或刪除。 但是此列未插入或更新。 它是在有人請求數據時計算的。 因此,不觸發triogger是正確的值。 還有什么不允許更新或插入虛擬列。 ORA-54017: UPDATE operation disallowed on virtual columns嘗試直接更新虛擬列時,將生成ORA-54017: UPDATE operation disallowed on virtual columns
您需要的是觸發計算虛擬列( quantityunit_price )的列。 這是明顯的邏輯,當有人更改基值時,結果也將被更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM