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

Laz*_*zer 16 oracle oracle-11g-r2 sqlplus

一些语句,如 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
    ) ;
Run Code Online (Sandbox Code Playgroud)

而其他人喜欢

set echo on
connect system/manager
Run Code Online (Sandbox Code Playgroud)

也不要分号。

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

Bri*_*ton 16

对本地实例的命令在返回时执行。服务器的多行命令在分号上执行

SQL*Plus 手册中详述的特殊命令是唯一不接受分号的命令。而SQL 命令必须以 a 结尾;才能被服务器解析。


Ren*_*ger 7

当您在 SQL*Plus 中输入一条 SQL 语句时,它需要知道您何时完成了它,尤其是当该命令跨越多行时。因此,它需要一个终端字符可以与设置字符set sqlterminator。默认情况下,此字符是分号:

SQL> select *
  2  from
  3  dual;

D
-
X
Run Code Online (Sandbox Code Playgroud)

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

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

D
-
X
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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

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

SQL> /

D
-
X
Run Code Online (Sandbox Code Playgroud)

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