Oracle 10g:CLOB数据长度是否可以小于4,000?

时间:2011-04-16 15:04:07

标签: oracle oracle10g types clob

我们有三个数据库:dev,staging和production。我们在开发环境中完成所有编码。然后,我们将所有代码和数据库更改推送到暂存,以便客户端可以看到它在实时环境中的工作方式。签署后,我们会对生产环境进行最终部署。

现在,关于这些CLOB列:当使用desc和/或查询dev数据库的all_tab_columns视图时,CLOB显示的数据长度为4,000。但是,在登台和生产数据库中,dev-equivalent CLOB列的数据长度是奇数,如86.我已经搜索了每个可能的解决方案,以了解它是如何产生的。我甚至尝试添加一个新的CLOB(86)专栏,认为它可以像VARCHAR2那样工作,但Oracle只是吐出一个错误。

DBA可能会搞砸了吗?这甚至可以担心吗?由于这一点,似乎没有任何事情破坏,但我只是喜欢所有环境中的元数据。

4 个答案:

答案 0 :(得分:4)

首先,我 - 作为dba - 感到遗憾的是看到你和dbas之间缺乏合作。我们都需要合作才能取得成功。 Clob数据长度可小于4000字节。

create table z ( a number, b clob);
Table created.
insert into z values (1, 'boe');

1 row created.
exec dbms_stats.gather_table_stats (ownname => 'ronr', tabname => 'z');

PL/SQL procedure successfully completed.
select owner, avg_row_len from dba_tables where table_name = 'Z'
SQL> /

OWNER                  AVG_ROW_LEN
------------------------------ -----------
RONR                       109

select length(b) from z;

 LENGTH(B)
----------
     3

你在哪里发现clob长度不能小于4000?

答案 1 :(得分:4)

DATA_LENGTH存储将在列的行中占用的最大字节数。如果CLOB可以存储在行中,则最大值为4000. LOBS永远不会占用超过4000个字节。如果禁用行存储,则LOB将仅存储查找LOB数据所需的指针信息,该信息远小于4000字节。

SQL> create table t (clob_in_table clob
  2     , clob_out_of_table clob
  3  ) lob (clob_out_of_table) store as (disable storage in row)
  4     , lob (clob_in_table) store as (enable storage in row)
  5  /

Table created.

SQL> select table_name, column_name, data_length
  2  from user_tab_columns
  3  where table_name = 'T'
  4  /

TABLE_NAME                     COLUMN_NAME                    DATA_LENGTH
------------------------------ ------------------------------ -----------
T                              CLOB_IN_TABLE                         4000
T                              CLOB_OUT_OF_TABLE                       86

编辑,在* _LOBS视图

上添加信息

使用[DBA | ALL | USER] _LOBS视图查看行外存储设置中定义的行:

SQL> select table_name
  2     , cast(substr(column_name, 1, 30) as varchar2(30))
  3     , in_row
  4  from user_lobs
  5  where table_name = 'T'
  6  /

TABLE_NAME                     CAST(SUBSTR(COLUMN_NAME,1,30)A IN_
------------------------------ ------------------------------ ---
T                              CLOB_IN_TABLE                  YES
T                              CLOB_OUT_OF_TABLE              NO

编辑2,一些参考

有关定义LOB存储的更多信息,请参阅LOB Storage中的Oracle Database Application Developer's Guide - Large Objects,特别是有关可以更改内容的第三个注释:

  

注意:

     

只能修改一些存储参数。例如,你   可以使用ALTER TABLE ... MODIFY LOB语句更改RETENTION,   PCTVERSIONCACHENO CACHE LOGGINGNO LOGGING以及STORAGE   条款。

     

您还可以使用ALTER TABLE更改TABLESPACE ...   MOVE声明。

     

但是,一旦创建了表,就无法更改CHUNK   大小,或行中的ENABLE或DISABLE STORAGE设置。

此外,LOBs in Index Organized Tables说:

  

默认情况下,创建的没有溢出段的索引组织表中的所有LOB都将存储在行外。换句话说,如果创建的索引组织表没有溢出段,则此表中的LOB将其默认存储属性设置为DISABLE STORAGE IN ROW。如果您强行尝试为此类LOB指定ENABLE STORAGE IN ROW子句,则SQL将引发错误。

这解释了为什么jonearles在索引组织表中创建LOB时在data_length列中没有看到4,000。

答案 2 :(得分:3)

CLOB没有指定的长度。查询ALL_TAB_COLUMNS时,例如:

select table_name, column_name, data_length
from all_tab_columns
where data_type = 'CLOB';

你会注意到data_length总是4000,但是应该忽略它。

CLOB的最小大小为零(0),最大值为8 TB到128 TB,具体取决于数据库块大小。

答案 3 :(得分:1)

正如ik_zelf和Jeffrey Kemp指出的那样,CLOB可以存储少于4000个字节。

但为什么CLOB data_lengths不总是4000?该数字实际上并不限制CLOB,但您可能正确担心元数据的存在 在你的服务器上不同。您可能希望在所有服务器上的对象上运行DBMS_METADATA.GET_DDL并比较结果。

我能够通过将CLOB添加到索引组织表来创建低data_length。

create table test
(
    column1 number,
    column2 clob,
    constraint test_pk primary key (column1)
)
organization index;

select data_length from user_tab_cols
where table_name = 'TEST' and column_name = 'COLUMN2';

在10.2.0.1.0上,结果为116.
在11.2.0.1.0,结果是476。

这些数字对我没有任何意义,我猜这是一个错误。但我对不同的存储选项没有很好的理解,也许我只是遗漏了一些东西。

有人知道这里到底发生了什么吗?