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

为什么在某些Oracle SQL命令后不需要分号?,oracle,Oracle,我在SQL*Developer中遇到了有趣的行为。由于我正在准备考试,我想了解一些与分号要求相关的不一致之处 正如您所知,Oracle DB在其文档中对分号和终止语句的使用似乎非常严格。然而,有些命令根本不需要分号。 为什么会这样 DML:-必须有分号: SELECT .... FROM ...; -- has to have a semicolon CREATE TABLE x (...); -- has to have a semicolon SAVEPOINT ROLLBACK TCL

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

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

DML:-必须有分号:

SELECT .... FROM ...; -- has to have a semicolon
CREATE TABLE x (...); -- has to have a semicolon
SAVEPOINT
ROLLBACK
TCL:-不需要分号:

SELECT .... FROM ...; -- has to have a semicolon
CREATE TABLE x (...); -- has to have a semicolon
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 SAVEPOINT、ROLLBACK示例就是这种情况。你也可以用一条只有斜线的直线来做同样的事情,或者用一条只有斜线的直线。终止语句但不将其发送到数据库

相反,有些命令直接指向前端本身,而不是数据库,例如sqlplus DESC DESC descripe示例。在这些情况下,前端足够智能,可以识别和处理它们,而无需使用分号显式终止,这通常是因为前端只识别单行命令。我不计算以-结尾的行,以表明它继续到下一行


PL/SQL是另一个蜡球:其中的语句以分号结尾,因此如果sqlplus识别出您启动了plsql块,那么正常的分号行为将被抑制,并且必须使用/或。完成该块。

SQL语句始终需要一个;我很确定保存点和回滚也可以——这也是SQL标准定义的。DESC不是SQL语句,它是SQL客户机提供的实用语句,因为它不能跨越多行,所以不需要有终止字符。@a_horse_和_no_name-我不认为这是真的。据我所知,根据SQL标准,SQL语句没有终止符。在SQLDeveloper中,您可以选择不带分号的完整SQL语句并执行它。分号由接口实用程序(如SQL*Plus和SQL Developer)用来决定SQL语句的结束位置,因为SQL语句一次只能发送一条到服务器,即使它们在脚本中也是如此。事实上,如果您检查保存在目录中的SQL语句的文本,则末尾没有分号。必须有分号不是真的,除非SQL输入窗口中有多个SQL语句。尝试:清除输入窗口,键入select*from dual,不带分号!然后按CTRL+ENTER键执行它。您将看到执行该语句时没有分号。再输入一条SQL语句,如select count*from dual。如果选择窗口中的所有内容并按CTRL+ENTER键,则会出现错误。但是如果您只选择两条语句中的一条并执行它,它将不会有任何问题。请注意,适当的SQL命令(如select*from dual)也不需要分号。在SQL*Plus提示下键入select*from dual,不使用分号,然后按ENTER键。语句现在位于缓冲区中,没有分号。现在键入/并输入。这会将语句从缓冲区发送到要执行的服务器。执行查询。不需要分号。但是,如果您键入一个,SQL*Plus会知道您的语句已完成,并将语句发送到服务器,而无需等待/。