
2.4 SQL Plus工具
SQL Plus是最常用的Oracle管理工具。它类似于操作系统的命令行,用户可以通过在SQL Plus中输入命令来向Oracle数据库发送命令,而Oracle数据库也将处理结果通过SQL Plus呈现给用户。也就是说,SQL Plus是一个Oracle数据库与用户之间的命令行交互工具。
下面详细介绍SQL Plus的具体应用,如使用SQL Plus连接Oracle、断开连接、查看表的结构,以及对内容的修改和保存等。
2.4.1 连接Oracle
SQL Plus工具不能够单独使用,只能连接到Oracle才能使用。SQL Plus有两种连接Oracle的方式,一种是通过【开始】菜单直接连接,另一种是通过命令行启动连接,下面详细介绍这两种方式。
【范例5】
首先介绍如何通过【开始】菜单直接连接Oracle,具体步骤如下。
(1)执行【开始】|【程序】|Oracle - OraDB12Home1|【应用程序开发】|SQL Plus命令,打开SQL Plus窗口显示登录界面。
(2)在登录界面中将提示输入用户名,根据提示输入相应的用户名和口令(例如SYSTEM和123456)后按Enter键,SQL Plus将连接到默认数据库。
(3)连接到数据库之后将显示提示符“SQL>”,此时便可以输入SQL命令。例如,可以输入如下语句来查看当前Oracle数据库实例的名称,执行结果如图2-29所示。
SELECT name FROM V$DATABASE;

图2-29 连接到默认数据库
技巧
图2-29中输入的口令信息被隐藏。也可以在“请输入用户名:”后一次性输入用户名与口令,格式为:用户名/口令,例如“SYSTEM/123456”,只是这种方式会显示出口令信息。
要从命令行启动SQL Plus,可以使用SQLPLUS命令。SQLPLUS命令的一般用法形式如下:
SQLPLUS [ user_name[ / password ][ @connect_identifier ] ] [AS { SYSOPER | SYSDBA | SYSASM } ] | / NOLOG ]
语法说明如下。
① user_name:指定数据库的用户名。
② password:指定该数据库用户的口令。
③ @connect_identifier:指定要连接的数据库。
④ AS:用来指定管理权限,权限的可选值有SYSDBA、SYSOPER和SYSASM。
⑤ SYSDBA:具有SYSOPER权限的管理员可以启动和关闭数据库,执行联机和脱机备份,归档当前重做日志文件,连接数据库。
⑥ SYSOPER:SYSDBA权限包含SYSOPER的所有权限,另外还能够创建数据库,并且授权SYSDBA或SYSOPER给其他数据库用户。
⑦ SYSASM:SYSASM权限是Oracle Database 11g的新增特性,是ASM实例所特有的,用来管理数据库存储。
⑧ NOLOG:表示不记入日志文件。
【范例6】
在DOS窗口中输入“sqlplus system/123”命令可以用system用户连接数据库,如图2-30所示。

图2-30 显示口令的连接效果
为了安全起见,连接到数据库时可以隐藏口令。例如,可以输入“sqlplus system@orcl”命令连接数据库,此时输入的口令会隐藏起来,如图2-31所示。

图2-31 隐藏口令的连接效果
提示
图2-31中在用户名后面添加了主机字符串“@orcl”,这样可以明确指定要连接的Oracle数据库。
2.4.2 断开连接
通过输入DISCONNECT命令(简写为DISCONN)可以断开数据库连接,并保持SQL Plus运行。可以通过输入CONNECT命令重新连接到数据库。要退出SQL Plus,可以输入EXIT或者QUIT命令。
如图2-32所示,在SQL Plus连接到Oracle之后执行了一条SELECT语句,可以看到有结果返回。然后运行DISCONNECT断开连接之后,再次执行SELECT语句会提示未连接。此时又使用CONNECT命令建立并执行SELECT语句,最后运行EXIT命令退出SQL Plus,如图2-33所示。

图2-32 断开数据库连接

