2016-03-04 27 views
0

我試圖創建一個插入觸發器,該插入器觸發器將購買的詳細信息插入購買日誌表中,並且還更新購買表中的總費用列將GCT總計增加16.5%。這兩個表有這些列:插入到具有後插入觸發器的表中時出現「表正在變異」錯誤

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' 

請幫助

回答

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

+0

謝謝,請原諒我,但我有點新手。我其實並不完全理解浮動和數字之間的區別。儘管如此,我會對這兩種變量類型進行研究。 – tajay

+0

@tajay - 您可以真實每個開發人員都應該瞭解浮點運算https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html但總而言之,float是一種近似的數據類型。 1 * 0.9可能是0.90000000000001。或者它可能是0.89999999996。它將接近正確的值,但計算機不能準確表示浮點值,因此會累積錯誤。如果你正在進行科學計算,那麼無論如何你都在積累一個誤差項,這不是問題。我從來沒有見過任何人樂意讓貨幣價值不準確。 –

+0

哦,我現在明白了。謝謝 – tajay

0

作爲澄清的一點:在觸發器允許您更新:新值之後,觸發器不會。如果在觸發器之後總是包含最終值,則爲新值。