3

我正在创建一个触发器:

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 中的一行来运行触发器时,我都会得到 squirrel 的返回:

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

我已经阅读了很多其他有同样问题的帖子,但还没有找到解决方案,有什么想法吗?

4

2 回答 2

4

编译失败的实际原因是双重的。

  1. 您应该将新值引用为:newrow.
  2. 您确实需要在/.

但是,此触发器永远不会起作用。您最终会遇到一个变异表异常,ORA-04091: table name is mutating, trigger/function may not see it.这是因为您在行级触发器中引用要更新的表。简而言之,Oracle 确保数据的读取一致视图。

在触发器中,您正在更新Collectionitems. 同时从这个表中选择,在同一个会话中,有两种可能的状态;更新和未更新。为了确保您的视图是读取一致的,Oracle 会引发此错误。

在您的特定情况下,您可能需要考虑物化视图而不是触发器。

延伸阅读:

于 2012-05-06T16:34:18.710 回答
0

/触发器末尾的 放在一条线上。

于 2012-05-06T15:29:31.213 回答