图2-33 重新连接数据库
2.4.3 使用SQL Plus重启Oracle
在实际应用系统中,一旦出现数据库无法连接,很难从应用系统的日志中获取错误原因。此时,可以使用SQL Plus尝试重启Oracle数据库。在重启过程中错误信息会详细地打印到SQL Plus控制台。
重启数据库的步骤如下。
(1)使用SQL Plus以SYSDBA的身份登录到Oracle数据库。命令如下。
SQLPLUS sys@orcl as sysdba
(2)输入如下命令来关闭Oracle数据库。
SQL>shutdown immediate;
执行后的输出如图2-34所示。从中可以看到Oracle数据库关闭的过程为:关闭数据库→卸载数据库→实例关闭。

图2-34 关闭数据库
(3)输入如下命令来重启Oracle数据库。
SQL>startup;
执行后的输出如图2-35所示。

图2-35 启动数据库
注意
在启动数据库的过程中,如果出现异常,Oracle将会给出错误信息。例如,常见的ORA-32004是由于数据库启动参数设置不当引起的。对于严重错误导致的数据库启动失败,用户也可以根据具体的错误进行处理。
2.4.4 常用命令
SQL Plus为操作Oracle数据库提供了许多命令,例如HELP、DESCRIBE以及SHOW命令等。这些命令主要用来查看数据库信息,以及数据库中已经存在的对象信息,但不能对其执行修改等操作,常用命令如表2-1所示。
表2-1 SQL Plus常用命令

下面以DESC命令为例介绍它的用法。该命令可以返回数据库中所存储的对象的描述。对于表和视图等对象来说,DESC命令可以列出各个列以及各个列的属性。除此之外,该命令还可以输出过程、函数和程序包的规范。
DESC命令语法如下:
DESC { [ schema. ] object [ @connect_identifier ] }
语法说明如下。
(1)schema:指定对象所属的用户名或者所属的用户模式名称。
(2)object:表示对象的名称,如表名或视图名等。
(3)@connect_identifier:表示数据库连接字符串。
使用DESCRIBE命令查看表的结构时,如果指定的表存在,则显示该表的结构。在显示表结构时,将按照“名称”、“是否为空”和“类型”这三列进行显示。
(1)名称:表示列的名称。
(2)是否为空:表示对应列的值是否可以为空。如果不可以为空,则显示NOT NULL;否则不显示任何内容。
(3)类型:表示列的数据类型,并且显示其精度。
【范例7】
假设要查看sys用户下user$表的结构,可用如下命令。
SQL> DESC user$;
执行后的结果如图2-36所示。

图2-36 查看user$表结构
2.4.5 编辑内容
SQL Plus可以在缓冲区中保存前面输入的SQL语句,所以可以编辑缓冲区中保存的内容来构建自己的SQL语句,这样就不需要重复输入相似的SQL语句了。表2-2列出了常用的编辑命令。
表2-2 常用编辑命令

【范例8】
假设要查看sys用户下user$表中用户名包含SYS的用户信息,语句如下。
SQL> SELECT name 2 FROM user$ 3 WHERE NAME like '%SYS'; NAME ------------------------------------------- APPQOSSYS AUDSYS CTXSYS DVSYS LBACSYS MDSYS OJVMSYS OLAPSYS ORDSYS SYS WMSYS 已选择 11 行。
使用SQL Plus编辑命令时,如果输入超过一行的SQL语句,SQL Plus会自动增加行号,并在屏幕上显示行号。根据行号就可以对指定的行使用编辑命令进行操作。
如果在“SQL>”提示符后直接输入行号将显示对应行的信息。例如,这里输入“3”按回车键后,SQL Plus将显示第三行的内容,如图2-37所示。
【范例9】
在范例8的基础上,现在希望user$表的user#列和type#列也出现在查询结果中,可以使用APPEND命令将这两列追加到第一行,语句如下。
SQL> 1 1* SELECT name SQL> APPEND , user#, type# 1* SELECT name, user#, type#

