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

| 我们有三个数据库:dev,staging和production。我们在开发环境中进行所有编码。然后,我们将所有代码和数据库更改推送到暂存,以便客户端可以看到其在实时环境中的工作方式。他们签署后,我们将最终部署到生产环境。 现在,关于以下CLOB列:使用desc和/或在dev_all的all_tab_columns视图中查询时,CLOB的数据长度为4,000。但是,在登台和生产数据库中,等效于dev的CLOB列的数据长度是奇数,例如86。我一直在寻找所有可能的解决方案,以了解这是如何实现的。我什至尝试添加一个新的CLOB(86)列,认为它可以像对VARCHAR2一样工作,但是Oracle只是吐出了一个错误。 DBA会破坏一些东西吗?这甚至有什么可担心的吗?因此,似乎一切都没有中断,但我只是希望元数据在所有环境中都相同。     
已邀请:
首先,我-作为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
您在哪里发现血块长度不能小于4000?     
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存储的更多信息,请参见《 Oracle数据库应用程序开发人员指南-大型对象》中的LOB存储,尤其是关于可更改内容的第三个注释:   注意:      仅某些存储参数可以修改。例如你   可以使用
ALTER TABLE ... MODIFY LOB
语句更改
RETENTION
,   
PCTVERSION
CACHE
NO CACHE LOGGING
NO LOGGING
STORAGE
  条款。      您还可以使用ALTER TABLE更改TABLESPACE ...   MOVE语句。      但是,一旦创建了表,就无法更改CHUNK   大小或“启用或禁用行中存储”设置。 同样,索引组织表中的LOB表示:   默认情况下,创建的索引组织表中没有溢出段的所有LOB将不在线存储。换句话说,如果创建的索引组织表没有溢出段,则该表中的LOB的默认存储属性为DISABLE STORAGE IN ROW。如果您强行尝试为此类LOB指定ENABLE STORAGE IN ROW子句,则SQL将引发错误。 这解释了为什么jonearles在索引组织表中创建LOB时在data_length列中看不到4,000的原因。     
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,具体取决于数据库块大小。     
正如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。 这些数字对我来说没有任何意义,我想这是一个错误。但是我对不同的存储选项没有很好的了解,也许我只是缺少了一些东西。 有人知道这里到底发生了什么吗?     

要回复问题请先登录注册