有的时候,我们可能突然遇到在sqlplus上,以前执行很正常的sql语句,突然表示的格式发生了变化。并且发现这个sql语句中使用了To_char函数。
例如如下的这个表空间使用率的sql。
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(+)
/
正常的时候是如下格式表示。
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语句没有变过。也没有打什么补丁。
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去掉会解决该问题。