星期二 5月 20 第 1
employee report
ENAME SAL
---------- ----------
HIREDATE
-------------------
SCOTT 3000
04/19/1987 00:00:00
(3)btitle
该命令用于指定页脚注,页脚注会自动显示在页的中央。如果页脚注由多个词组成,则用单引号引注。如果要将页脚注分布在多行显示,则用"|"分开不同单词。如果不希望显示页脚注,则使用"btitle off"命令,禁止显示。eg:
SQL> btitle 'page end'
SQL> select ename,sal,hiredate from emp where empno=7788
ENAME SAL
---------- ----------
HIREDATE
-------------------
SCOTT 3000
04/19/1987 00:00:00
page end
(4)break
该命令用于禁止显示重复行,并将显示结果分隔为几个部分,以表现更友好的显示结果,通常应该在order by 的排序列上使用该命令。eg:
SQL> set pagesize 40
SQL> break on deptno skip 1
SQL> select deptno,ename,sal from emp order by deptno
2 ;
DEPTNO ENAME SAL
---------- ---------- ----------
10 CLARK 2450
KING 5000
MILLER 1300
20 JONES 2975
FORD 3000
ADAMS 1100
SMITH 800
SCOTT 3000
30 WARD 1250
TURNER 1500
ALLEN 1600
JAMES 950
BLAKE 2850
MARTIN 1250
6.交互式命令
如果经常要执行某些sql语句和sql*plus命令,可以将这些语句和命令存放到sql脚本中。通过使用sql脚本,一方面可以降低命令输入量,另一方面可以避免用户的输入错误。为了使得sql脚本可以根据不同输入获得不同结果,需要在sql脚本中包含交互式命令。通过使用交互式命令,可以在sql*plus中定义变量,并且在运行sql脚本时可以为这些变量动态输入数据。下面介绍sql*plus的交互命令,以及引用变量所使用的标号。
(1)&
引用替代变量(substitution variable)时,必须要带有该标号。如果替代变量已经定义,则会直接使用其数据,如果替代变量没有定义,则会临时定义替代变量(该替代变量只在当前语句中起作用),并需要为其输入数据。
注:如果替代变量为数字列则提供数据,则可以直接引用;如果替代变量为字符类型列或日期类型列提供数据,则必须要用单引号引注。eg:
SQL> select ename,sal from emp where deptno=&no and job='&job';
输入 no 的值: 20
输入 job 的值: CLERK
原值 1: select ename,sal from emp where deptno=&no and job='&job'
新值 1: select ename,sal from emp where deptno=20 and job='CLERK'
(2)&&
该标号类似于单个&标号。但需要注意,&标号所定义的替代变量只在当前语句中起作用;而&&标号所定义的变量会在当前sql*plus环境中一直生效。eg:
SQL> select ename,sal from emp where deptno=&&no and job='&&job' --定义了no变量
输入 no 的值: 20
输入 job 的值: CLERK
原值 1: select ename,sal from emp where deptno=&&no and job='&&job'
新值 1: select ename,sal from emp where deptno=20 and job='CLERK'
SQL> select ename,sal from emp where deptno=&no;
原值 1: select ename,sal from emp where deptno=&no --直接引用no变量
新值 1: select ename,sal from emp where deptno=20
ENAME SAL
---------- ----------
SMITH 800
JONES 2975
SCOTT 3000
ADAMS 1100
FORD 3000
如例所示,当第一次引用no变量时,使用&&标号需要为其输入数据;当第二次引用no变量时,
使用&标号直接引用其原有值,而不需要输入数据。
(3)define
该命令用于定义类型为char的替代变量,而且该命令的定义的替代变量只在当前sql*plus环境中起作用。当使用该命令定义变量时,如果变量值包含空格或区分大小写,则用引号引注。另外,使用"define变量名"可以检查变量
是否已经定义。eg:
sql>set verify off
sql>define title=CLERK
sql>select ename,sal from where job='&title';
(4)accept
该命令可以用于定义char,number和date类型的替代变量。与define命令相比,accept命令更加灵活。当使用该命令定义替代变量时,还可以指定变量输入提示、变量输入格式、隐藏输入内容。
eg1:指定变量输入提示
SQL> accept title prompt '请输入岗位:'
请输入岗位:CLERK
SQL> select ename,sal from emp where job='&title';
原值 1: select ename,sal from emp where job='&title'
新值 1: select ename,sal from emp where job='CLERK'
ENAME SAL
---------- ----------
SMITH 800
ADAMS 1100
JAMES 950
MILLER 1300
eg2:隐藏用户输入
sql>accept pwd hide
(5)undefine
该命令用于清除替代变量的定义。eg:
sql>undefine pwd
SQL> disc
从 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options 断开
SQL> conn scott/&pwd
输入 pwd 的值: yhai1981
已连接
(6)prompt的pause
prompt命令用于输出提示信息,而pause命令则用于暂停脚本执行。在sql脚本中结合使用这两条命令,可以控制sql脚本的暂停的执行。假定在a.sql脚本中包含以下命令:
prompt '按
pause
当运行该sql脚本时,会暂停执行,eg:
sql>@c:\a.sql
'按
(7)variable
该命令用于在sql*plus中定义绑定变量。当在sql语句或pl/sql块中引用绑定变量时,必须要在绑定变量前加冒号(:);当直接给绑定变量赋值时,需要使用execute命令(类似于调用存储过程).示例如下:
sql>var no number
sql>exec :no:=7788
sql>select ename from emp where empno=:no;
ename
------------------
scott
sql> variable x number;
sql> exec :x := 7788;
sql> SELECT empno,ename from scott.emp where empno=:x;
(8)print
该命令用于输出绑定变量结果,eg:
SQL> print no
NO
----------
7788
7.显示和设置环境变量
使用sql*plus的环境变量可以控制其运行环境,例如设置行显示宽度,设置每页显示的行数、设置自动提交标记、设置自动跟踪等等。
使用show命令可以显示当前sql*plus的环境变量设置
使用set命令可以修改当前sql*plus的环境变量设置。
下面介绍常用的sql*plus环境变量。
(1)show all 显示所有环境变量
为了显示sql*plus的所有环境变量,必须要使用show all命令。示例如下:
SQL> show all
appinfo 为 OFF 并且已设置为 "SQL*Plus"
arraysize 15
...
verify ON
wrap : 将换至下一行
(2)arraysize
该环境变量用于指定数组提取尺寸,其默认值为15.该值越大,网络开销将会越低,但占用内存会增加。假定使用默认值,如果查询返回行数为50行,则需要通过网络传送4将数据;如果设置为25,则网络传送次数只有两次。eg:
SQL> show arraysize
arraysize 15
SQL> set arraysize 25
(3)autocommit
该环境变量用于设置是否自动提交dml语句,其默认值为off(表示禁止自动提交)。当设置为ON时,每次执行DML语句都会自动提交。eg:
SQL> show autocommit
autocommit OFF
SQL> set autocommit on
SQL> show autocommit
autocommit IMMEDIATE
(4)colsep
该环境变量用于设置列之间的分隔符,默认分隔符为空格。如果要使用其它分隔符,则使用set命令进行设置。eg:
sql>set colsep |
SQL> select ename,sal from emp where empno=7788
ENAME | SAL
----------|----------
SCOTT | 3000
(5)feedback
该环境变量用于指定显示反馈行数信息的最低行数,其默认值为6。如果要禁止显示行数反馈信息,则将feedback设置为off。假设只要有查询结果就返回行数,那么可以将该环境变量设置为1.eg:
sql>set feedback 1
sql>select ename,sal from emp where empno=7788;
ENAME | SAL
----------|----------
SCOTT | 3000
已选择 1 行。
(6)heading
该环境变量用于设置是否显示标题,其默认值为on。如果不显示列标题,则设置为off。eg:
sql>set heading off
sql>select ename,sal from emp where empno=7788
SCOTT | 3000
(7)linesize
该环境变量用于设置行宽度,默认值为80。在默认情况下,如果数据长度超过80个字符,那么在sql*plus中会折行显示数据结果。要在一行中显示全部数据,应该设置更大的值。eg:
(8)pagesize
该环境变量用于设置每页所显示的行数,默认值为14
set pagesize 0; //输出每页行数,缺省为24,为了避免分页,可设定为0。
(9)long
该环境变量用于设置long和lob类型列的显示长度。默认值为80,也就是说当查询long或lob列时,只会显示该列的前80个字符,应该设置更大的值。eg:
sql>show long
long 80
sql>set long 300
(10)serveroutput
该环境变量用于控制服务器输出,其默认值为off,表示禁止服务器输出。在默认情况下,当调用dbms_output包时,不会在sql*plus屏幕上显示输出结果。在调用dbms_output包时,为了在屏幕上输出结果,必须要将serveroutput设置为on。eg:
sql>set serveroutput on
sql>exec dbms_output.put_line('hello')
(11)termout
该环境变量用于控制sql脚本的输出,其默认值为ON。当使用默认值时,如果sql脚本有输出结果,则会在屏幕上输出显示结果,如果设置为OFF,则不会在屏幕上输出sql脚本。eg:
SQL> set termout off
SQL> @c:\a
(12)time
该环境变量用于设置在sql提示符前是否显示系统时间,默认值为off,表示禁止显示系统时间。如果设置为on,则在sql提示符前会显示系统时间.eg:
SQL> set time on
12:09:59 SQL>
(13)timing
该环境变量用于设置是否要显示sql语句执行时间,默认值为off,表示不会显示sql语句执行时间。如果设置为ON,则会显示sql语句执行时间。eg:
sql>set timing on
SQL> select count(*) from emp;
COUNT(*)
----------
14
已选择 1 行。
已用时间: 00: 00: 00.03
(14)trimspool
set trimout on; //去除标准输出每行的拖尾空格,缺省为off
set trimspool on; //去除重定向(spool)输出每行的拖尾空格,缺省为off
如果trimspool设置为on,将移除spool文件中的尾部空格 ,trimout同trimspool功能相似,只不过对象是控制台。
If trimspool is set to on, it will remove trailing blanks in spooled files.See also trimout which does the same thing to the output to the console (terminal).
eg:
set trimspool off
spool c:\temp\trimspool.txt
declare
v_name varchar2(30);
begin
SELECT table_name into v_name
FROM all_tables
WHERE rownum =1;
dbms_output.put_line(v_name);
end;
/
set trimspool on
declare
v_name varchar2(30);
begin
SELECT table_name into v_name
FROM all_tables
WHERE rownum =1;
dbms_output.put_line(v_name);
end;
/
spool off