我在SQL * Developer中遇到了有趣的行为。由于我正在准备考试,因此我想了解一些与分号要求有关的不一致之处。

如您所知-Oracle DB在其文档中对于使用分号和终止语句似乎非常严格。但是,某些命令根本不需要分号。
怎么会这样

DML:-必须有分号:

SELECT .... FROM ...; -- has to have a semicolon
CREATE TABLE x (...); -- has to have a semicolon


TCL:-不需要分号:

SAVEPOINT
ROLLBACK


SQL * Plus:

DESC TABLE tab1 -- does not require semicolons.


为什么如此不一致(至少在SQL * Developer中如此),这里的规则是什么?

最佳答案

您的前端驱动需求,而不是命令本身。 (如果您查看文档,则不会在命令的语法图中找到它们。)我将在下面着重介绍SQL * Plus。 SQL * Developer可能很相似,尽管您的示例之一证明了至少一个区别。

数据库要处理的许多命令可能跨越多行,因此sqlplus使用分号作为输入SQL语句完成时间的指示符,此时它会发送到数据库(无终止分号)。 DML(SELECT),DDL(CREATE TABLE)和TCL(SAVEPOINTROLLBACK)示例就是这种情况。您也可以使用仅带有斜线的行来执行相同操作,也可以使用仅带有“”的行。终止语句,但不将其发送到数据库。

相反,某些命令直接针对前端本身而不是数据库,例如sqlplus DESCDESCRIBE)示例。在那些情况下,前端很聪明,足以识别和处理它们而无需用分号显式终止,这通常是因为前端只能识别单行命令。 (我没有计算以“-”结尾的行,以表示它会延续到下一行。)

PL / SQL的另一个缺点是:其中的语句以分号结尾,因此,如果sqlplus识别到您启动了一个plsql块,则将抑制常规的分号行为,并且必须使用“ /”或“”。完成块。

关于oracle - 为什么在某些Oracle SQL命令之后不需要分号?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44730980/

10-11 22:31
查看更多