SQL * Plus命令末尾的分号的意义是什么?


16

有些语句(例如create table,insert into等)最后以分号表示:

CREATE TABLE employees_demo
    ( employee_id    NUMBER(6)
    , first_name     VARCHAR2(20)
    , last_name      VARCHAR2(25) 
         CONSTRAINT emp_last_name_nn_demo NOT NULL
    ) ;

而其他人喜欢

set echo on
connect system/manager

也不要使用分号。

这背后的原因是什么?我如何决定自己将分号放在哪里?


6
+1为了使事情更加混乱,您可以在下一行使用/代替; 在某些情况下。
bernd_k 2011年

Answers:


15

返回本地实例时执行。到服务器的多行命令以分号执行

SQL * Plus手册中详述的特殊命令是唯一不接受分号的命令。Wheras SQL命令必须以结尾,;以便服务器进行解析。


命令末尾的分号与在Sql Server中的OSQL / SQLCMD中执行的命令末尾的GO语句相同。这是命令将被解析和执行的标志。
玛丽安(Marian)

7

在SQL * Plus中输入SQL语句时,它需要知道何时完成操作,尤其是该命令是否跨多个行时。因此,它需要可以用设置的终端字符set sqlterminator。默认情况下,此字符为分号:

SQL> select *
  2  from
  3  dual;

D
-
X

现在,将此终端字符更改为#

SQL> set sqlterminator #
SQL> select *
  2  from
  3  dual#

D
-
X

SQL语句以结束(结束执行)#

您问:为什么set sqlterminator #没有跟分号?回答,因为这不是SQL语句。与SQL * Plus及其行为,输出,连接asf有关的语句(例如set echo onconnect system/manager)不是SQL语句,因此输入时不带分号。

与这有什么关系/

当您输入SQL语句时,SQL * plus会填充所谓的缓冲区。可以使用以下list命令显示此缓冲区:

SQL> list
  1  select *
  2  from
  3* dual
SQL>

(注意:我只输入了list,其余的返回了)

/现在执行什么是目前在缓冲区中。让我们尝试一下:

SQL> /

D
-
X

可以看出,执行了相同的查询。


2

分号是SQL解析器的顺序点,而在SQL * Plus中执行的命令无论如何都会立即执行。打个比方,将C程序中的分号与输入到Shell中的命令进行比较。


0

我的理解是,通用SQL解析器与通用javascript解析器有很多共同点,因为它希望在每个适当的位置后面加一个分号,但在某些情况下不是必需的。当我被教写SQL时,我被告知分号是语言的一部分,而不是我们可以忽略的额外运算符。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.