使用“ of”子句时,DML语句的顺序是否重要?

时间:2019-06-05 21:09:42

标签: sql oracle dml

我注意到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行业的新手(不到1年),这是我的第一篇帖子;感谢您的反馈。

2 个答案:

答案 0 :(得分:2)

是的,很重要。不会失败的实际上是说

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

好运。


编辑

引用Popeye的话,“好吧,让我失望!”

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

dbfiddle here

显然,错误消息 完全是由SQL Developer生成的,数据库很高兴在任何地方,任何时候都接受它。

我学到了新的一天。 :-)

答案 1 :(得分:0)

我没有在语法图中定义所需的顺序,因此我认为您可能在sqldeveloper中发现了一个错误。

相关问题