2017-04-18 95 views
0

我已创建此触发器,以便在向ORDER_DETAIL表插入一行后,从表中获取“UNIT_PRICE” ITEM并将其设置为基于“ITEM_ID”的ORDER_DETAIL表的“价格”。我对语法有任何错误吗?先谢谢你!如何语法SQL中的触发器,以便更新同一个表中的列AFTER INSERT(oracle数据库)

CREATE OR REPLACE TRIGGER PRICETRIG 
AFTER INSERT ON ORDER_DETAIL FOR EACH ROW 
BEGIN 
UPDATE ORDER_DETAIL 
SET ORDER_DETAIL.PRICE=(SELECT ITEM.UNIT_PRICE FROM ITEM WHERE 
ORDER_DETAIL.ITEM_ID=ITEM.ITEM_ID); 
END; 

这就是错误:

One error saving changes to table "ORDER_DETAIL": 
Row 8: ORA-04091: table ORDER_DETAIL is mutating, trigger/function 
may not see it 
ORA-06512: at "PRICETRIG", line 2 
ORA-04088: error during execution of trigger 'PRICETRIG' 
ORA-06512: at line 1 

回答

2

你应该是指the NEW pseudorecord,而不是表中的触发器上。这也应该是一个前-INSERT触发器,是这样的:

CREATE OR REPLACE TRIGGER PRICETRIG 
BEFORE INSERT ON ORDER_DETAIL 
FOR EACH ROW 
BEGIN 
    SELECT ITEM.UNIT_PRICE 
    INTO :NEW.ORDER_PRICE 
    FROM ITEM 
    WHERE ITEM.ITEM_ID = :NEW.ITEM_ID; 
END; 

你的原代码试图更新表触发器反对,不只是新插入的行的每一行。

您可能想要检查您没有订单上的数量字段,例如您应该将单位价格乘以单位价格。

相关问题