更新时间:2025-07-17 16:32:48   作者:网友投稿   来源:网友投稿点击:
承接(四)。抽点时间聊聊SQL*PLUS 的一些操作。
1、启动 SQL*PLUS
只需要在操作系统提示符下简单输入 SQLPLUS 就行了。这种启动方式,在 UNIX 和 WINDOWS 操作系统下都适用。随后提示你输入数据库用户名和密码。如果输入正确,看到 SQL> 的提示符,就说明安装和启动都正常。
我们也可以在CMD启动命令行直接带上用户名和密码:
SQLPLUS scott/passwords
但是一些大神不建议这么做,因为在某些操作系统,其他用户可以看到你的命令行参数,因此会获得你的密码。
在多用户系统中,我们可以启动 SQL*PLUS 时使用 /NOLOG 选项,这样就不会立刻连接数据库:
SQLPLUS /NOLOG
随后我们在 SQL*PLUS 环境中运行 CONNECT 命令,输入用户名和密码:
CONNECT scott/passwords
如果允许 SQL*PLUS 的计算机已经正确安装并配置了ORACLE NET ,我们也获得了数据库管理员的授权进行数据库的远程连接,我们就可以通过 SQL*PLUS 连接这些数据库了。要进行远程连接,还需要知道 ORACLE NET 连接标识符(也叫做 服务名),
我们必须在输入用户名和密码的同时,提供连接标识符,这个连接标识符大概是这个样子:
hr.WORLD
在使用的时候,需要把这个标识符加在用户名和密码后面,用@符号隔开:
connect scott/passwords@hr.WORLD
SQL*PLUS 运行起来之后,我们可以做很多事情,下面是一些常见操作:
(1)运行 SQL 语句
(2)编译一个 PL/SQL 程序,并保存到数据库中
(3)运行一个 PL/SQL 程序
(4)执行一个 SQL*PLUS 专有命令
(5)执行一个混合了上述各功能的脚本
2 、运行 SQL 语句
默认的 SQL 语句结束符是分号,我们也可以把它更改成别的符号。
SELECT employee_id,last_name,salary FROM employees;
-----------------------
3、 运行PL/SQL程序
我们在 SQL*PLUS 中输入一个小 PL/SQL 程序:
begin
dbms_output.put_line(hey look,ma!);
end;
/
但是我们看到,虽然显示程序成功完成,可是那个输出结果并没有显示在屏幕上,SQL*PLUS 会时不时莫名其妙的吞掉类似的输出。为了能让结果显示,我们需要使用SQL*PLUS命令来打开 serveroutput 参数:
SET SERVEROUTPUT ON
我们在重新输入上面的程序,结果就能显示了。
通常,一些大神会把打开 SERVEROUTPUT 的命令放到启动文件里面,这样这个开关就会常开,直到碰到以下几个情况发生:
(1)我们断开,退出或者其他方式结束了当前会话;
(2)显式的将 SET SERVEROUTPUT OFF;
(3)ORACLE 数据库因为我们的主动请求或者某种编译错误而丢弃的会话的状态;
(4)一直到 9I的第2版,如果我们通过 CONNECT 命令重新连接数据库,SQL*PLUS 会自动在 CONNECT 之后重新运行启动文件。
如果我们在 SQL*PLUS 环境下输入一条 SQL 或者 PL/SQL 语句,它会为第一行之后的每一行分配一个数字符号,这样做有两个好处:
(1)我们可以在内置的行编辑里指定要编辑的行;
(2)如果数据库检测到代码存在错误,它也会在错误报告中给出行号。
另外,我们在上面的小程序中,看到有一个 斜杠 /,这是我们告知 SQL*PLUS 一个语句结束了。尽管在大多数情况下,不会有什么危害,但是这个 / 有一些重要特点需要知道:
(1)其含义是 执行最新录入的语句。不管最新录入的是SQL还是PL/SQL代码;
(2)是SQL*PLUS里的命令,既不属于 PL/SQL,也不属于SQL;
(3)它必须自己单独一行,在这一行不允许有其他命令存在;
(4)在oracle 9i之前的版本,如果我们无意在斜杠/ 前面加了一个空格,它就不能工作了。但是在9i之后,SQL*plus会自动忽略前面的空格。但是,在所有数据库版本中,在斜杠/后面加空格,都不会有影响。
作为一个简化方法,SQL*PLUS提供了一个execute命令,可以省略 begin 、end 和斜杠/的输入,因此下面的语句等价于上面的语句:
execute dbms_output.put_line(hey look,ma!)
语句末尾的分号是可选的,有的人比较喜欢省略掉。
因为 execute 可以简写,并且与大小写无关,所以甚至可以把语句简化为
exec dbms_output.put_line(hey look,ma!)
------------------------------------------
4、运行一个脚本
几乎所有能在SQL*PLUS环境交互运行的语句,都可以存成文件,以便重复使用。运行脚本最方便的方法是使用 @ 命令,如我们要运行文件 abc.pkg里面所有的命令。
SQL>@abc.pkg
这个文件必须在目录中存在(或者在SQLPATH覆盖的某个目录上)
如果我们不喜欢符号,而希望用单词,那么start命令与 @ 是一样的:
SQL>start abc.pkg
上面这两个命令,在SQL*PLUS的动作分解是一样的:
(1)打开叫做abc.pkg的文件。
(2)顺序执行文件中的所有SQL、PL/SQL 命令。
(3)所有的命令执行完成后,关闭文件,返回到SQL*PLUS提示符下(除非文件中有EXIT命令,那就会直接退出SQL*PLUS)
默认的表现是仅仅把每条语句执行结果显示在屏幕上,如果我们希望看到文件中的命令代码,可以使用 set echo on 命令。
在所举的示例中,文件的扩展名是.pkg。如果我们省略扩展名,会得到如下结果:
SQL> @abc
----
SP2-0310:unable to open file "abc.sql"
---
我们可以看到,默认的文件扩展名是sql。顺便提一下,“SP2-0310”是Oracle 提供的错误编号,“SP2"特指的是 SQL*Plus。
5、当前目录
任何时候,我们从操作系统提示符下启动 SQL*PLUS时,SQL*PLUS 把当时所在的操作系统目录视为自己的当前目录,
换句话说,如果我们这样启动 SQL*Plus:
C:\scott\FILES> sqlplus
那么在 SQL*PLUS 中所有的文件操作(例如打开或运行一个脚本),其默认日录都是 C:\scott\FILES。
如果我们通过快捷方式或是菜单选项来启动 SQL*Plus,那么当前目录就由操作系统和不同的启动机制共同确定。那么,当我们已经进入 SQL*Plus时,该如何改变当前目录呢?不同版本有不同的方式。如果是控制台版的 SQL*Plus,将无法在 SQL*Plus 环境内改变当前目录,
我们必须退出 SQL*Plus,在操作系统提示符下改变目录,然后重新启动 SQL*Plus。
在 GUI 版本中利用“File→Open”或“File→Save”菜单命令的副作用,就能够改变当前目录。
如果要执行其他目录下的脚本文件,我们可以在文件名前加上路径,示例如下:
SQL> @/files/src/release/1.0/abc.pkg
运行非当前目录的脚本文件会带来一个有趣的问题,如果 abc.pkg 文件存在于这个非当前目录,同时,还要调用其他文件,怎么办?
比如,这个脚本里的命令是这样的:
REM Filename: abc.pkg
@abc.pks
@abc.pkb
----
(用“REM”开头的行是一个注释行,SQL*Plus 直接忽略)。执行 abc.pkg 脚本会调用 abc.pks 和 abc.pkb,在我们没有指定路径信息的情况下,
SQL*Plus 会去哪里找这两个文件呢?让我们来看一下
C:\scott\FILES> sqlplus
......
SQL> @/files/src/release/1.0/abc.pkg
SP2-0310:unable to open file "abc.pks
SP2-0310:unable to open file "abc.pkb"
原来它还是去我们启动 SQL*Plus 的当前目录里寻找。
为了解决这个问题,Oracle 创建了“@@”命令。双“@”符号意味着,在本次运行中,“假定所执行文件所在的目录就是当前目录”,
所以,abc.pkg脚本更好的写法是:
REM Filename: abc.pkg
@@abc.pks
@@abc.pkb
------
这次,我们得到如下结果:
C:\scott\FILES> sqlplus
.....
SQL> @/files/src/release/1.0/abc.pkg
Package created.
Package body created.
这回,跟我们希望的一样了。