我注意到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年),这是我的第一篇帖子;感谢您的反馈。
答案 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
之前。
显然,错误消息 完全是由SQL Developer生成的,数据库很高兴在任何地方,任何时候都接受它。
我学到了新的一天。 :-)
答案 1 :(得分:0)
我没有在语法图中定义所需的顺序,因此我认为您可能在sqldeveloper中发现了一个错误。