首页 > 解决方案 > Oracle 11g 的 ALL_TABLES 表查找存在错误

问题描述

我在 Oracle 11g 上运行了以下查询。

SELECT  
    T.TABLE_NAME,               
    T.TABLESPACE_NAME, 
    T.CACHE,                    
FROM ALL_TABLES T  

然后,Cache属性的Y或N值前面有一个空格,导致我的代码出错。

即使我使用 Dbeaver 或 JDBC ResultSet 检查,也包括空白。这是 Oracle 中有意添加的空格吗?或者它是一个错误?首先,我使用 trim() 解决了这个问题。

谢谢

标签: sqloracleoracle11g

解决方案


CACHE列的数据类型是VARCHAR2(5). 文档说它包含YN(取决于表是否要缓存在缓冲区缓存中)。那么,为什么 Oracle 不将其声明为CHAR(1)?会的,对吧?

但是,如果您检查ALL_TABLES源查询,您会注意到该CACHE列如下所示:

LPAD (DECODE (BITAND (t.flags, 8), 8, 'Y', 'N'), 5),

Oracle 决定将其填充为5长度字符(带空格)(尽管未指定最后一个参数,但其默认值为单个空格):

SQL> select lpad('Y', 5) cache from dual;

CACHE
-----
    Y

SQL>

所以,是的——甲骨文是故意这样做的,但我不知道为什么


推荐阅读