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

问题描述 投票:0回答:2

我注意到 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.

sql oracle dml
2个回答
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

编辑

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

我很惊讶,但 Oracle 实际上会在 UPDATE 或 DELETE 之后接受

OF column_name
,并且显然在任何一种情况下它都会正确触发,将其视为触发器是为
UPDATE OF COLUMN_NAME
编写的,即使
UPDATE
没有紧接在
OF COLUMN_NAME
之前。

dbfiddle 在这里

很明显,错误消息仅由 SQL Developer 生成,数据库会随时随地接受它。

我每天都学到新东西。 :-)


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.