我正在创建一个触发器:
CREATE OR REPLACE TRIGGER ItemAvgRatingTrigger
AFTER INSERT OR UPDATE OF rating ON Collectionitems
REFERENCING NEW AS newRow
FOR EACH ROW
BEGIN
UPDATE Item
SET rating = (SELECT AVG(Collectionitems.rating) FROM Collectionitems, Item WHERE
Collectionitems.itemid = newRow.itemid AND newRow.itemid = Item.itemid)
WHERE Item.itemid = newRow.itemid;
END ItemAvgRatingTrigger;/
当我通过更新Collectionitems中的行来运行触发器时,我得到松鼠返回:
Error: ORA-04098: trigger 'CA0513.ITEMAVGRATINGTRIGGER' is invalid and failed re-validation
SQLState: 42000
ErrorCode: 4098
Position: 7
执行SQL语句:
SELECT * FROM User_Errors;
生成1个错误:
PLS-00103: Encountered the symbol "/" The symbol "/" was ignored./n
我已经阅读过很多帖子,其他人遇到同样的问题,但还没有找到解决方案,还有什么想法?
答案 0 :(得分:4)
无法编译的实际原因是双重的。
:newrow
。/
之前提交回车和/或换行。然而,这个触发器永远不会起作用。您将最终得到一个变异表异常,ORA-04091: table name is mutating, trigger/function may not see it.
这是因为您在行级触发器中引用了您正在更新的表。简单地说,Oracle确保了数据的读一致视图。
在触发器中,您正在更新Collectionitems
。同时从该表中选择,在同一会话中,有两种可能的状态;更新但未更新。为了确保您的视图是读取一致的,Oracle会引发此错误。
在您的特定情况下,您可能需要考虑materialized view而不是触发器。
答案 1 :(得分:0)
将触发器末尾的/
放在一条线上。