为什么我在一些Oracle SQL命令后不需要分号?

时间:2017-06-23 22:55:39

标签: oracle

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

如您所知 - Oracle DB在其文档中似乎对使用分号和终止语句非常严格。然而,有些命令根本不需要分号。 为什么会这样?

DML: - 必须有分号:

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

TCL: - 不需要分号:

SAVEPOINT
ROLLBACK

SQL *加:

DESC TABLE tab1 -- does not require semicolons.

为什么它如此不一致[至少在SQL * Developer中]这里有什么规则?

1 个答案:

答案 0 :(得分:6)

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

数据库要处理的许多命令可以跨越多行,因此sqlplus使用分号作为指示,当您输入SQL语句时,它将被发送到数据库(不包括以分号结尾) 。这是DML(SELECT),DDL(CREATE TABLE)和&的情况。 TCL(SAVEPOINTROLLBACK)示例。您也可以使用除了斜杠之外的任何行来执行相同的操作,或者使用除“。”之外的任何行。终止语句但不将其发送到数据库。

相比之下,某些命令是针对前端本身而不是数据库,例如sqlplus DESCDESCRIBE)示例。在这些情况下,前端足够聪明,可以识别和处理它们而不用分号明确终止,通常是因为前端只识别单行命令。 (我不打算用“ - ”结束这一行,表示它会继续到下一行。)

PL / SQL是另一个蜡烛:它中的语句以分号结束,因此如果sqlplus识别出你启动了一个plsql块,那么正常的分号行为就会被抑制,你必须使用“/”或“。”完成阻止。