如果你想在SQL*Plus中显示PL/SQL变量的值;如果你让多段PL/SQL脚本共享一个变量,你可以使用Oracle提供的绑定变量(Bind v ariables)。绑定变量(Bind variables)是在SQL*Plus中定义并在PL/SQL中引用的变量。并且,在SQL*Plus中可以显示绑定变量的值。
定义绑定变量。
VARIABLE是SQL*Plus命令,用于定义绑定变量。VARCHAR2(100)用于定义绑定变量的数据类型。
在PL/SQL块中引用绑定变量。绑定变量的引用格式是冒号(:),后面紧跟绑定变量的名称。
PL/SQL过程已成功完成。ret_val是绑定变量的名称。
打印绑定变量的内容。
对于初学者来说,大家都很想快速登录数据库,一显身手。登录数据库是初学者最关心的问题。要对数据库进行操作,可以使用SQL*Plus,可以使用PL/SQL Developer,也可以使用第三方工具(如:TOAD、PB等)。我们这里只介绍如何使用SQL*Plus登录数据库。使用SQL*Plus登录数据库,共有三种方法。
◆ 方法一 :通过图形界面登录(以Windows为例)。
单击Windows的“开始”→“运行”,输入命令cmd后按回车键,就进入操作系统的命令行,如图5-3所示。
在命令行中输入命令sqlplusw后按回车键,出现登录的图形对话框,如图5-4所示。
图5-3 命令行窗口
图5-4 登录数据库的对话框
在登录对话框中,输入用户名、口令和主机字符串(网络服务名),单击“确定”按钮登录数据库,登录以后,出现如图5-5所示的对话框。
图5-5 登录数据库成功
注意: 如果是登录本机,则在默认情况下,不需要输入主机字符串(网络服务名)。
登录后出现提示符,这时候我们就可以执行各种命令来管理Oracle数据库。
◆ 方法二 :通过命令行登录(以Linux为例)。
以用户oracle的身份登录操作系统,出现如图5-6所示的窗口。
图5-6 Linux命令行窗口
在命令行中直接输入sqlplus,出现如图5-7所示的窗口。
图5-7 登录窗口
输入用户名、密码和主机字符串(网络服务名),成功登录数据库,出现如图5-8所示的窗口。
图5-8 成功登录数据库
成功登录以后,将出现SQL*Plus的提示符。
◆ 方法三 :一步登录(以Linux为例,Windows也很类似)。在命令行中输入用户名、密码及网络服务名(Net Service Name),一步登录数据库。
以用户oracle的身份登录操作系统,如图5-9所示。
图5-9 Linux命令行窗口
在Linux的命令行提示符下输入:sqlplus test/test@wxxrdb,按回车键,登录成功后,出现如图5-10所示的窗口。其中,sqlplus是启动SQL*Plus的命令,第一个test是用户名,第二个test是密码,@wxxrdb表示要登录到的数据库是wxxrdb。wxxrdb是网络服务名(Net Service Name)。
图5-10 登录成功
【小贴士(Tip)】 主机字符串,又叫网络服务名(Net Service Name)或连接描述符(Connect Identifier)。各种书上的命名方法不一样。它和操作系统(OS)的主机名完全是两回事。它用于指定客户端要连接到哪个数据库。网络服务名(Net Service Name)是在Oracle Net Service里配置的。如果SQL*Plus和数据库服务器在同一台机器上,则使用SQL*Plus登录本机的数据库,一般情况下,不需要指定网络服务名(Net Service Name)。
对于初学者来说,进入SQL*Plus后,最想知道的是如何执行一条SQL语句。执行一条SQL语句,本来是一件简单的事情,但是,这里还是有必要介绍一下。执行一条SQL语句有两种方法:SQL语句以分号(;)或者斜杠(/)结束,但是斜杠(/)必须占用单独的一行。
◆ 方法一 :SQL语句以分号结束。
这条语句得到当前的系统时间。
◆ 方法二 :语句以斜杠(/)结束,但是,斜杠占用单独的一行。
所谓自动提交模式(AUTOCOMMIT),就是当我们在SQL*Plus对数据库执行DML(INSERT、UPDATE、DELETE)语句的时候,不用我们显示地在SQL*Plus中输入COMMIT命令来提交对数据库的修改,而由SQL*Plus自动执行COMMIT命令。
只需在SQL*Plus中执行下面的命令。
【小贴士(Tip)】 不推荐启用自动提交模式(AUTOCOMMIT),当我们输入一条SQL语句,在还没有确认的情况下,处在自动提交模式下的SQL*Plus会自动把我们对数据库的修改提交到数据库,这有可能会错误地删除数据。
如果一条SQL语句长时间运行,我们想马上终止它的运行,Oracle提供了两种方法终止正在运行的SQL语句。
◆ 方法一 :单击SQL*Plus的菜单“文件”→“取消”,如图5-11所示。
◆ 方法二 :利用组合键“Ctrl+C”。
有时,需要在SQL*Plus中执行操作系统命令,SQL*Plus提供了这样的功能。具体的格式是:HOST OS COMMANDS,其中HOST是关键字,后面跟着操作系统命令。
在本例中,在SQL*Plus中执行操作系统命令dir,列出目录d:\下所有的文件。
图5-11 终止命令的执行
PL/SQL块(Block)是以DECLARE或BEGIN开头,以END结束的一段程序代码。可以直接在SQL*Plus中执行PL/SQL块。
执行以下的代码段往表A4中插入1000条记录。
PL/SQL过程已成功完成。
存储过程(Stored Procedure)是存储在数据库服务器中,经过编译的一段程序代码。可以在SQL*Plus中直接执行存储过程,完成我们想要完成的任务。
在SQL*Plus中执行存储过程的语法如下:
要在SQL*Plus中执行存储过程,必须以关键字EXEC开头,后面紧跟存储过程的名称。
本例中执行存储过程mypro,输出HELLO!morning。
有时要重复执行一条SQL语句,而不想重复输入。SQL*Plus允许用户重复执行最后一条SQL语句。SQL*Plus提供了一个SQL缓冲区,当用户执行完一条SQL语句的时候,这条语句会被缓存在SQL缓冲区中,直到输入新的语句,覆盖原先的语句,或者用户退出SQL*Plus。
在SQL*Plus中输入斜杠(/)将重复执行一条SQL语句。RUN也可以用来重复执行一条SQL语句,它的功能和斜杠(/)相同。
例如:执行一条SQL语句,这条语句将被缓存在SQL缓冲区中。
通过LIST命令查看缓冲区中的SQL语句,这条语句正是我们刚才执行的语句。
输入斜杠(/),将重复执行缓冲区的SQL语句。
【小贴士(Tip)】 如果SQL缓冲区中没有SQL语句,则输入斜杠(/)会产生错误。
在操作系统的命令行输入sqlplusw命令时,出现如图5-12所示的登录对话框。但是,在该窗口,只能尝试登录3次,如果超过3次,登录窗口将自动关闭。如果我们再次登录,则还需要在命令行再次输入sqlplusw命令打开登录窗口,这是比较烦琐的事情。
在操作系统命令行中输入sqlplusw/nolog,将会出现如图5-13所示的窗口。即使我们在该窗口登录数据库1000次失败,该窗口也不会自动关闭。
图5-12 登录数据库的对话框
图5-13 未登录数据库
初始化参数NLS_DATE_FORMAT控制日期格式的显示。通过修改参数NLS_DATE_FORMAT可以把客户端的日期变成各种各样需要的格式。利用ALTER SESSION命令完成日期显示格式的设置。
查询当前的日期显示格式,当前日期的显示格式如下:
修改日期的显示格式。
其中,yyyy表示年(如:2006年);mm表示月份(如04表示4月份);hh表示小时,hh24表示按照24小时计算的时间;mi表示分钟;ss表示秒。
查看日期的显示格式是否发生了改变。
输出表示,当前的日期是2006年4月10日,16点48分33秒。
【小贴士(Tip)】 ALTER SESSION SET nls_date_format…所做的修改,只对本次会话(本次登录)有效。如果用户重新登录数据库,则刚才的修改将会失效。
为了避免重复输入,我们可以把常用的SQL语句放在一个文件中。SQL*Plus的SAVE命令用于将SQL缓冲区中的SQL语句保存到文件中。当我们想使用保存到文件中的SQL语句时,可以使用GET命令从文件中取出。SQL缓冲区类似于Windows的剪贴板。
执行一条SQL语句,这条SQL语句将被放在SQL缓冲区。
把SQL缓冲区中的SQL语句保存到文件mysql.txt中。
已创建文件d:\mysql.txt。
为了验证SQL缓冲区中的SQL语句是否正确保存,可以进入操作系统,打开文件mysql.txt,查看其内容。
【小贴士(Tip)】 如果想把SQL语句追加保存到已经存在的文件中,则可以使用SAVE'd:\mysql.txt'ap pend命令;如果想覆盖这个文件,则可以使用SAVE'd:\mysql.txt'replace命令。
为了更改缓冲区中的SQL语句,Oracle提供APPEND、CHANGE、DEL等命令来编辑缓冲区中的SQL语句。但是,这些命令比较多,不便于记忆,很少有人会使用这些命令来编辑SQL缓冲区中的SQL语句。我们还是推荐使用操作系统(OS)提供的编辑器来编辑缓冲区中的SQL语句。当我们在SQL*Plus中输入命令时,SQL*Plus会调用操作系统默认的编辑器来编辑缓冲区中的SQL语句。当编辑完成,保存退出时,SQL*Plus会把编辑好的SQL语句写回SQL缓冲区。这时候我们就可以执行编辑好的SQL语句。SQL*Plus调用哪个编辑器,由站点配置文件(Site Profile)glogin.sql的参数DEFINE_EDITOR来定义。
用LIST命令查看SQL缓冲区中缓存的SQL语句。
执行下面的命令,调用操作系统编辑器,对缓冲区中的SQL语句进行修改。
对脚本进行编辑。
把SELECT*FROM tab替换成SELECT sysdate FROM dual。
编辑完成以后,要记得保存,SQL*Plus会把编辑好的脚本写回SQL缓冲区。
为了验证对SQL语句的修改是否正确,可以执行LIST命令查看SQL缓冲区中的SQL语句。
可以看出,缓冲区的SQL语句已经由SELECT*FROM tab变成了SELECT s ysdate FROM dual。
【小贴士(Tip)】 文件glogin.sql的位置通常位于$ORACLE_HOME/sqlplus/admin/(UNIX)下,其中,ORACLE_HOME指的是Oracle的主目录(Oracle Home),这是在安装时由用户指定的。
有时候,我们需要运行许多任务,我们可以把与这些任务相关的SQL语句放在一个脚本文件中,然后可以利用SQL*Plus提供的命令,批量运行这个SQL脚本文件。这个脚本中可以包含一些格式化命令(如:SPOOL、SET TIMING ON等)。SQL*Plus的命令START或者@命令都可以用来运行一个脚本文件。在一个脚本文件中可以用START命令调用另外一个脚本(如:START sqles,sqles也是一个脚本文件),这样可以实现多个脚本的嵌套调用。
用@运行一个脚本。
以下是脚本ch17_1_1.txt的内容。
第1条语句显示当前的系统日期。
第2条语句删除学生信息表,删除的目的是为了重建。
第3条语句是重建学生信息表(student)。
第4条语句是把学生“小王”的信息插入学生信息表(student)中。
……
用@命令运行这个脚本。
【小贴士(Tip)】 要运行的脚本文件要和SQL*Plus在同一台机器上。运行脚本时,一定要注意脚本文件名的后缀,如果没有指定脚本文件的后缀,则SQL*Plus可能会报告找不到该文件。
在某些情况下,我们需要将查询的结果保存到一个操作系统文件中,然后,我们可以对这个文件进行编辑、打印、合并,以生成我们需要的报表。有时候我们生成的查询结果就是一系列的SQL语句,我们可以将这些结果保存到文件中,在需要时,用SQL*Plus的@命令运行这个脚本文件。SQL*Plus的SPOOL命令可以用来把查询结果保存到操作系统文件中。
指定将查询结果输出到哪个文件中。
在本例中,将查询的结果集保存到文件sptest.txt中。
从这里开始,执行的每一句SQL语句及其结果将被保存到文件sptest.txt中。
执行各种各样的SQL语句(如下所示),结果集都会被保存到文件sptest.txt中。
执行SPOOL off命令,该命令用来终止向文件sptest.txt中写入查询的结果。也就是说,从这里开始,不再向sptest.txt中写入任何东西。
进入操作系统,查看文件d:\script\sptest.txt的内容。这个文件的内容如下:
对文件进行编辑,便可获得我们需要的报表或结果。
进行SQL语句的性能调整时,我们想知道一条SQL语句的执行速度。SQL*Plus的系统变量TIMING可以用来跟踪每条SQL语句的执行时间。当一条SQL语句执行完成,在返回结果集后会显示这个SQL语句的执行时间。
启动定时跟踪。
SQL*Plus的SET命令将TIMING环境变量设成ON,启动对每个SQL语句的跟踪。也就是说,从这里开始,每条执行的SQL语句都会返回执行时间。
执行SQL语句,查看SQL语句耗费的时间。
这条SQL语句耗费1毫秒。
这条SQL语句耗费5毫秒。
当不再需要跟踪SQL语句的执行时间时,关闭跟踪功能。SQL*Plus的SET命令将TIMING环境变量设成OFF,关闭对每个SQL语句的跟踪。也就是说,从这里开始,每条执行的SQL语句都不会返回执行时间。
SQL*Plus有许多环境变量,这些环境变量控制着SQL*Plus的行为,SQL*Plus的SHOW命令用于显示SQL*Plus环境变量的值。关键字ALL用于显示所有SQL*Plus环境变量的值。
■ 显示单个SQL*Plus环境变量的值。
环境变量的值serveroutput=OFF。
■ 显示所有SQL*Plus环境变量的值。
【小贴士(Tip)】 SQL*Plus的环境变量是客户端SQL*Plus的环境变量,它控制SQL*Plus的行为,对数据库服务器没有任何影响。SQL*Plus的环境变量、操作系统的环境变量、Oracle的初始化参数是截然不同的概念。
在SQL*Plus中执行命令,有时需要设置SQL*Plus的系统变量,设置SQL*Plus的系统变量比较简单,只需使用SET命令。
这个例子把环境变量SERVEROUTPUT的值设成了ON。
【小贴士(Tip)】 SET命令设置的值,只对本次会话有效,如果用户重新登录,则SET命令所做的修改将全部丢失。
当启动SQL*Plus的时候,SQL*Plus会自动读取站点配置文件glogin.sql。这个文件存放SQL*Plus的各项设置。如果我们要更改SQL*Plus的启动选项,只需修改这个文件。这里所说的启动选项,其实就是SQL*Plus的环境变量。
直接修改文件glogin.sql。
重新启动SQL*Plus,使上一步对SQL*Plus选项的修改立即生效。
只需使用QUIT或EXIT命令就可以关闭SQL*Plus。如SQL>QUIT或者SQL>Exit。
本例中将禁止用户ddis使用DELETE语句。
要想禁止某个用户执行某个命令,我们只需往数据库用户SYSTEM的表PRODUCT_USER_PROFILE中插入一条记录,PRODUCT_USER_PROFILE表的结构如下:
可以被禁用的SQL*Plus专有命令有:
可以被禁用的SQL语句有:
可以被禁用的PL/SQL命令有:
以用户SYSTEM的身份登录数据库。
往表PRODUCT_USER_PROFILE中插入一条记录。
这条记录将禁止用户ddis使用DELETE命令。
以用户ddis的身份登录数据库。
执行DELETE语句。
从语句的执行结果可以看出,Oracle禁止用户ddis执行DELETE命令的设置已经生效。
当执行很多命令以后,不确定SQL缓冲区存放哪些语句,这时,可以使用SQL*Plus的LIST命令,查看SQL缓冲区中的内容。
在本例中,SQL缓冲区中存在一条创建表的SQL语句。
存在一个脚本文件F:\tem3\createTable.txt,这个脚本文件的内容如下:
下面,我们将把这个脚本文件的内容装载到SQL缓冲区。
使用SQL*Plus的get命令,可以把一个脚本文件的内容装载到SQL缓冲区。
列出当前缓冲区中的内容。
可以看出,当前缓冲区中没有任何内容。
装载脚本。
GET命令把脚本文件createTable.txt装载到SQL缓冲区中。
再次列出当前缓冲区中的内容。
从输出可以看出,脚本文件中的内容已经被成功装载到SQL缓冲区。
预定义变量_EDITOR指示SQL*Plus默认使用哪个操作系统编辑器。如果在SQL*Plus中输入EDIT命令,Oracle会调用默认的编辑器对缓冲区中的SQL语句进行编辑。
使用DEFINE命令查看变量_EDITOR的值。
从上面的输出可以看出,SQL*Plus当前使用的编辑器是Notepad(Windows的写字板)。
预定义变量_EDITOR指示SQL*Plus默认使用哪个操作系统编辑器,可以通过SQL*Plus的DEFINE命令改变这个变量的值,也就是指定默认的编辑器。
上面的命令把SQL*Plus默认使用的编辑器改成vi。
【小贴士(Tip)】 vi是UNIX平台的文本编辑器。
SQL*Plus的STORE SE T命令,可以把当前SQL*Plus环境变量的设置保存到一个操作系统文件中。需要时,也可以还原SQL*Plus以前的环境设置。
把环境变量的设置存放到操作系统文件中。
本例中把环境变量的设置保存到文件v_store中。
查看生成的文件的内容。
文件v_store中的内容如下:
【小贴士(Tip)】 如果我们改变了SQL*Plus的环境变量设置,我们也可以从上面生成的文件中还原SQL*Plus以前的环境设置,如:START v_store。
执行下面的命令,显示当前的系统时间。
这里能够显示年月日,为什么无法显示小时呢?
没有设置好日期格式。日期的显示格式由参数nls_date_format控制。修改参数nls_date_format可以获得需要的日期显示格式。
◆ 方法一 :使用to_char函数。
◆ 方法二 :设置参数nls_date_format。
设置日期格式。
这种设置只对本次会话(登录)有效。
查询当前系统时间。
从输出可以看出,查询不仅得到了当前系统的年、月、日,还得到了小时、分钟、秒。
当执行以下SQL语句的时候,SQL语句的返回结果比较零乱,列名和列的返回值不相匹配,不易阅读,给大家带来了诸多的不便,如下所示。
SQL*Plus不像其他第三方工具,它不能对SQL语句的返回结果自动进行格式化。我们可以使用SQL*Plus的COLUMN命令对报表进行格式化。
从上面的输出可以看出,RECV_TIME列占用了太多的空间,我们可以缩小列RECV_TIME显示的宽度。
对列进行格式化以后,输出结果就比较漂亮。
COLUMN recv_time FORMAT A40是把recv_time列的显示宽度限制为40个字符。
其中,COLUMN是SQL*Plus专有命令,recv_time是要格式化的列,FORMAT也是关键字,表示要对列的输出进行格式化,A40表示列的输出被限制为40个字符,A表示字符。
【小贴士(Tip)】 当SQL语句的返回结果比较混乱时,推荐使用其他工具(如:PL/SQL Developer等)。在SQL*Plus中格式化列的输出是比较麻烦的一件事情,好多工具不需要用户进行手工格式化输出。