ITPub博客

首页 > 数据库 > Oracle > [20221202]sqlplus set trimout 问题.txt

[20221202]sqlplus set trimout 问题.txt

原创 Oracle 作者:lfree 时间:2022-12-02 10:05:03 0 删除 编辑

[20221202]sqlplus set trimout 问题.txt

--//自己对这个不是很了解,做一个测试,上网查询到的设置是:
--//set trimout on;   -- 去除标准输出每行的行尾空格(缺省为off)
--//通过测试说明问题:

1.环境:
SCOTT@book> @ ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

--//我登录设置如下:
SCOTT@book> show trimout
trimout ON

2.建立测试例子:
$ cat -Ev /tmp/aa.txt
      select      $
sysdate from dual ;$
--//注意结尾的空格.

SCOTT@book> @ /tmp/aa.txt
SYSDATE
-------------------
2022-12-02 09:07:06
--//手工执行5次以上,不要退出.

SCOTT@book> @ hash
HASH_VALUE SQL_ID        CHILD_NUMBER KGL_BUCKET PLAN_HASH_VALUE HASH_HEX   SQL_EXEC_START      SQL_EXEC_ID
---------- ------------- ------------ ---------- --------------- ---------- ------------------- -----------
3737888546 bz7x703gcr9t2            0     108322      1388734953  decba722  2022-12-02 09:07:05    16777222

3.分析:
$ rlsql -s -l scott/book <<< "column sql_fulltext format a40 ^Jset trimout on^Jselect sql_fulltext from v\$sqlarea where sql_id='bz7x703gcr9t2';"| cat -Ev
SQL_FULLTEXT$
----------------------------------------$
      select$
sysdate from dual$
$
$
--//^J 在linux下通过ctrl+v ctrl+j输入.
--//注意一个字节select后面的空格没有输出,后来再说明问题.

$ rlsql -s -l scott/book <<< "column sql_fulltext format a40 ^Jset trimout off^Jselect sql_fulltext from v\$sqlarea where sql_id='bz7x703gcr9t2';"| cat -Ev
SQL_FULLTEXT                                    $
----------------------------------------        $
      select                                    $
sysdate from dual                               $
                                                $
$

--//最后的$出现第271列,..太长我移动到放在44列上.为什么出现在271列.我改变窗口大小尝试视乎$也是出现在271列上.

$ rlsql -s -l scott/book <<< "show all;"| grep 27
linesize 270

--//可以肯定出现空格最后的位置与linesize=270设置相关.

$ rlsql -s -l scott/book <<< "set linesize 50 ;column sql_fulltext format a40 ^Jset trimout off^Jselect sql_fulltext from v\$sqlarea where sql_id='bz7x703gcr9t2';"| cat -Ev
SP2-0158: unknown SET option ";column"$
SQL_FULLTEXT                                      $
--------------------------------------------------$
      select                                      $
sysdate from dual                                 $
                                                  $
$

--//出现在51列也可以确定与linesize设置相关.这样问题就可以确定了.
--//set trimout on  去除标准输出每行的行尾空格,但是如果字串结尾有空格呢.

SCOTT@book> 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做了"处理"删除了每行结尾空格.而最后一行分号前的空格保留,也就是仅仅去除分号.

SCOTT@book> host wc /tmp/aa.txt
 2  5 39 /tmp/aa.txt

--//这个也是我最近测试遇到的问题,w3wp.exe 的程序,对结尾的空格不做这样的处理,并且里面chr(13)字符(\r) 也不删除,这样导致我
--//在sqlplus执行的语句的sql_id与文w3wp.exe执行的sql_id不一致.

--//实际上每种工具可能处理的方式不一样,比如toad.
select Sysdate from dual;
select Sysdate from dual ;
select Sysdate from dual  ;
 select Sysdate from dual;
  select Sysdate from dual ;
   select Sysdate from dual  ;

--//这些sql语句执行的sql_id都是一样的;toad下删除分号前的全部空格,而slect前面的空格也全部删除.
SCOTT@book> select executions,sql_id,sql_text c80 from v$sql where sql_id='3nwy6z05jvcaa';
EXECUTIONS SQL_ID        C80
---------- ------------- --------------------------------------------------------------------------------
         6 3nwy6z05jvcaa select Sysdate from dual

--//执行了6次.也就是每种工具在处理语句前都可能做了一些"格式化"的处理工作.
--//早期toad版本(9.6版本)是在结尾的分号前加入一个空格.参考链接:

--//[20120327]toad与sqlplus下执行sql语句的一个细节.txt=>http://blog.itpub.net/267265/viewspace-719592/
--//[20150803]toad 12版本1个小变化.txt =>http://blog.itpub.net/267265/viewspace-1760071/

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-2926325/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969886