我注意到 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”子句。 “DELETE OF”没有任何用处。然而,我在任何地方都找不到这个问题或解释,虽然我看到了这两个顺序,但实际上“更新或删除”的实例比“删除或更新”的实例更多。
我还是IT行业的新手(< 1 year), and this is my first post; I appreciate any feedback.
是的,这很重要。没有失败的人实际上是在说
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
之前。
很明显,错误消息是仅由 SQL Developer 生成,数据库会随时随地接受它。
我每天都学到新东西。 :-)
我看到语法图中没有定义必需的顺序,所以我想您可能在 sqldeveloper 中发现了一个错误。