目录
8,SET SQLBL[ANKLINES] {ON | OFF}
9,SET SQLC[ASE] {MIX[ED] | LO[WER] | UP[PER]}
11,SET SQLP[ROMPT] {SQL> | text}
16,SET FEED[BACK] {6 | n | ON | OFF | ONLY}
18,SET DEF[INE] {& | c | ON | OFF}
19,SET AUTOT[RACE] {ON | OFF | TRACE[ONLY]} [EXP[LAIN]][STAT[ISTICS]]
20,SET HIST[ORY] {ON | OFF | n}
set命令的作用是设置一个系统变量来更改当前会话的SQL*Plus环境设置。例如:
- 自定义HTML格式
- 启用或禁用列标题的打印
- 设置每页的行数
- 设置数据的显示宽度
SQL*Plus通过修改系统变量(也称为SET命令变量),来实现对SQL*Plus会话设置特定的环境。SET命令可以修改这些系统变量,SHOW命令可以查看这些变量。这些变量都有一个初始默认值。
如下set命令中,红色加粗字样为默认值:
1,SET ECHO {ON | OFF}
当使用START、@或者@@执行脚本时,控制是否在屏幕中显示脚本中的命令。ON为显示,OFF为不显示。ECHO命令不影响交互式命令的显示,也不影响从操作系统重定向到SQL*PLUS的命令的显示。如下示例中,set echo on后,就显示出了脚本中的命令:
SQL> show echo
echo OFF
SQL> @set_test.sql
COUNT( * )
----------
9178
SQL> set echo on
SQL> @set_test.sql
select count( * ) from dba_tables;
COUNT(*)
----------
9178
2,SET HEA[DING] {ON | OFF}
控制报表中列标题的打印。ON表示在报表中打印列标题,OFF表示在报表中不打印列标题。SET HEADING OFF命令不影响显示的列宽,它只会取消列标题本身的打印。如下示例中,set heading off后,列标题就不显示了:
SQL> show heading
heading ON
SQL> @set_test.sql
COUNT(*)
----------
9178
SQL> set heading off
SQL> @set_test.sql
9178
3, SET LIN[ESIZE] {80 | n}
设置SQL*Plus在一行能显示的字符总数。默认一行显示80个字符。它还控制居中对齐和右对齐的文本在TTITLE、BITTLE、REPHEADER和REPFOOTER中的位置。更改LineSize设置会影响DESCRIBE命令输出中的文本换行。DESCRIBE输出列通常按行大小的比例分配。减小或增大行大小可能会在显示中产生意外的文字环绕。可以将LineSize定义为从1到系统允许的最大值。如下示例中,set linesize 20后,每行只显示20个字符,之前一行就显示的信息现在要多行显示:
SQL> create table ma(id number);
SQL> show linesize;
linesize 80
SQL> select dbms_metadata.get_ddl('TABLE','MA','SYS') from dual;
DBMS_METADATA.GET_DDL('TABLE','MA','SYS')
--------------------------------------------------------------------------------
CREATE TABLE "SYS"."MA"
( "ID" NUMBER
) PCTFREE 10 PCTUSED 40 INITRANS
SQL> set linesize 20;
SQL> select dbms_metadata.get_ddl('TABLE','MA','SYS') from dual;
DBMS_METADATA.GET_DD
--------------------
CREATE TABLE "SYS"
."MA"
( "ID" NUMBER
) PCTFREE 10 PCTU
SED 40 INITRANS
4,SET LONG {80 | n}
设置显示BLOB、BFILE、CLOB、LONG、NCLOB和XMLType值的最大宽度(以字节为单位),也代表能从大对象中复制出来的最大字符数。在不考虑 SET LONGCHUNKSIZE设置的情况下,查询LONG类型的字段时,需要足够的本地内存来存储SET LONG设定的数据量,这个限制不适用于LOB系列的数据类型。创建表时建议不要使用LONG数据类型的列,尽量使用LOB类型,因为LOB类型限制更少,并且LOB类型还在改进中。n的默认值是80,最大值为 2000000000字节。如下示例中,在set long 20后,截取的建表语句就不完整了,只有20个字符(其中有几个是字符串前导空格):
SQL> create table ma ( id number);
SQL> show long;
long 80
SQL> select dbms_metadata.get_ddl('TABLE','MA','SYS') from dual;
DBMS_METADATA.GET_DDL('TABLE','MA','SYS')
-----------------------------------------------------------
CREATE TABLE "SYS"."MA"
( "ID" NUMBER
) PCTFREE 10 PCTUSED 40 INITRANS
SQL> set long 20
SQL> select dbms_metadata.get_ddl('TABLE','MA','SYS') from dual;
DBMS_METADATA.GET_DD
--------------------
CREATE TABLE
"SYS
5, SET NULL text
select语句的结果集中的NULL值显示为其它设定的文本信息。默认值为空("")。如下示例中,在set null **后,结果集中为空的字段显示为** :
SQL> show NULL
null ""
SQL> select * from mb;
ID NAME
---------- --------------------
1 a
1
SQL> set null **
SQL> select * from mb;
ID NAME
---------- --------------------
1 a
1 **
6,SET PAGES[IZE] {14 | n}
设置输出的每一页上的行数。可以将pageSize设置为零以禁止显示所有标题(heading)、名称(title)、分页符(page breaks)、初始空行(initial blank line)和其他格式信息。默认值为14。如下示例中,在set pagesize 0 后可以看到没有了标题和初始空行:
SQL> show pagesize
pagesize 14
SQL> select count( * ) from dba_tables;
COUNT( * )
----------
9180
SQL> set pagesize 0
SQL> select count( * ) from dba_tables;
9180
7,SET SERVEROUT[PUT] {ON | OFF} [SIZE {n |UNL[IMITED]}] [FOR[MAT] {WRA[PPED] | WOR[D_WRAPPED] |TRU[NCATED]}]
控制是否显示存储过程或者SQL*plus中的pl/sql块的输出(即dbms-output.put_line)。DBMS_OUTPUT输出行长度限制为32767字节。OFF代表禁止dbms_output.put_line的输出,ON为显示输出。在 SET SERVEROUTPUT ON时可以同时设置SIZE和FORMAT参数。SIZE为数据库能为输出信息缓存的字节数,默认值为UNLIMITED ,设置其它n值时要满足2000<= n <=1000000。由于没有性能损耗,一般使用默认值unlimited,但如果想保留物理内存,可以设置具体n值,但SERVEROUTPUT不会提前分配资源。WRAPPED表示当一行数据行长超过set linesize的大小时,自动换行到下一行,当设置为TRUNCATED参数时,则表示对超出行长的部分截断。WORD_WRAPPED表示在超过行长要换行时,以保留完整单词的原则换行,换行时路过前导空格并左对齐。如下示例中,主要演示了FORMAT的几种换行情况:
SQL> show serveroutput
serveroutput OFF
SQL> show linesize
linesize 80
SQL> exec DBMS_OUTPUT.PUT_LINE('Task is complete, please check.'); //OFF状态下没有输出信息
PL/SQL procedure successfully completed.
SQL> set serveroutput on
SQL> begin //ON状态下正常输出两行信息
DBMS_OUTPUT.PUT_LINE('Task is complete, please check.');
DBMS_OUTPUT.PUT_LINE('No tools can be used now.');
end;
/
Task is complete, please check.
No tools can be used now.
PL/SQL procedure successfully completed.
SQL> set linesize 15
SQL> begin //将行长设为15后,自动换行,说明format默认值为WORD_WRAPPED,以保留完整单词为原则换行
DBMS_OUTPUT.PUT_LINE('Task is complete, please check.');
DBMS_OUTPUT.PUT_LINE('No tools can be used now.');
end;
/
Task is
complete,
please check.
No tools can be
used now.
PL/SQL procedure successfully completed.
SQL> set serveroutput on format TRUNCATED
SQL> begin //设为TRUNCATED后,输出信息按Linesize截断
DBMS_OUTPUT.PUT_LINE('Task is complete, please check.');
DBMS_OUTPUT.PUT_LINE('No tools can be used now.');
end;
/
Task is complet
No tools can be
PL/SQL procedure successfully completed.
SQL> set serveroutput on format wrapped
SQL> begin //设为wrapped后,输出信息按Linesize换行
DBMS_OUTPUT.PUT_LINE('Task is complete, please check.');
DBMS_OUTPUT.PUT_LINE('No tools can be used now.');
end;
/
Task is complet
e, please check
.
No tools can be
used now.
PL/SQL procedure successfully completed.
8,SET SQLBL[ANKLINES] {ON | OFF}
控制SQL*Plus是否在一条SQL命令或脚本中放入空行。ON将空行和新行解释为这条SQL命令或脚本的一部分。默认值OFF不允许在一条SQL命令或脚本中的空行或新行。如下示例中,在set sqlblanklines on后,就可以在一条SQL命令中使用多个空行:
SQL> show SQLBLANKLINES
sqlblanklines OFF
SQL>
SQL> select //在OFF状态下输入select后再输入两个换行,命令就会自动结束
2
SQL>
SQL> set SQLBLANKLINES on
SQL>
SQL> select //在ON状态下可以使用多个空行
2
3
4 count( * )
5
6
7 from
8
9 dba_tables;
COUNT( * )
----------
9180
9,SET SQLC[ASE] {MIX[ED] | LO[WER] | UP[PER]}
在执行之前转换SQL命令和PL/SQL块的大小写。UPPER表示SQL*Plus将命令中的所有文本(包括引号和标识符)转换为大写,LOWER表示转换为小写,MIXED表示不做更改。SQLCASE不会更改SQL buffer本身。如下示例中,在set sqlcase upper 后,命令中的字符串'aaa'被转换为了大写,从输出结果可知:
SQL> show sqlcase
sqlcase MIXED
SQL> select 'aaa' as x from dual;
X
---
aaa
SQL> set sqlcase upper;
SQL>
SQL> select 'aaa' as x from dual; //SQL命令被转换为大写了,所以字符串'aaa'也变成了大写
X
---
AAA
10,SET SQLN[UMBER] {ON | OFF}
设置SQL命令或PL/SQL块的第二行和后续行的提示符。当一条SQL命令写成多行时,ON表示从第二行开始,行首提示符为数字,OFF表示行首提示符为不变,仍为SQLPROMPT参数设置的提示符。
SQL> show sqlnumber
sqlnumber ON
SQL> select //设为ON时,从第二行开始,行首提示符为数字
2 count( * )
3 from
4 dba_tables;
COUNT( * )
----------
9180
SQL> set sqlnumber off
SQL> select //设为OFF时,提示符不变,仍为SQLPROMPT参数设的值
SQL> count( * )
SQL> from
SQL> dba_tables;
COUNT( * )
----------
9180
11,SET SQLP[ROMPT] {SQL> | text}
设置SQL*Plus命令提示符。在设置提示符时,如果前缀使用了'&',则表示使用的是动态变量,需要再次手动给这个变量赋值。如果希望这个命令提示符长期生效,可以将这个set 命令写在$ORACLE_HOME/sqlplus/admin/glogin.sql文件中,这样每次连接的时候就会自动加载参数设置。
SQL> show sqlprompt
sqlprompt "SQL> "
SQL>
SQL> set sqlprompt "TTT> "
TTT>
TTT> set sqlprompt "&AAA> "
Enter value for aaa: SSS>
SSS>>
12,SET TERM[OUT] {ON | OFF}
当脚本中执行@, @@ or START这些命令时,控制是否显示屏幕输出。 ON表示显示屏幕信息,OFF表示不显示。当设为OFF时,不影响交互式输入信息的显示和从系统重定向到SQL*Plus的信息显示。如下示例中,set termout off 后,@命令执行脚本时,执行结果不显示在屏幕上:
SQL> show termout
termout ON
SQL>
SQL> @set_test.sql //设为ON时,屏幕显示输出
COUNT(*)
----------
9180
SQL> set termout off
SQL> @set_test.sql //设为ON时,屏幕不显示输出
SQL>
13,SET TI[ME] {ON | OFF}
控制当前时间的显示。显示每个命令提示符之前的当前时间。OFF禁止时间显示。如下示例中,set time on 后,命令提示符前显示了当前时间:
SQL> show time
time OFF
SQL>
SQL> set time on
09:53:05 SQL>
09:53:10 SQL>
14,SET TIMI[NG] {ON | OFF}
控制SQL命令运行的计时统计信息。ON显示每个SQL命令或PL/SQL块运行的计时统计信息。OFF为禁止统计。如下示例中,在set timing on 后,SQL命令后面显示了执行时间:
SQL> show timing
timing OFF
SQL>
SQL> select count(1) from dba_tables;
COUNT(1)
----------
9180
SQL> set timing on
SQL> select count(1) from dba_tables;
COUNT(1)
----------
9180
Elapsed: 00:00:00.10
SQL>
15, SET WRA[P] {ON | OFF}
当数据的行长超过了可显示的行长时,控制是否对数据进行截断。ON表示超过可显示行长的数据自动换行到下一行,OFF表示截断超过显示行长部分的数据。(参数set serveroutput )
16,SET FEED[BACK] {6 | n | ON | OFF | ONLY}
控制SQL命令结果的反馈提示。n表示查询结果集最少返回n条数据时才有反馈提示。如在默认值为6时,select语句查询结果集反回6条结果,则会有反馈提示'6 rows selected.',如果结果集只有5条数据,则没有反馈提示。ON和OFF表示是否开启反馈提示,反馈提示也包括'Table created' and 'PL/SQL procedure successfully completed' 这类的反馈提示。当将n设为0时,相当于设为了OFF。当n大于0时,相当于设为ON。ONLY则表示只显示反馈信息而不显示数据信息。
SQL> show feedback
FEEDBACK ON for 6 or more rows
SQL> select id from system.t22 fetch first 6 rows only; //反回6行数据时有反馈信息'6 rows selected.'
ID
----------
1
7
2
3
4
6
6 rows selected.
SQL> select id from system.t22 fetch first 5 rows only; //反回5行数据时没有反馈信息
ID
----------
1
7
2
3
4
SQL>
SQL> set serveroutput on
SQL> show feedback
FEEDBACK ON for 6 or more rows
SQL> exec DBMS_OUTPUT.PUT_LINE('Task is complete, please check.');
Task is complete, please check.
PL/SQL procedure successfully completed. //ON状态的反馈信息
SQL> create table s1(id number);
Table created. //ON状态的反馈信息
SQL> set feedback off
SQL> exec DBMS_OUTPUT.PUT_LINE('Task is complete, please check.'); //OFF状态没有反馈信息
Task is complete, please check.
SQL> create table s2(id number); //OFF状态没有反馈信息
SQL>
ONLY参数只有12.2版本以上才有,本人测试的12.1版本没有ONLY参数,官方文档给的测试结果如下 :
SQL> SET FEEDBACK ONLY
SQL> SHOW FEEDBACK
feedback ONLY
SQL> SELECT * FROM EMP;
14 rows selected.
17,SET COLSEP {' '| text}
控制列的分割符,默认值为一个空格。如果COLSEP变量包含空格或标点符号,则必须用单引号括起来。
SQL> show COLSEP;
colsep " "
SQL> select id ,name from system.t22 fetch first 4 rows only;
ID NAME
---------- ----------
1 a100000
7 a7
2 a2
3 a3
SQL> set COLSEP "|"
SQL> select id ,name from system.t22 fetch first 4 rows only;
ID|NAME
----------|----------
1|a100000
7|a7
2|a2
3|a3
18,SET DEF[INE] {& | c | ON | OFF}
将替换变量前缀的字符设置为C(任意特定字符,只能是一个字符),默认值为'&'。也就是在执行脚本时,如果遇到以‘&'符号为前缀的词,数据库会把这个词解析为替换变量,并会提示需要手动输入值。 当设为特定C时,也就是设为了ON,此时可以理解为系统将C字符全部替换成了'&’字符以便系统解析为替换变量。(常遇到的需要设为OFF的情况是,在脚本中的COMMENT语句会用到'&'符做连接说明,这时被解析为替换变量就会出错。)
SQL> show define
define "&" (hex 26)
SQL> select * from system.t22 where id=&a; //默认替换变量符为&
Enter value for a: 1
old 1: select * from system.t22 where id=&a
new 1: select * from system.t22 where id=1
ID NAME INDATE
---------- ---------- ------------------
1 a100000 21-MAR-19
SQL> set define %
SQL> select * from system.t22 where id=%a; //设置替换变量符为%
Enter value for a: 1
old 1: select * from system.t22 where id=%a
new 1: select * from system.t22 where id=1
ID NAME INDATE
---------- ---------- ------------------
1 a100000 21-MAR-19
SQL> set define aa //替换变量符只能是一个字符
string "aa" is too long. maximum size is 1 character.
19,SET AUTOT[RACE] {ON | OFF | TRACE[ONLY]} [EXP[LAIN]][STAT[ISTICS]]
显示DML语句的执行报告。详细参考set autotrace
20,SET HIST[ORY] {ON | OFF | n}
控制历史列表中保存的历史SQL命令条数(一个有多行的PL/SQL块,只算作一条SQL命令),开启时的默认值为100条。设置为开启时,执行history命令可以查看保存的历史SQL命令信息。12.2版本才开始有history命令。
SQL> show history
history is OFF
SQL> set history on
SQL> show history
history is ON and set to "100"
SQL> select max(id) id from tt;
id
----
23
SQL> select 1 from dual;
1
---
1
SQL> history
1 show history
2 select max(id) id from tt;
3 select 1 from dual;