图2-37 输入数字查看行内容
从上面的例子可以看出,user#列和type#列已经追加到第一行中。然后,使用LIST命令显示缓冲区中所有的行,如下所示。
SQL> LIST 1 SELECT name, user#, type# 2 FROM user$ 3* WHERE NAME like '%SYS'
下面使用RUN命令来执行该查询。
SQL> RUN 1 SELECT name, user#, type# 2 FROM user$ 3* WHERE NAME like '%SYS' NAME USER# TYPE# ------------- --------- -------- SYS 0 1 AUDSYS 7 1 APPQOSSYS 48 1 MDSYS 79 1 WMSYS 61 1 OJVMSYS 69 1 CTXSYS 73 1 ORDSYS 75 1 DVSYS 1279990 1 OLAPSYS 82 1 LBACSYS 92 1
【范例10】
在范例9的基础上对查询条件进行修改,现在希望查询出编号小于9的user#列、name列和type#列。
下面使用CHANGE命令对范例9中的WHERE条件进行修改。首先切换到要修改语句所在的行号:
SQL> 3 3* WHERE NAME like '%SYS'
使用CHANGE命令修改条件:
SQL> CHANGE/NAME like '%SYS'/user#<9 3* WHERE user#<9
运行LIST命令查看修改后的语句:
SQL> LIST 1 SELECT name, user#, type# 2 FROM user$ 3* WHERE user#<9
执行语句查看结果:
SQL> / NAME USER# TYPE# -------------- ------- ----------------- SYS 0 1 PUBLIC 1 0 CONNECT 2 0 RESOURCE 3 0 DBA 4 0 AUDIT_ADMIN 5 0 AUDIT_VIEWER 6 0 AUDSYS 7 1 SYSTEM 8 1
技巧
可以使用斜扛(/)代替R[UN]命令,来运行缓冲区中保存的SQL语句。
2.4.6 保存缓冲区内容
在SQL Plus中执行SQL语句时,Oracle会把这些刚执行过的语句存放到一个称为“缓冲区”的地方。每执行一次SQL语句,该语句就会存入缓冲区而且会把以前存放的语句覆盖。也就是说,缓冲区中存放的是上次执行过的SQL语句。
使用SAVE命令可以将当前缓冲区的内容保存到文件中,这样,即使缓冲区中的内容被覆盖,也保留有前面的执行语句。SAVE命令的语法如下:
SAV[E] [ FILE ] file_name [ CRE[ATE] | REP[LACE] | APP[END] ]
语法说明如下。
(1)file_name表示将SQL Plus缓冲区的内容保存到由file_name指定的文件中。
(2)CREATE:表示创建一个file_name文件,并将缓冲区中的内容保存到该文件。该选项为默认值。
(3)APPEND:如果file_name文件已经存在,则将缓冲区中的内容,追加到file_name文件的内容之后;如果该文件不存在则创建。
(4)REPLACE:如果file_name文件已经存在,则覆盖file_name文件的内容;如果该文件不存在则创建。
【范例11】
使用SAVE命令将SQL Plus缓冲区中的SQL语句保存到一个名称为result.sql的文件中。
SQL> SAVE result.sql 已创建 file result.sql
如果该文件已经存在,且没有指定REPLACE或APPEND选项,将会显示错误提示信息。如下:
SQL> SAVE result.sql SP2-0540: 文件 " result.sql " 已经存在。 使用 "SAVE filename[.ext] REPLACE"。
提示
在SAVE命令中,file_name的默认后缀名为.sql;默认保存路径为Oracle安装路径\product\12.1.0\dbhome_1\BIN目录下。
2.4.7 实验指导——使用参数
在SQL Plus中输入SQL语句时如果在某个字符串前面使用了“&”符号,那么就表示定义了一个临时变量。例如,&v_deptno表示定义了一个名为v_deptno的变量。临时变量可以使用在WHERE子句、ORDER BY子句、列表达式或表名中,甚至可以表示整个SELECT语句。在执行SQL语句时,系统会提示用户为该变量提供一个具体的数据。
假设以sys用户连接到Oracle数据库,编写SELECT语句对user$表进行查询,查询出编号小于某个数字的用户信息。该数字的具体值由临时变量&userno决定。
查询语句如下:
SELECT user#, name, type# FROM user$ WHERE user#<=&userno;
由于上述语句中有一个临时变量&userno,因此在执行时SQL Plus会提示用户为该变量指定一个具体的值。然后输出替换后的语句,再执行查询。例如这里输入8,执行结果如下。
SQL> SELECT user#, name, type# 2 FROM user$ 3 WHERE user#<=&userno; 输入 userno 的值: 8 原值 3: WHERE user#<=&userno 新值 3: WHERE user#<=8 USER# NAME TYPE# ------ ----------- --------- 0 SYS 1 1 PUBLIC 0 2 CONNECT 0 3 RESOURCE 0 4 DBA 0 5 AUDIT_ADMIN 0 6 AUDIT_VIEWER 0 7 AUDSYS 1 8 SYSTEM 1
从上述查询结果可以看出,当输入8后查询语句变成了如下最终形式。
SELECT user#, name, type# FROM user$ WHERE user#<=8;
技巧
在SQL语句中如果希望重新使用某个变量并且不希望重新提示输入值,那么可以使用“&&”符号来定义临时变量。使用“&&”符号替代“&”符号,可以避免为同一个变量提供两个不同的值,而且使得系统为同一个变量值只提示一次信息。
除了在SQL语句中直接使用临时变量之外,还可以先对变量进行定义,然后在同一个SQL语句中可以多次使用这个变量。已定义变量的值会一直保留到被显式地删除、重定义或退出SQL Plus为止。
DEFINE命令既可以用来创建一个数据类型为CHAR的变量,也可以用来查看已经定义好的变量。该命令的语法形式有如下三种。
(1)DEF[INE]:显示所有的已定义变量。
(2)DEF[INE] variable:显示指定变量的名称、值和其数据类型。
(3)DEF[INE] variable = value:创建一个CHAR类型的用户变量,并且为该变量赋初始值。
下面的例子定义了一个名称为var_deptno的变量,并将其值设置为20。
SQL> DEFINE var_deptno=20
使用DEFINE命令和变量名就可以用来查看该变量的定义。下面这个例子就显示了变量var_deptno的定义。
SQL> DEFINE var_deptno DEFINE VAR_DEPTNO = "20" (CHAR)
使用DEFINE命令实现上述临时变量相同的功能,具体语句如下。
SQL> DEFIN userno=8 SQL> SELECT user#, name, type# 2 FROM user$ 3 WHERE user#<=&userno; 原值 3: WHERE user#<=&userno 新值 3: WHERE user#<=8
输出结果相同,这里就不再显示。使用UNDEFINE命令可以删除已定义的变量,例如执行“UNDEFINE userno”命令之后定义的userno变量将不再起作用。
除了DEFINE命令,也可以使用ACCEPT命令定义变量。ACCEPT命令还允许定义一个用户提示,用于提示用户输入指定变量的数据。ACCEPT命令既可以为现有的变量设置一个新值,也可以定义一个新变量并初始化。
ACCEPT命令的语法如下:
ACC[EPT] variable [ data_type ] [ FOR[MAT] format ] [ DEF[AULT] default ] [ PROMPT text | NOPR[OMPT] ] [ HIDE ]
下面从USER$表中查询出编号在某个范围的用户信息,包括user#列、name列和type#列。要求使用ACCEPT命令提示用户输入查询范围的最小值和最大值。
具体语句如下:
SQL> ACCEPT minNo NUMBER FORMAT 9999 PROMPT ’请输入最小编号:' 请输入最小编号:5 SQL> ACCEPT maxNo NUMBER FORMAT 9999 PROMPT ’请输入最大编号:' 请输入最大编号:9 SQL> SELECT user#, name, type# 2 FROM user$ 3 WHERE user#>&minNo and user#<&maxNo 4 ; 原值 3: WHERE user#>&minNo and user#<&maxNo 新值 3: WHERE user#> 5 and user#< 9 USER# NAME TYPE# ------ ----------- ------------------ 6 AUDIT_VIEWER 0 7 AUDSYS 1 8 SYSTEM 1