我们有三个数据库:dev,staging和production。我们在开发环境中完成所有编码。然后,我们将所有代码和数据库更改推送到暂存,以便客户端可以看到它在实时环境中的工作方式。签署后,我们会对生产环境进行最终部署。
现在,关于这些CLOB列:当使用desc和/或查询dev数据库的all_tab_columns视图时,CLOB显示的数据长度为4,000。但是,在登台和生产数据库中,dev-equivalent CLOB列的数据长度是奇数,如86.我已经搜索了每个可能的解决方案,以了解它是如何产生的。我甚至尝试添加一个新的CLOB(86)专栏,认为它可以像VARCHAR2那样工作,但Oracle只是吐出一个错误。
DBA可能会搞砸了吗?这甚至可以担心吗?由于这一点,似乎没有任何事情破坏,但我只是喜欢所有环境中的元数据。
答案 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
,PCTVERSION
,CACHE
或NO CACHE LOGGING
或NO 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。
这些数字对我没有任何意义,我猜这是一个错误。但我对不同的存储选项没有很好的理解,也许我只是遗漏了一些东西。
有人知道这里到底发生了什么吗?