2013-04-07 180 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