【问题标题】:Oracle Compound TriggerOracle 复合触发器
【发布时间】:2014-04-17 21:15:50
【问题描述】:

我意识到这是一个非常基本的问题,但我已经被困了三个小时,我无法从任何帮助论坛中找到任何提示。

我今天开始使用 PL SQL,我立即遇到了表突变问题。我现在想写一个复合触发器来解决这个问题。

但我无法运行最基本的复合触发器,即使我从 Oracle 的文档页面复制以下代码也是如此。

http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/triggers.htm#LNPLS2005

我收到以下错误:

Error: ORA-04071: missing BEFORE, AFTER or INSTEAD OF keyword
SQLState:  42000
ErrorCode: 4071

当我运行这个时:

CREATE OR REPLACE TRIGGER AverageUpdate FOR UPDATE OF Rating ON UserGame
COMPOUND TRIGGER;

BEFORE STATEMENT IS
BEGIN
NULL;
END BEFORE STATEMENT; 

BEFORE EACH ROW IS
BEGIN
NULL;
END BEFORE EACH ROW;

AFTER EACH ROW IS
BEGIN
NULL;
END AFTER EACH ROW;

AFTER STATEMENT IS
BEGIN
NULL;
END AFTER STATEMENT;

END AverageUpdate;
/

谁能帮我理解为什么?

注意:我正在使用 Squirrel。我将默认语句分隔符从 ;到/

【问题讨论】:

  • 删除 COMPOUND TRIGGER 后的分号。
  • 首先,您使用的是什么版本的Oracle?复合触发器是一个相对较新的功能。其次,如果这是您使用 PL/SQL 的第一天,您似乎很担心您正在尝试解决变异表错误。这些错误几乎总是表明您正在尝试做一些您不应该在触发器中做的事情,或者您有一个需要解决的基础数据模型问题。
  • 啊,是的,我出于绝望添加了分号。当我删除它时它仍然不起作用。
  • 这里是版本:BANNER Oracle9i Enterprise Edition Release 9.2.0.6.0 - 64bit Production PL/SQL Release 9.2.0.6.0 - Production CORE 9.2.0.6.0 Production TNS for Solaris:版本 9.2 .0.6.0 - 生产 NLSRTL 版本 9.2.0.6.0 - 生产 这是版本:
  • 我立即遇到了表突变问题” - 经常发生这种情况(尤其是对于刚接触 Oracle 的人)是因为对 行级别 触发器工作。您通常不需要selectupdate 触发触发器的表,因为您可以直接访问修改/插入行的所有列。您应该发布一个新问题,告诉我们实际问题是什么(当然停止使用已弃用且不受支持的 Oracle 版本)

标签: sql oracle


【解决方案1】:

您收到错误是因为您运行的是非常旧的 Oracle 版本(9.2.0.6 已被弃用多年)并且当时不存在复合触发器。在 9.2 中,您必须声明多个触发器协同工作以解决变异触发器错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-01
    • 2016-05-21
    • 2020-12-30
    • 2015-09-18
    • 2012-05-23
    • 2020-06-17
    • 2022-01-03
    • 2011-05-11
    相关资源
    最近更新 更多