我的任务是在插入后创建一个触发器。以下是涉及的表格:
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;
/
我已根据代码将此指定为AFTER INSERT。但是,当我插入购买时,我没有得到所需的结果:
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 :(得分:1)
这是一个autonomous transaction
,您必须在其本地范围内提交它,也就是触发器本身。
我认为你不应该这样做,将它与插入本身分开(事务)是没有意义的。它应该与整个过程一致。