2013-04-07 290 views
1

我的任務是在插入後必須創建觸發器。以下是涉及到的表:Oracle AFTER INSERT觸發器未觸發

CREATE TABLE purchase(
orderid CHAR(3), 
unit_price NUMBER(7,2), 
sales_price NUMBER(7,2) DEFAULT NULL, 
itemid CHAR(3) 
); 

這裏是觸發:

/* Now we need the AFTER trigger */ 
CREATE OR REPLACE TRIGGER DoubleSalesPrice 
AFTER INSERT on purchase 
FOR EACH ROW 


DECLARE 
PRAGMA AUTONOMOUS_TRANSACTION; 
itemcount smallint; 
BEGIN 
    SELECT COUNT(itemid) INTO itemcount FROM purchase P WHERE P.itemid = :new.itemid; 
IF (itemcount = 1) THEN 
    UPDATE purchase P 
    SET P.sales_price = 2*P.unit_price 
    WHERE P.orderid = :new.orderid; 
end if; 
end; 
/

我指定以此爲每個代碼插入操作後。然而,當我插入購買,我沒有得到期望的結果:

INSERT INTO purchase VALUES('100','250', '200', '500'); 
SQL> select * from purchase; 

ORD UNIT_PRICE SALES_PRICE ITE 
--- ---------- ----------- --- 
100  250   200 500 

彷彿扳機擊發它不會出現。我已確保啓用它具有相同的結果:

ALTER TRIGGER DoubleSalesPrice enable; 
SQL> select * from purchase; 

ORD UNIT_PRICE SALES_PRICE ITE 
--- ---------- ----------- --- 
101  250   200 500 

如果有人有任何建議,請讓我知道。在嘗試實際問題之前,我通常喜歡創建一些小例子。這個反映了我需要達到的功能。

+0

這是提交問題嗎?就是想。 – Sid 2013-04-07 18:22:10

+0

我沒有得到任何錯誤。我嘗試了一次提交,然後整個觸發器被轟炸。退出SQLPlus,再次運行它,沒有問題。觸發器不會觸發。 – DaGr8Gatzby 2013-04-07 18:23:13

+0

我沒有聽說SQL * Plus究竟做了什麼'轟炸'。 – Sid 2013-04-07 18:24:56

回答

1

這是一個autonomous transaction,你必須在其本地範圍內提交它,也就是說觸發器本身。

我不認爲你應該這樣做,但它沒有意義使它與插入本身分開(事務)。它應該承擔整個過程。

+0

有沒有其他辦法可以做到我需要的觸發器?要求說明它需要成爲觸發器,所以我有點擔心。 – DaGr8Gatzby 2013-04-07 19:05:48

+0

是的,只需從您的代碼中刪除PRAGMA AUTONOMOUS_TRANSACTION – Sebas 2013-04-07 19:17:43

+0

我放置了PRAGMA_AUTONOMOUS_TRANSCATION行來擺脫第一個問題。我現在正在發生突變表錯誤。 – DaGr8Gatzby 2013-04-07 19:25:04