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 Database Application Developer's Guide - Large Objects中的 LOB 存储,尤其是第三条说明可以更改的内容:
笔记:
只能修改部分存储参数。例如,您可以使用ALTER TABLE ... MODIFY LOB
语句来更改RETENTION
,
PCTVERSION
, CACHE
or NO CACHE LOGGING
or NO LOGGING
, 和STORAGE
子句。
您还可以使用 ALTER TABLE ... MOVE 语句更改 TABLESPACE。
但是,一旦创建了表,就不能更改 CHUNK 大小,或者 ENABLE 或 DISABLE STORAGE IN ROW 设置。
此外,索引组织表中的 LOB说:
默认情况下,在没有溢出段的情况下创建的索引组织表中的所有 LOB 都将被离线存储。换句话说,如果创建索引组织表时没有溢出段,则该表中的 LOB 的默认存储属性为 DISABLE STORAGE IN ROW。如果您强制尝试为此类 LOB 指定 ENABLE STORAGE IN ROW 子句,则 SQL 将引发错误。
这就解释了为什么 jonearles 在索引组织表中创建 LOB 时没有在 data_length 列中看到 4,000。