《Oracle PL/SQL程序设计(第5版)》一一2.3 SQL*Plus

2.3 SQL*Plus

Oracle PL/SQL程序设计(第5版)
作为Oracle前端工具的鼻祖,Oralce 的SQLPlus提供了一个命令行方式的解释器,同时支持SQL和PL/SQL。SQLPlus可以接受用户输入的语句,然后把语句发送给Oracle服务器,并显示处理结果。

尽管经常作为一个用户接口工具SQLPlus饱受诟病,但并不影响SQLPlus成功为我最喜欢的Oracle工具。我并不喜欢那些花里胡哨的玩意和菜单。比较搞笑的是,在我最开始使用Oracle时(大约1986年),这个产品的前身竟然叫做UFI(User Friendly Interface)。虽然20多年过去了,可就算是最新版本的SQL*Plus仍然还谈不上任何的用户友好性,但至少它不会经常崩溃。

这么些年以来,Oracle已经提供了几种版本的SQL*Plus,包括:

一个控制台程序

这是一个从SHELL或者命令行提示符1下运行的程序(这种环境就是所谓的控制台)。
**
一个“伪GUI”程序**
这种SQLPlus只在微软的Windows环境下才提供。之所以把它叫做“伪GUI”是因为除了用的字体是位图字体等特点外,它和SQLPlus是如此相似。读者需要注意:Oracle几年前就已经宣布不再对这个产品提供支持了,并且从Oracle 8i之后这个产品一直没有升级。

iSQL*Plus

这个程序是以Web浏览器方式运行的,Web浏览器连接到中间层的Oracle HTTP Server和iSQL*Plus 服务器。

从Oracle数据库11g开始,Oracle只提供控制台的SQLPlus(sqlplus.exe)。图2-1所示是一个控制台版的SQLPlus屏幕样式。

我通常更偏爱用控制台编程,这是因为:

屏幕绘制快速,尤其对有大量输出的查询操作,这一点尤其重要;
它有完整的命令历史记录(至少在微软的Windows平台上如此);
可以很容易地调整字体、颜色、滚动尺寸这些视觉属性;
实际上只要安装了Oracle服务端或者Oracle客户端,就会带着这个工具,唾手可得。

2.3.1 启动SQL*Plus

要启动控制台版本的SQL*Plus,你只需要在操作系统命令提示符下输入“sqlplus”即可(不同操作系统的提示符不一样,这里统一用“OS>”代替):

OS>sqlplus

这种启动方式在UNIX和Windows操作系统下都适用,SQL*Plus会首先显示一个启动条幅,接着就提示你输入用户名和密码。

SQL*Plus: Release 11.1.0.6.0 - Production on Fri Nov 7 10:28:26 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.

Enter user-name: bob
Enter password: swordfish

Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit

SQL>

如果看到“SQL>”提示符出现,就代表一切正常。(出于安全的考虑,输入的密码不会显示在屏幕上)。

你也可以在命令行中提供用户名和密码的方式进入SQL*Plus,下面这样:

OS>sqlplus bob/swordfish

我不建议用这种方式,因为在某些操作系统中其他用户可以看到你输入的命令行参数,这样他们就能获得你的密码。在多用户系统,你应该使用/NOLOG选项来启动SQLPlus,这种方式只是进入SQLPlus环境,而不会连接到数据库。接下来再通过CONNECT命令,并提供用户名密码进入数据库。像这样:

OS> sqlplus /nolog

SQL*Plus: Release 11.1.0.6.0 - Production on Fri Nov 7 10:28:26 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.
SQL> CONNECT bob/swordfish
SQL> Connected.

如果运行SQLPlus的这台计算机上已经正确的配置了Oralce Net2,并且远程数据库(即运行在另外一台计算机上的数据库)的管理员已经授权了你的访问,你就可以用SQLPlus连接到这些远程数据库上。要想这么做,你需要知道远程数据库的连接标识符(也叫做服务名),当然也要提供你的用户名和密码,一个连接标识符看起来可能是这个样子:

hqhr.WORLD

