如何在 SQL 中对触发器进行语法化,以便在插入后从同一个表中更新列(oracle 数据库)
Posted
技术标签:
【中文标题】如何在 SQL 中对触发器进行语法化,以便在插入后从同一个表中更新列(oracle 数据库)【英文标题】:How to syntax a trigger in SQL in order to UPDATE a column from the same table AFTER INSERT (oracle Database) 【发布时间】:2017-04-18 17:18:14 【问题描述】:我创建了这个触发器,以便在向 ORDER_DETAIL 表中插入一行后,从表 ITEM 中获取“UNIT_PRICE”并根据“ITEM_ID”将其设置为 ORDER_DETAIL 表的“PRICE”。我语法有任何错误吗?先感谢您!
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
【问题讨论】:
【参考方案1】:您应该指的是the NEW
pseudorecord,而不是触发器所在的表。它也应该是插入前触发器,例如:
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;
您的原始代码试图更新触发器所针对的表中的每一行,而不仅仅是新插入的行。
您可能想检查一下,例如,订单上没有您应该乘以单价的数量字段。
【讨论】:
以上是关于如何在 SQL 中对触发器进行语法化,以便在插入后从同一个表中更新列(oracle 数据库)的主要内容,如果未能解决你的问题,请参考以下文章