我在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中]这里有什么规则?
答案 0 :(得分:6)
您的前端驱动需求,而不是命令本身。 (如果查看文档,则无法在命令的语法图中找到它们。)我将重点介绍下面的SQL * Plus; SQL * Developer可能类似,但您的一个示例至少表明了一个区别。
数据库要处理的许多命令可以跨越多行,因此sqlplus使用分号作为指示,当您输入SQL语句时,它将被发送到数据库(不包括以分号结尾) 。这是DML(SELECT
),DDL(CREATE TABLE
)和&的情况。 TCL(SAVEPOINT
,ROLLBACK
)示例。您也可以使用除了斜杠之外的任何行来执行相同的操作,或者使用除“。”之外的任何行。终止语句但不将其发送到数据库。
相比之下,某些命令是针对前端本身而不是数据库,例如sqlplus DESC
(DESCRIBE
)示例。在这些情况下,前端足够聪明,可以识别和处理它们而不用分号明确终止,通常是因为前端只识别单行命令。 (我不打算用“ - ”结束这一行,表示它会继续到下一行。)
PL / SQL是另一个蜡烛:它中的语句以分号结束,因此如果sqlplus识别出你启动了一个plsql块,那么正常的分号行为就会被抑制,你必须使用“/”或“。”完成阻止。