Oracle中REF数据类型列的数据长度计算确认及疑问
REF类型列数据长度计算验证
示例代码与查询结果
create or replace type object_test_0 as object (item1_ varchar2(100), item2_ varchar2(10), item3_ varchar2(10)) / create or replace type object_test_01 as object( item1_ number) / create table t_0_0 ( item200_ number, item100_ ref object_test_0, item300_ object_test_01 ) create table t_0 of co.object_test_0 insert into t_0_0 (select 1000,ref(t_t),object_test_01(10000) from t_0 t_t) select * from all_tab_columns where table_name like 'T_0_0'
查询结果:
| COLUMN_NAME | DATA_TYPE | DATA_TYPE_MOD | DATA_LENGTH |
|---|---|---|---|
| ITEM200_ | NUMBER | 22 | |
| ITEM100_ | OBJECT_TEST_0 | REF | 50 |
| ITEM300_ | OBJECT_TEST_01 | 1 |
问题验证
已知object_id为16字节,rowid为9字节,且存储引用时系统生成的对象标识符需重新映射,计算逻辑(16字节+9字节)*2=50字节是否正确?
解答
你的计算逻辑是正确的。Oracle中REF类型的存储结构包含两部分核心内容:16字节的对象标识符(OID)和9字节的ROWID,合计25字节。由于系统需要支持对象标识符的重新映射(应对数据库迁移、表空间移动等场景下的标识符转换需求),这两部分内容会被存储双份,因此总长度为(16+9)*2=50字节,与查询到的DATA_LENGTH=50完全匹配。
内容的提问来源于stack exchange,提问作者titi zarif
相关产品推荐
相关产品推荐

