前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >小案例:使用To_char的时候,某些SQL语句在SQLPLUS的表示格式发生变化

小案例:使用To_char的时候,某些SQL语句在SQLPLUS的表示格式发生变化

作者头像
SQLplusDB
发布2022-08-19 21:45:41
2330
发布2022-08-19 21:45:41
举报

有的时候,我们可能突然遇到在sqlplus上,以前执行很正常的sql语句,突然表示的格式发生了变化。并且发现这个sql语句中使用了To_char函数。

例如如下的这个表空间使用率的sql。

代码语言:javascript
复制
SQL> set lines 120
set pages 100
set term off
tti off
clear col
col TABLESPACE_NAME     format a15
col "SIZE(MB)"          format a20
col "USED(MB)"          format a20
col "FREE(MB)"          format a20
col "USED(%)"           format 990.99
select
  tablespace_name,
  to_char(nvl(total_bytes / 1024,0),'999,999,999') as "size(MB)",
  to_char(nvl((total_bytes - free_total_bytes) / 1024 / 1024,0),'999,999,999') as "used(MB)",
  to_char(nvl(free_total_bytes / 1024 / 1024,0),'999,999,999') as "free(MB)",
  round(nvl((total_bytes - free_total_bytes) / total_bytes * 100,100),2) as "rate(%)"
from
  ( select
      tablespace_name,
      sum(bytes) total_bytes
    from
      dba_data_files
    group by
      tablespace_name
  ),
  ( select
      tablespace_name free_tablespace_name,
      sum(bytes) free_total_bytes
    from
      dba_free_space
    group by tablespace_name
  )
where
  tablespace_name = free_tablespace_name(+)
/

正常的时候是如下格式表示。

代码语言:javascript
复制
TABLESPACE_NAME size(MB)             used(MB)             free(MB)                rate(%)
--------------- -------------------- -------------------- -------------------- ----------
SYSAUX             7,809,024                7,084                  543              92.89
UNDOTBS1           1,536,000                   44                1,456               2.96
USERS              3,000,320                   11                2,919                .39
SYSTEM             1,034,240                1,008                    2              99.76
SCOTT_TBS             44,928                   32                   12              72.22

但是某一天突然变成了如下串行的格式。并且sql语句没有变过。也没有打什么补丁。

代码语言:javascript
复制
TABLESPACE_NAME 
---------------------------------------------------------------
size(MB)         
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
-----------------------
used(MB)          
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
-----------------------
free(MB)  
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
-----------------------
rate(%)
---------------------------------------------------------------
SYSAUX             
7,809,024                
7,084                  
543              
92.89


UNDOTBS1           
1,536,000                  
44               
 1,456              
 2.96
 
USERS              
3,000,320                   
11                
2,919                
.39


SYSTEM             
1,034,240                
1,008                    
2              
99.76


SCOTT_TBS             
44,928                   
32                   
12              
72.22

如果遇到这种情况,你需要看一下Cursor_sharing 的参数是否发生了改变。

这个参数会影响共享cursor的方式。默认值是EXACT。如果改成了SIMILAR或者FORCE就可能发生这个现象。

按照oracle的文档313135.1说明,Cursor_sharing参数的值会影响to_char处理对象列的表示格式。但是由于会影响共享cursor的动作,所有最终没有被修正。

将Cursor_sharing改回默认值。或者将to_char(nvl(total_bytes / 1024,0),'999,999,999') 中的 999,999,999去掉会解决该问题。

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-06-09,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 SQL和数据库技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com