我试图创建一个插入后触发器,将购买的详细信息插入购买日志表中,同时更新购买表中的总成本列,将16.5%的GCT添加到总。这两个表有以下列:
CREATE TABLE purchases
(
p_Id INTEGER PRIMARY KEY,
product VARCHAR(25) ,
quantity INTEGER ,
unit_Cost FLOAT ,
total_Cost FLOAT
);
CREATE TABLE purchases_log
(
event_Date DATE ,
p_Id INTEGER PRIMARY KEY,
description varchar(75)
);
我尝试使用的触发器是:
CREATE OR REPLACE TRIGGER PURCHASES_AUDIT
AFTER INSERT ON purchases
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE TAX FLOAT;
BEGIN
INSERT INTO purchases_log
VALUES(SYSDATE,:NEW.p_Id,'INSERT INTO PURCHASES TABLE');
tax := 1.165;
UPDATE purchases SET total_Cost = quantity * unit_Cost;
UPDATE purchases SET total_Cost = total_Cost*tax;
END PURCHASES_AUDIT;
/
但是当尝试在购买表上运行插入时,oracle会给我这个错误
ERROR at line 1:
ORA-04091: table PURCHASES is mutating, trigger/function may
not see it
ORA-06512: at "PURCHASES_AUDIT", line 9
ORA-04088: error during execution of trigger 'PURCHASES_AUDIT'
请帮助
答案 0 :(得分:2)
不要update
定义触发器的表格。
听起来你想要一个修改:new
伪记录的插入前触发器而不是插入后触发器。如果我理解你的意图
CREATE OR REPLACE TRIGGER PURCHASES_AUDIT
BEFORE INSERT ON purchases
FOR EACH ROW
DECLARE
TAX FLOAT;
BEGIN
INSERT INTO purchases_log
VALUES(SYSDATE,:NEW.p_Id,'INSERT INTO PURCHASES TABLE');
tax := 1.165;
:new.total_Cost = :new.quantity * :new.unit_Cost * tax;
END PURCHASES_AUDIT;
顺便说一句,你真的,真的想要使用float
而不是number
吗?你是否完全理解浮点数的近似性质?我从来没有遇到任何想要使用float
的人。
答案 1 :(得分:0)
作为澄清点:在触发器允许您更新:新值之前,触发器之后不允许。 :如果触发后的新值将始终包含最终值。