2.4 脚本文件及其文件操作命令
尽管使用SQL*Plus提供的命令行编辑器可以显示、编辑、修改SQL缓冲区中的内容,如使用L[IST]可以列出SQL缓冲区中的内容,使用A[PPEND]可以在SQL缓冲区的当前行(用“*”标记的行)的结尾处添加新的内容等。但SQL*Plus提供的编辑能力非常有限,而且很难操作,例如,不能使用方向键来定位输入位置,不能使用Del键来删除输入的内容等。尤其遗憾的是,当退出SQL*Plus之后,就会立刻丢失在其中输入的所有命令。所以,假如只能用交互的方式来使用SQL*Plus,则无论是编辑还是重新输入都是不方便的。
不同的操作系统中有不同的编辑器,不同的人有使用不同编辑器的习惯。Oracle也意识到了这一点,因此决定由用户自己选择合适的编辑器。使用自己满意的编辑器,创建一个脚本文件,并将所有语句或命令全都输入其中,然后在SQL*Plus中使用START命令来运行该脚本文件。
使用脚本文件有如下优点:
◆ 有效地利用编辑器强大和方便的编辑功能,提高输入、编辑命令的效率,避免输入错误。
◆ 将调试通过的命令保存起来以便再次使用,降低命令的输入量。
◆ 实现脚本文件及其中命令的批处理运行。
部分常用的脚本文件操作命令如表2-2所示,其中可选的部分都用方括号括起来,如SAVE命令与SAV命令相同。
表2-2 部分常用的脚本文件操作命令
2.4.1 文件操作命令举例
下面看一个使用文件操作命令的例子。首先在SQL*Plus中输入一条SQL语句(如果超过一行,则每行后面都按Enter键,SQL*Plus会自动增加行号并在屏幕上显示出来),最后在语句结束的“;”后面按Enter键。无论该语句正确与否,SQL缓冲区中就有内容了,就可以使用文件操作命令了。
使用SAV[E]命令,将SQL缓冲区中的内容保存到d:\mysql\ch03\script.sql文件中,如图2-25所示。
图2-25 将SQL缓冲区中的内容保存到文件中
使用ED[IT]命令,在操作系统中打开默认的编辑器Notepad,编辑d:\mysql\ch03\script.sql文件,如图2-26所示,也可以直接在操作系统中用Notepad编辑该文件。
图2-26 在编辑器Notepad中编辑文件
注意
与START命令、@命令不同,由于后面是用GET命令将该文件读入SQL缓冲区后再执行,所以该文件中不能有SQL*Plus的命令,只能有SQL语句、PL/SQL块,且SQL语句结尾不需要“; ”,最后一行只能有一个“/”,否则不能正确运行。
在Notepad中,选择“文件”→“保存”命令,保存所做的修改,然后选择“文件”→“退出”命令,退出Notepad返回SQL*Plus。
使用GET命令,将d:\mysql\ch03\script.sql文件读入SQL缓冲区,然后使用“/”来运行SQL缓冲区中的语句,如图2-27所示。
图2-27 将文件读入SQL缓冲区并运行
使用SPO[OL] d:\mysql\ch03\result.lst命令,开始将SQL*Plus中的各种操作及运行结果(无论什么样的错误消息或假脱机时计算机屏幕上出现什么内容)“假脱机”,即复制到d:\mysql\ch03\result.lst文件中,并用SPO[OL]命令显示当前的假脱机状态,如图2-28所示。
图2-28 指定“假脱机”文件并显示当前的假脱机状态
然后使用STA[RT]命令再运行d:\mysql\ch03\script.sql文件,最后使用SPO[OL] OFF命令结束将SQL*Plus中的各种操作及执行结果复制到d:\mysql\ch03\result.lst文件中,如图2-29所示。只有结束SPOOL输出,才能在输出文件中看到复制的内容。
图2-29 使用STA[RT]命令运行文件
在操作系统中,打开d:\mysql\ch03\result.lst文件,查看其中内容,了解SPOOL命令的作用,如图2-30所示。
图2-30 查看“假脱机”文件中的内容
2.4.2 两种运行脚本文件的命令举例
有两种运行脚本文件的方式,即START命令和@命令。
一、START命令
START命令的语法是:
START filename[.ext] [arg1 arg2 arg3…]
其中:
◆ filename[.ext]表示要运行的脚本文件。如果省略扩展名,SQL*Plus就使用默认的脚本文件扩展名,通常为“.sql”。
◆ SQL*Plus先在当前文件夹下查找filename[.ext],如果没有,就在SQLPATH环境变量定义的文件夹中查找。可以指定脚本文件的完整路径名,如d:\mysql\ch03\script.sql,也可以是http://host.domain/script.sql。
◆ arg1,arg2,arg3等表示希望传递给脚本文件的参数。脚本文件中的替换参数必须使用如下格式声明:&1,&2,&3等。如果输入一个或多个参数,SQL*Plus将使用这些值替换脚本文件中的替换参数,arg1代替所有的&1,arg2代替所有的&2,arg3代替所有的&3,以此类推。如果在START命令中没有提供替换值,则在运行时需要交互式输入。
注意
这里的1,2,3是有意义的位置标记,不能改成其他内容,否则就不会自动替代而会提示输入。
【例】脚本文件d:\mysql\ch03\script01.sql的内容如下:
SELECT ename, sal FROM emp WHERE deptno = &1 AND sal > &2;
使用START命令运行的方式和结果如图2-31所示。
图2-31 带参数使用START命令
可以在一个脚本文件中放入多个SQL语句,以便作为一个单位同时运行。用这种方法在初始化数据库中的表,如清空某些表或向某些表中插入一批初始数据时是非常方便的。
【例】脚本文件d:\mysql\ch03\script02.sql的内容如下:
INSERT INTO emp(empno, ename, deptno) VALUES(8273, 'luchuan', 10); SELECT empno, ename, deptno FROM emp WHERE deptno = 10; DELETE FROM emp WHERE empno = 8273;
使用START命令运行的方式和结果如图2-32所示。
图2-32 一个脚本文件中有多个SQL语句的运行情况
二、@命令
@命令的功能与START命令类似,区别在于:@命令既可以在SQL*Plus会话中运行,也可以在操作系统命令提示符中运行,而START命令只能在SQL*Plus会话中运行。
【例】在操作系统命令提示符中运行@命令。
在命令提示符中输入如下命令:
SQLPLUS scott/tiger @d:\mysql\ch03\script01.sql 20 2500
则输出结果如图2-33所示。
图2-33 在命令提示符中使用@命令运行脚本文件
【例】在脚本文件中使用、运行脚本文件。
→命令用在脚本文件中而不是命令行。它用来说明用→运行的脚本文件与其所在的文件在同一文件夹中,而不用指定要执行脚本文件的全路径,也不用从SQLPATH环境变量指定的路径中寻找脚本文件。
例如,在d:\mysql\ch03文件夹中有3个脚本文件script03.sql,script02.sql和script01.sql,其中script03.sql中的内容为:
→script02.sql START d:\mysql\ch03\script01.sql 202500
这里的“→script02.sql”就相当于
@d:\mysql\ch03\script02.sql或START d:\mysql\ch03\script02.sql
运行script03.sql的结果如图2-34所示。
图2-34 在脚本文件中使用→命令
从这个例子也可以看出,如何将多个脚本文件合并到一个脚本文件中运行。这是脚本文件的模块化设计的例子。