[20221203]sqlplus set trimspool 问题.txt
--//自己对这个不是很了解,做一个测试,上网查询到的设置是:
--//set trimspool on; -- 去除spool输出结果中每行的结尾空格(缺省为off)
--//通过测试说明问题:
1.环境:
SCOTT@test01p> @ ver1
PORT_STRING VERSION BANNER CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0 12.2.0.1.0 Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 0
--//我登录设置如下:
SCOTT@test01p> show trimspool
trimspool ON
SCOTT@test01p> show trimout
trimout ON
2.建立测试例子:
$ cat -Ev aa.txt
select $
sysdate from dual ;$
--//注意结尾的空格.
SCOTT@test01p> @ aa.txt
SYSDATE
-------------------
2022-12-02 20:58:50
--//手工执行5次以上,不要退出.
3.分析:
--//看上面的提示仅仅对spool的输出有效.
$ sqlplus -s -l scott/btbtms@test01p <<< "column sql_fulltext format a40 ^Jset trimspool on^Jspool x1.txt^Jselect sql_fulltext from v\$sqlarea where sql_id='bz7x703gcr9t2';^Jspool off;"
SQL_FULLTEXT
----------------------------------------
select
sysdate from dual
--//^J 在linux下通过ctrl+v ctrl+j输入.我虽然使用windows但是在cygwin下使用.
$ cat -Ev x1.txt
^M$
SQL_FULLTEXT^M$
----------------------------------------^M$
select^M$
sysdate from dual^M$
^M$
^M$
--//set trimspool on; -- 去除spool输出结果中每行的结尾空格(缺省为off)
--//实际上其作用与set trimout on类似,只不过针对spool,注意看cat的输出.selecct后面的空格没有,分号之前的空格也没有.
--//windows下sqlplus文本处理结尾\r\n.多了一个字符^M.
$ sqlplus -s -l scott/btbtms@test01p <<< "set linesize 50;^Jcolumn sql_fulltext format a40 ^Jset trimspool off^Jspool x1.txt^Jselect sql_fulltext from v\$sqlarea where sql_id='bz7x703gcr9t2';^Jspool off;"
SQL_FULLTEXT
----------------------------------------
select
sysdate from dual
Administrator@zws ~
$ cat -Ev x1.txt
^M$
SQL_FULLTEXT ^M$
---------------------------------------- ^M$
select ^M$
sysdate from dual ^M$
^M$
^M$
--//结尾$位于52列的位置,因为^M占用51列的位置.
SCOTT@test01p> select dump(to_char(sql_fulltext),16) c50 , sql_fulltext c40 ,length(sql_fulltext) n10 from v$sqlarea where sql_id='bz7x703gcr9t2';
C50 C40 N10
-------------------------------------------------- ---------------------------------------- ---------------------
Typ=1 Len=31: 20,20,20,20,20,20,73,65,6c,65,63,74, select 31
a,73,79,73,64,61,74,65,20,66,72,6f,6d,20,64,75,61, sysdate from dual
6c,20
--//你可以发现sqlplus在执行语句时,sqlplus做了"处理"删除了每行结尾空格.而最后一行分号前的空格保留,也就是仅仅去除分号.
--//实际上trimout与trimspool类似,一个针对输出,另外一个针对spool输出.
--//建议两者格式设置都是on.
4.顺便测试tab:
SCOTT@test01p> show tab
tab OFF
$ cat -Ev aa.txt
select $
sysdate from dual ;$
--//我修改aa.txt文本,select前9个空格.
SCOTT@test01p> @ aa.txt
SYSDATE
-------------------
2022-12-02 21:13:47
SCOTT@test01p> @ tpt/hash
HASH_VALUE SQL_ID CHILD_NUMBER KGL_BUCKET PLAN_HASH_VALUE HASH_HEX SQL_EXEC_START SQL_EXEC_ID
---------- ------------- ------------ ---------- --------------- ---------- ------------------- -----------
3306312071 9fd1vgv2j4nc7 0 20871 1388734953 c5125187 2022-12-02 21:13:47 16777220
$ sqlplus -s -l scott/btbtms@test01p <<< "set linesize 50;^Jcolumn sql_fulltext format a40 ^Jset tab on^Jselect sql_fulltext from v\$sqlarea where sql_id='9fd1vgv2j4nc7';" | cat -Ev -t
^M$
SQL_FULLTEXT^M$
----------------------------------------^M$
^I select^M$
sysdate from dual^M$
^M$
^M$
--//注意select前的^I输出,表示tab,这样在一些文本编辑工具上由于tabstop设置不同,出现不对齐的情况.
$ sqlplus -s -l scott/btbtms@test01p <<< "set linesize 50;^Jcolumn sql_fulltext format a40 ^Jset tab off^Jselect sql_fulltext from v\$sqlarea where sql_id='9fd1vgv2j4nc7';" | cat -Ev -t
^M$
SQL_FULLTEXT^M$
----------------------------------------^M$
select^M$
sysdate from dual^M$
^M$
^M$
4.总结:
--//从以上测试,可以看出设置如下比较合理:
set trimspool ON
set trimout ON
set tab off
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-2927019/ ,如需转载,请注明出处,否则将追究法律责任。