【问题标题】:Does the order of the DML statements matter when using the "of" clause?使用“of”子句时,DML 语句的顺序是否重要?
【发布时间】:2019-06-05 21:09:42
【问题描述】:

我注意到 Oracle SQL Developer (19.1.0.094.2042) 引用了自 2013 年(我刚开始)以来启用的数据库触发器的语法错误(通过高亮显示),该触发器没有错误并触发。 Oracle 刚刚从 11g 更新到 18c。现在我正在询问在使用“of”子句时,DML 语句的顺序是否重要。

当我更改“DELETE”和“UPDATE”的顺序时,它的编译结果是一样的,尽管没有突出显示错误。

语法错误:

AFTER UPDATE OR DELETE OF column_name ON table_name
FOR EACH ROW

没有语法错误:

AFTER DELETE OR UPDATE OF column_name ON table_name
FOR EACH ROW

使用第一个排序看起来很奇怪,因为它似乎在语法上暗示两个析取词都适用于“of”子句。 “删除”没有用处。但是,我在任何地方都找不到这个问题或解释,虽然我看到了这两个命令,但实际上“更新或删除”的实例比“删除或更新”的实例更多。

我还是 IT 行业的新手(

【问题讨论】:

    标签: sql oracle dml


    【解决方案1】:

    是的,这很重要。没有失败的实际上是在说

    AFTER (DELETE) OR (UPDATE OF COLUMN_NAME) ON TABLE_NAME
    

    失败的是(试图)说

    AFTER (UPDATE) OR (DELETE OF COLUMN_NAME) ON TABLE_NAME
    

    (此处的括号仅用于说明 - 在 Real Code (tm) 中使用它们也会导致语法错误)。

    'OF COLUMN_NAME' 仅与 UPDATE 一起有效。当与 DELETE 关联时,这是一个语法错误。

    如果您没有指定列名,您可以用任何一种方式来表述它,例如作为

    AFTER UPDATE OR DELETE ON TABLE_NAME
    

    AFTER DELETE OR UPDATE ON TABLE_NAME
    

    祝你好运。


    编辑

    引用大力水手的话,“好吧,把我吹倒!!!”。

    我很惊讶,但是 Oracle 在 UPDATE 或 DELETE 之后实际上会接受 OF column_name,显然它在任何一种情况下都会正确触发,将其视为为 UPDATE OF COLUMN_NAME 编写的触发器,即使 UPDATE不紧跟在OF COLUMN_NAME 之前。

    dbfiddle here

    显然错误消息完全由 SQL Developer 生成,并且数据库很乐意随时随地接受它。

    我每天都在学习一些新的东西。 :-)

    【讨论】:

    • 如果触发器错误,在加载触发器时不会产生错误吗?据我所知,这只是 sqldeveloper 中的编辑器。
    【解决方案2】:

    我在语法图中没有看到任何必需的顺序,所以我想你可能在 sqldeveloper 中发现了一个错误。

    【讨论】:

    • 参见Oracle Documentation,尤其是关于dml_event_clause的小节。它清楚地表明任何“列列表”必须遵循仅更新。
    猜你喜欢
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    相关资源
    最近更新 更多