要想通过连接标志符的方式,你需要把这个连接标识符跟在用户名和密码的后面,中间用符号“@”分隔。像这样:

SQL>CONNECT bob/swordfish@hqhr.WORLD
SQL>Connected
.```  

如果启用的是“伪GUI”版本的SQL*Plus(如图2-2所示),用户名、密码这些身份验证信息是很直观的,Host String一项其实就是我们所说的连接标识符。如果你要连接的数据库就运行在本机上,可以把Host String这一项空着不填。

一旦SQL*Plus运行起来,你就可以进行各种操作了,下面罗列了一些常见的操作:

运行一个SQL语句;
编译一个PL/SQL程序,并保存到数据库中;
运行一个PL/SQL程序;
执行一个SQL*Plus专有的命令;
运行一个掺杂了上面这些内容的脚本。
![image](https://yqfile.alicdn.com/4f4e1e65f7b9ba9fc6f75edca6e7ef284901f6b4.png)

接下来我们就看一下如何进行这些活动。

###2.3.2 运行一个SQL语句
如果使用控制台版本的SQL*Plus,则查询:

SELECT isbn,author,title FROM books;
运行后的输出就类似于图0-1这样3。

在SQL*Plus环境中,缺省的情况下是把分号“;”作为一个SQL语句的结束标志,不过你也可以修改这个结束字符。

###2.3.3 运行PL/SQL程序
我们继续,请在SQL*Plus中输入下面这段PL/SQL代码:

SQL> BEGIN
 2   DBMS_OUTPUT.PUT_LINE('Hey look,ma!');
 3 END;
 4 /
PL/SQL procedure successfully completed.

SQL>

糟糕,这段代码调用了PL/SQL的一个内置方法以显示一些文本,虽然这段代码成功的结束了,但是屏幕上却没有期待的输出。这就是SQL*Plus第一个让人不爽的行为:SQL*Plus缺省会“吃掉”输出内容。为了正常地显示内容,你必须要通过一个SQL*Plus的命令打开SERVEROUTPUT。像下面这样:

SQL> SET SERVEROUTPUT ON
SQL> BEGIN
 2   DBMS_OUTPUT.PUT_LINE('Hey look,Ma!');
 3 END;
 4 /
Hey look,Ma!

PL/SQL procedure successfully completed.
SQL>

通常我会把SERVEROUTPUT命令放在我的启动脚本里(见“在启动时加载你的自定义环境”一节),让输出一直启用直到遇到下面的情况:

你通过断开、退出或者是其他什么方式结束了会话。
明确地通过set SERVEROUTPUT OFF关闭输出;
Oracle数据库或者因为你自己的主动请求或者因为编译错误而丢弃了会话状态(见“重编译失效的程序单元”一节)。
Oracle数据库从版本9.2开始,如果提交一个新的CONNECT语句,SQL*Plus会在CONNECT之后重新运行你的启动文件。
每当在控制台或者“伪GUI”的SQL*Plus环境中录入一条SQL或者PL/SQL语句,SQL*Plus会为第一行以后的每行代码分配一个数字行号。提供行号有两个好处:首先,如果你使用内置的行编辑器(你总有一天会用到的),有行号的帮助可以让你知道要编辑哪一行;其次,如果数据库发现代码中有错误,通常会在错误报告中给出行号。在学习的过程中,你会有很多机会体会到这个好处。

要想让SQL*Plus知道你已经完成了PL/SQL程序的录入,你必须使用一个斜杠“/”作为结尾(见前面例子的第4行)。尽管“/”是基本无害的,但是斜杠也有一些重要的特点:

斜杠“/”的含义是“执行刚录入的这个语句”,不管刚录入的是一个SQL语句还是一个PL/SQL代码;
斜杠“/”不属于PL/SQL语法,也不属于SQL语法,它是SQL*Plus特有的命令;
斜杠“/”只能自己出现在一行中,这一行不能再有其他的命令;
在Oracle 9i之前的SQL*Plus版本中,在斜杠“/”之前不能有空格,否则这个命令不工作!不过从Oracle 9i这个版本开始,SQL/PLUS会忽略掉斜杠“/”前面的空格。而斜杠后面的空格没有影响,在所有版本都如此。
SQL*Plus为PL/SQL用户提供了一个EXECUTE命令,是一个很方便的命令。这就避免了输入BEGIN、END、结尾的斜杠“/”。所以,下面的写法是和之前那段代码完全等价的简写形式:

SQL> EXECUTE DBMS_OUTPUT.PUT_LINE('Hey look, Ma!')
如果使用这种简写方式,结尾的分号“;”也是可选的,不过我更愿意省略它。SQL*Plus提供的许多命令都有缩写形式,并且不区分大小写,EXECUTE命令也一样。所以很多时候这个命令都是这么用的:

SQL> EXEC dbms_output.put_line('Hey look, Ma!')

###2.3.4 运行脚本
基本上所有可以在SQL*Plus环境中以交互方式运行的语句都可以保存到一个文件,然后重复执行。运行这样脚本的最简单方式就是使用SQL*Plus的“at符号”(@)命令4§。比如,下面例子就是运行abc.pkg文件中的所有命令:

SQL>@abc.pkg

要使用这种方式,这个文件必须在我的当前目录下(或者用SQLPATH指定的目录下)。

如果你更偏爱使用单词而不是@符号,可以使用等价的START命令:

SQL>START abc.pkg

这也会得到相同的结果,不管使用@符号还是START命令,SQL*Plus都会做如下的事情:

1.打开名叫abc.pkg文件。

2.尝试着顺序执行这个文件中的所有命令,包括SQL、PL/SQL、SQL*Plus的命令。

3.当所有命令都完成后,关闭文件,并返回到SQL*Plus提示符下(如果文件中调用了EXIT语句,则会直接退出SQL*Plus环境)。

比如:

SQL> @abc.pkg

Package created.

Package body created.

SQL>

默认的行为是仅在屏幕上把每个语句的结果显示出来,如果你还想看到文件的原始内容,你可以使用SQL*Plus的命令SET ECHO ON。

在我的例子中,文件扩展名叫做pkg。如果我没有添加文件扩展名,就会出现下面的结果:

SQL> @abc
SP2-0310: unable to open file "abc.sql"

从输出中可以看出来,如果我们提供了文件名却没有提供文件扩展名,那么SQL*Plus会自动添加默认的文件扩展名,而SQL*Plus默认的文件扩展名是.sql。捎带介绍一下“SP-0310”是Oracle提供的错误编号,“SP2”意味着对于SQL*Plus来说这个错误号是唯一的(关于SQL*Plus错误信息更多内容,可以参考Oracle SQL*Plus User’s Guide and Reference)。

###2.3.5 什么是“当前目录”
每次从操作系统命令行提示符进入SQL*Plus时,SQL*Plus会把当时所在的操作系统目录作为自己的“当前目录”,换句话说,如果我是像下面这样启动SQL*Plus的:

C:BOBFILES>sqlplus

那么在SQL*Plus中的所有文件操作(包括打开或者运行一个脚本),都会被认为操作的是这个目录“C:\BOB\FILES”下的文件,也就是说“C:\BOB\FILES”就是“当前目录”。

如果你是通过快捷方式或者菜单的方式进入到SQL*Plus,那么“当前目录”就取决于操作系统的行为了。进入了SQL*Plus之后又该如何更改“当前目录”呢?这取决于版本,如果是控制台版的SQL*Plus,是没有办法修改的。你必须退出SQL*Plus、在操作系统中改变目录,然后再次启动SQL*Plus。如果是GUI版的SQL*Plus,使用File→Open or File→Save菜单命令的一个副作用就是改变“当前目录”。

如果要执行其他目录下的脚本文件,也可以在文件名前加上路径5,比如:

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.pkg两个脚本,但是我有没有提供目录信息,SQL*Plus会去哪里找这些文件呢?运行下看看:

C:BOBFILES> 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又提供了@@命令。两个at符号意味着,在本次调用中“请假设当前目录已经改成了当前执行文件所在的目录”。所以,abc.pkg脚本更好的写法应该是:

REM Filename: abc.pkg
@@abc.pks
@@abc.pkb

这次,得到的结果是:

C:BOBFILES> sqlplus
...
SQL> @/files/src/release/1.0/abc.pkg
Package created.
Package body created.

这正是我所期待的。

###2.3.6 其他SQL*Plus任务
SQL*Plus本身也有太多的命令,但篇幅所限我只能介绍少数几个特别重要的或者特别容易混淆的命令。要彻底了解这个伟大的产品,请看Jonathan Gennick的《Oracle SQL*Plus:The Definitive Guide》(O’Reilly出版),如果需要快速参考,可以看他的《Oracle SQL*Plus Pocket Reference》(O’Reilly出版)。

个性化设置
对于SQL*Plus而言,你可以通过命令行的方式改变它的一些内置变量或配置的值来改变它的行为。之前已经演示了一个例子,SET SERVEROUTPUT语句。SQL*Plus的SET命令还有许多选项,比如SET SUFFIX(改变默认的文件扩展名)、SET LINESIZE n(设置显示时每一行最大字符数,多出的折行处理)。要看当前会话的各种设置的值,使用这个命令:

SQL> SHOW ALL

SQL*Plus预留了一些特殊变量,这些变量可以影响其行为,也支持创建、操纵自己的内存变量。实际上,SQL*Plus支持两种各自独立的变量类型:DEFINEs和绑定变量。要想给一个DEFINE的变量赋值,你可以使用DEFINE命令:

SQL> DEFINE x = "the answer is 42"

要查看x的值,这样做:

SQL> DEFINE x
DEFINE X = "the answer is 42" (CHAR)

要引用这样的变量,需要使用and符号(&)。SQL*Plus再把语句发送给数据库之前,会对这个变量做一个简单的替换,因此,如果变量值是一个字符串直接量,你还要在变量周围加上单引号。比如:

SELECT '&x' FROM DUAL;

要使用绑定变量,需要先声明变量,然后就可以在PL/SQL中使用了,并可以在SQL*Plus中利用PRINT命令打印该变量:

SQL> VARIABLE x VARCHAR2(10)
SQL> BEGIN
  2    :x := 'hullo';
  3 END;
  4 /

PL/SQL procedure successfully completed.

SQL> PRINT :x

X

hullo

读到这里,读者可能有点迷糊了,有两个不同的变量“x”,一个是定义出来的,而另一个是声明出来的。

SQL> SELECT :x, '&x' FROM DUAL;
old 1: SELECT :x, '&x' FROM DUAL
new 1: SELECT :x, 'the answer is 42' FROM DUAL
:X                       'THEANSWERIS42'
-------------------------------- ----------------
hullo                      the answer is 42

只需知道DEFINE的变量总是被SQL*Plus扩展的字符串,而DECLARED变量可以被SQL和PL/SQL作为真正的绑定变量使用。

输出保存到文件
我们经常会需要把一个SQL*Plus会话的输出保存到文件中——比如你想要生成报告、或者你想记录下你的活动,或者你要动态的生成命令稍后执行。一个简单的方法就是利用SQL*Plus中的SPOOL命令,比如:

SQL> SPOOL report
SQL> @run_report
   ...输出的内容不断翻滚并写到名为report.lst的文件中...
SQL> SPOOL OFF

上面代码中的第一个命令SPOOL report,告诉SQL*Plus把以后的所有输出内容到保存到report.lst文件中。这个扩展名.lst是缺省的扩展名,也可以在SPOOL命令中提供自己的扩展名而不使用默认的,比如:

SQL> SPOOL report.txt

SPOOL OFF命令告诉SQL*Plus结束这个输出保存行为,并关闭文件。

退出SQL*Plus
使用EXIT命令,可以退出SQL*Plus,并回到操作系统:

SQL> EXIT

如果你退出之前还在进行SPOOL,SQL*Plus会关闭SPOOL并关闭文件。

但如果你在会话中修改了表中的数据,并且没有用事务控制语句明确的结束这个事务,然后就退出了会话,这是会发生什么呢?缺省情况下,退出SQL*Plus会强制进行提交(COMMIT),除非会话出现了SQL错误,而你同时还使用了SQL*Plus的WHENEVER SQLERROR EXIT ROLLBACK命令(参见后面的“SQL*Plus中的错误处理”一节)。

要想退出数据库但是不退出SQL*Plus,使用DISCONNECT命令,这个命令的行为是这样的:

SQL> DISCONNECT
Disconnected from Personal Oracle Database 10g Release 10.1.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL>

你无须使用DISCONNECT命令来改变连接─相反,你只需用一个CONNECT命令就行,SQL*Plus会先删掉第一个连接,然后再建一个新的连接。然而,在有些场合断掉然后重连更好:如果你正在使用操作系统验证6,脚本可能会自动重连……使用的是错误的账号,我见过这种情形。

编辑语句
SQL*Plus会在缓存中保留最后执行的语句,你可以使用内置的行编辑器或者任何外部的编辑器来修改这条语句。接下来,我就告诉你如何设置和使用一个外部的编辑器。

使用EDIT命令会让SQL*Plus把当前命令缓存中的内容保存到一个文件,然后暂停SQL*Plus,然后调用编辑器:

SQL> EDIT

默认时,这个文件名叫做afiedt.buf,当然你可以通过使用SET EDITFILE命令改变这个文件名。或者,如果你想编辑一个已有文件,直接把文件名作为参数跟在EDIT后面即可:

SQL> EDIT abc.pkg

一旦你保存文件并推出编辑器,SQL*Plus会话就会把编辑后的最新文件内容读到缓存中,然后会话继续。

Oracle使用的外部编辑器默认是:

UNIX、Linux相关系统使用ed;
微软Windows下使用的是写字板(Notepad)。
SQL*Plus所选的外部编辑器已经被硬编码到sqlplus可执行文件中了,尽管如此,我们仍然可以很容易地改变当前编辑器,通过修改SQL*Plus的_EDITOR变量值就可以。下面就是我经常会用到的:

SQL> DEFINE _EDITOR = /bin/vi


其中/bin/vi是一款流行的编辑器程序的全路径名。因为安全的原因,我建议使用编辑器程序的全路径名格式。

如果你确实想使用SQL*Plus的内置行编译器(而且也确实很方便),你需要知道的主要命令包括:

**L**
列表显示最近语句。

**n**
把语句的第n行作为当前行。

**DEL**
删除当前行。

**C/old/new/**
把当前行中第一个old替换成new,分隔符(这里是一个斜杠)可以是任意字符。

**n text**
把text作为第n行的内容。

**I**
在当前行之后插入一行。要想在第一行之前插入一个新行,使用0命令(即0 text)。

在启动时加载你的自定义环境
要自定义SQL*Plus环境,以便在不同会话之间都能够保留你的偏爱,你需要编辑一个或者全部的自动启动脚本。SQL*Plus在启动时的行为是这样的。

1. 首先寻找$ORACLE_HOME/sqlplus/admin/glogin.sql脚本,找到后执行这个脚本中的命令。这是一个“全局”登录脚本,任何人只要执行的是同一个Oracle Home目录下的SQL*Plus,就会用到这个脚本,不管这些人是从哪个目录运行的。

2. 接下来,SQL*Plus就会运行当前目录下的login.sql脚本,如果有这个脚本的话7。

启动脚本和其他SQL*Plus脚本一样,可以包含同类语句:SET命令、SQL语句、列格式化命令等。

这两个文件都不是必需的。如果两个文件都有的话,则SQL*Plus会先执行glogin.sql,然后执行login.sql,如果两个脚本中发生了变量冲突,会以最后一个配置为主。

下面是我常用的login.sql中的配置

REM Number of lines of SELECT statement output before reprinting headers
SET PAGESIZE 999

REM Width of displayed page, expressed in characters
SET LINESIZE 132

REM Enable display of DBMS_OUTPUT messages. Use 1000000 rather than
REM "UNLIMITED" for databases earlier than Oracle Database 10g Release 2
SET SERVEROUTPUT ON SIZE UNLIMITED FORMAT WRAPPED

REM Change default to "vi improved" editor
DEFINE _EDITOR = /usr/local/bin/vim

REM Format misc columns commonly retrieved from data dictionary
COLUMN segment_name FORMAT A30 WORD_WRAP
COLUMN object_name FORMAT A30 WORD_WRAP

REM set the prompt (works in SQL*Plus
from Oracle9i Database or later)
SET SQLPROMPT "_USER'@'_CONNECT_IDENTIFIER > "

###2.3.7 SQL*Plus中的错误处理
SQL*Plus表现命令成功的方法根据运行命令类型不同。对于大部分SQL*Plus专有命令,只要没有错误消息就代表成功了。另一方面,对于SQL和PL/SQL命令而言,通常会用某种正面的文本内容来表示命令成功执行。

如果SQL*Plus中遇到了一个SQL或者PL/SQL的错误,缺省行为时报告这个错误然后继续处理。在交互式场景下,这种处理行为是很理想的。但如果运行的是一个脚本,很多时候我们更希望出现错误后中止SQL*Plus运行。使用下面的命令就可以实现这个目的:

SQL> WHENEVER SQLERROR EXIT SQL.SQLCODE

这样一来,如果数据库返回任何SQL语句或者PL/SQL语句的错误,SQL*Plus就会终止。而SQL.SQLCODE的含义是:当SQL*Plus中止后,把返回值设置成一个非0值,你可以在调用SQL*Plus的环境中得到这个值8。否则,SQL*Plus会以返回值0结束,这会导致误以为脚本执行成功了。

这个命令的另一种写法是:

SQL> WHENEVER SQLERROR SQL.SQLCODE EXIT ROLLBACK

这个命令除了之前的含义,还包括让SQL*Plus在退出之前把所有还未提交的变化回滚处理。

###2.3.8 喜欢或者讨厌SQL*Plus的原因
除了上面提到的这些特性,下面是SQL*Plus中一些值得你去了解并可能会喜欢上的特性。

使用SQL*Plus,你可以执行“批处理”程序,并在sqlplus命令行中给应用程序提供参数,然后在脚本中使用&1(第一个参数)、&2(第二个参数)来引用这些参数。
SQL*Plus对所有的SQL及PL/SQL语句提供了完整的、最新的支持。如果你使用某些Oracle专有的特点,这点尤为重要。第三方厂商提供的环境不一定能够百分百地覆盖这些特性;比如,有些产品已经放慢了对Oracle对象类型的支持,而这种类型早在多年前就出现了。
SQL*Plus和Oracle服务器运行在完全相同的硬件平台和操作系统平台之上。
不过和任何一种工具一样,SQL*Plus也有一些不足之处。

在控制台版本的SQL*Plus中,语句缓存区被限制到仅能保存最后一条语句;SQL*Plus不能提供更多的命令历史。
SQL*Plus缺乏一些现代命令解释器的特性,比如关键字的自动完成或者在输入语句时提示哪些数据库对象可用。
联机帮助只提供了少量的SQL*Plus命令集的文档(使用HELP命令可以获得一个指定命令的帮助信息);
一旦启动了SQL*Plus,就没有办法改变当前目录。当需要打开或者保存脚本,而你又不喜欢输入完整路径名时,这一点比较让人恼火。如果你觉得当前目录不方便,你必须退出SQL*Plus环境、改变目录,再次启动SQL*Plus。
SQL*Plus只会在启动目录下寻找login.sql脚本;除非我忍无可忍,终于决定使用我一直认为是很危险的SQLPATH特性;如果它能够去我的home目录下寻找启动脚本那可就太好了。
归根结底,SQL*Plus不过是某种“真正程序员”的工具,既不暧昧也不热情。不过它又无处不在,而且不会崩溃,而且Oracle公司会一直支持下去。

1 Oracle把这个叫做“命令行接口”版的SQL*Plus,不过我发现这种叫法有时会让人迷惑,因为这三个中有两个都提供了命令行的接口。
2 Oracle Net这个产品以前叫做Net8和SQL*Net。
3好吧,其实图2-1所示的是我做了些手脚后的结果,因为我使用了许多列格式化的命令。如果本书专门介绍SQL*Plus或者如何显示数据,那我会告诉你如何通过设置不同的格式化或显示属性来控制输出的样式,在SQL*Plus中有太多的办法能做这个了。记住我的话,方法要比问题多得多。
4 START、@和@@命令只在非浏览器版的SQL*Plus中才有,在iSQL*Plus中,你可以使用“Browse”和“Load Script”按钮达到同样效果。
5让人惊喜的是,在SQL*Plus中,可以使用斜杠“/”作为目录分隔符,不用考虑最终是在UNIX、Linux还是微软Windows操作系统上运行,这就让你的脚本在不同的操作系统间移植起来更加容易。
6使用操作系统验证,可以在登录SQL*Plus是跳过用户名/密码提示。
7如果这个文件不存在,但在环境变量SQLPATH中用冒号分隔符定义了多个目录,SQL*Plus会在这些目录下搜索,并执行第一个遇到的login.sql脚本。我的规则就是不使用SQLPATH变量,否则会被它搞糊涂。
8比如,在UNIX Shell中,使用$?,在Windows系统中,使用%ERRORLEVEL%,都可以获得返回值。
时间: 2024-10-26 19:12:42

《Oracle PL/SQL程序设计(第5版)》一一2.3 SQL*Plus的相关文章

《Oracle PL/SQL程序设计(第5版)》一一1.4 关于PL/SQL的版本

1.4 关于PL/SQL的版本 Oracle PL/SQL程序设计(第5版) 每个版本的Oracle数据库都有其对应的PL/SQL版本.只要我们使用的是最新版的PL/SQL,就会有更多的功能供我们使用.作为PL/SQL程序员的最大挑战就是"紧跟".我们不需要不断地自学每个版本中的新特性─学会使用它们,尤其在我们自己的应用程序中该如何使用,确定有些新技术尤其有用,我们应该利用这些新技术修改已有的应用程序. 表1-1总结了数据库中每一版(过去的和当前的)PL/SQL的主要成员(注意在早期的

《Oracle PL/SQL程序设计(第5版)》一一2.6 在其他语言中调用PL/SQL

2.6 在其他语言中调用PL/SQL Oracle PL/SQL程序设计(第5版) 总有一天,你会在从C.Java.Perl.PHP或其他语言中调用PL/SQL.虽然这是一个很合理的需求,如果你曾经做过跨语言的开发工作,你一定熟知要把各种语言专有的数据类型糅合在一起─尤其是那些复合数据类型,比如数组.记录或者对象类型─的复杂性,更不用说不同的参数语法或者厂商对所谓"标准"应用编程接口(API)的扩展,比如微软的ODBC(Open Database Connectivity). 我会用几

《Oracle PL/SQL程序设计(第5版)》一一1.5 PL/SQL开发人员的资源

1.5 PL/SQL开发人员的资源 Oracle PL/SQL程序设计(第5版) O'Reilly在1995年出版了本书的第一版.当时,Oracle PL/SQL编程这本书确实造成一个小轰动.它是第一本关于PL/SQL的独立著作(也就是,不是来自于Oracle公司的).从那时开始,PL/SQL程序员的资源─图书.开发环境.工具以及网站─开始蓬勃发展.(当然,迄今为止这本书仍然是这些资源中最重要和最有价值的!) 下面这一节简要地介绍了这许多资源.要充分利用这些资源,许多资源都可以免费获得或者非常低

《Oracle PL/SQL程序设计(第5版)》一一1.6 一些建议

1.6 一些建议 Oracle PL/SQL程序设计(第5版) 自从本书1995年第一版出版以来,我有机会培训.帮助.与上千名PL/SQL开发人员合作过.在这个过程中,我从学生和读者中学到的许多,也深刻的理解了在PL/SQL世界中我们是如何工作的.我要给你一些如何让这个强大的编程语言更有效的工作的建议,你可不要不耐烦. 1.6.1 不要太着急 我们的工作时间总是很紧迫,记者解决一个个的问题.我们不能浪费时间,有太多的代码要写.因此马上开始吧--对吗? 错误.如果太快地深入到代码构建中,盲目地把用

《Oracle PL/SQL程序设计(第5版)》一一2.2 创建和编辑源代码

2.2 创建和编辑源代码 Oracle PL/SQL程序设计(第5版) 当今的程序员有太多的代码编辑器可以选择,从最简单的纯文本编辑器到最花哨的开发环境让人眼花缭乱.不同的程序员会有不同的选择,本书的一名作者Steven Feuerstein,非常痴迷于Toad IDE.他也是一个非常典型的IDE用户--最多熟悉界面上10%的功能和按钮,并严重依赖于这些功能.相反Bill Pribyl说他自己是一个"非常古怪的人,因为我只喜欢使用一个非常朴素的文本编辑器来写PL/SQL程序.我的一个要求就是,它

《Oracle PL/SQL程序设计(第5版)》一一1.1 什么是PL/SQL?

1.1 什么是PL/SQL? Oracle PL/SQL程序设计(第5版) Oraclel 的PL/SQL语言有这样一些典型的特点: ** 它是一种高度结构化.易读.易理解的语言** 如果你是一个开发新手,那么PL/SQL是一个非常好的起点.你会发现PL/SQL是一门非常容易掌握的语言,它有丰富的关键字.语法结构,可以让编写出能够清晰的表达你的意图的代码.如果你在其他开发语言已经是一个资深开发者,你也会发现PL/SQL这门新语言非常容易适应的. ** 它是一种标准的.可移植的Oracle开发语言

《Oracle PL/SQL程序设计(第5版)》一一第1章 PL/SQL概述

第1章 PL/SQL概述 Oracle PL/SQL程序设计(第5版) 所谓PL/SQL,即"Procedural Language extensions to the Structured Query Language"的首字母缩写.在关系数据库的世界中,SQL语言是无处不在,从数据查询到数据更新.Oracle 公司发明PL/SQL为了克服SQL语言自身的一些局限,并为那些要在Oracle数据库中运行的核心业务,提供一种更完整的变成解决方案.这一章将介绍PL/SQL,包括它的起源.它

《Oracle PL/SQL程序设计(第5版)》一一2.5 编辑PL/SQL的环境

2.5 编辑PL/SQL的环境 Oracle PL/SQL程序设计(第5版)如前所述,你可以选择像SQL*Plus这样最朴素的编辑和执行环境,你也可以使用一个集成开发环境,后者提供丰富的图形界面能够提高生产力.这一部分会罗列一些最流行的IDE工具.我不会推荐任何一款工具,你应该仔细定义你的需求列表并排出优先顺序,然后再看哪一款最能满足你的需求.还有许多其他的PL/SQL IDE工具,但上面罗列的这些足够了.

《Oracle PL/SQL程序设计(第5版)》一一第2章 创建并运行PL/SQL代码

第2章 创建并运行PL/SQL代码 Oracle PL/SQL程序设计(第5版)即便一个PL/SQL程序员从来不重视系统设计或者单元测试这样的任务,他也必须熟悉下面这些最基本的操作: 在数据库中导航:创建和编辑PL/SQL源代码:编译PL/SQL源代码,修正编译器发现的代码错误(或者,可选的,处理警告信息):在某些环境下运行编译后的程序:检查程序执行结果(可能是从屏幕上的输出,或者是根据表中的数据变化,等等).PL/SQL是寄生在Oracle执行环境中的(因此说它是"嵌入式语言"),这

《Oracle PL/SQL程序设计(第5版)》一一1.2 PL/SQL的起源

1.2 PL/SQL的起源 Oracle PL/SQL程序设计(第5版)Oracle公司一度领导软件工业为设计数据库和应用程序提供一种声明式的.非过程化的方法.Oracle数据库服务器是世界上最先进的.最强大的.最稳定的关系数据库.它的应用程序开发工具,比如Oracle Forms,通过提供大量的默认功能,提高了生产力水平,开发人员只要依靠"在屏幕上涂涂画画"的方法,就能避免自行开发的劳苦. 1.2.1 早期的PL/SQL 在早期的Oracle中,SQL的声明式方法,以及开天辟地的关系