Oracle SQL Developer中REF函数返回对象实例而非引用的原因咨询
Oracle SQL Developer中REF函数显示对象实例而非引用的原因
根据Oracle对象关系特性开发指南,REF与VALUE函数的定义明确:
- REF函数:以对象表/视图的关联名称(或表别名)为参数,返回指向该表/视图中对象实例的引用(REF)
- VALUE函数:以对象表/视图的关联变量(表别名)为参数,返回对应行的对象实例
但实际测试时会发现一个差异:在Oracle SQL Developer中执行SELECT REF(e) FROM addresses e;,返回的是对象实例内容(和VALUE函数结果完全一致),而非预期的引用;但在SQL Plus中执行同一条语句,REF函数会正常返回引用值。
测试代码(基于Oracle官方示例)
drop type cust_address force; create type cust_address as object (STREET VARCHAR2(40), POSTAL_CODE VARCHAR2(10), CITY VARCHAR2(30), COUNTRY VARCHAR2(20) ); CREATE TABLE addresses OF cust_address; INSERT INTO addresses VALUES ( '123 First Street', '4GF H1J', 'Our Town', 'Ourcountry'); SELECT REF(e) FROM addresses e;
不同工具的输出结果
- SQL Developer返回结果:
SYSTEM.CUST_ADDRESS_TYP('123 First Street', '4GF H1J', 'Our Town', 'Ourcountry')
- SQL Plus返回结果:会显示类似
000000008000000000000000000000000000000000000000的原生REF引用值(具体格式依数据库版本而定)
原因解析
这是Oracle SQL Developer的自动格式化显示逻辑导致的:
- SQL Developer为了提升用户体验,会自动对REF类型的返回值执行
DEREF()操作,解析并展示引用指向的实际对象实例内容,而非显示底层存储的原生REF格式(包含对象标识符OID的字符串)。 - SQL Plus则保持了原生的输出行为,直接返回REF类型的原始值,不会自动展开解析对象内容。
需要明确的是:两者底层返回的数据是一致的——REF函数的实际返回值始终是对象引用,SQL Developer只是做了一层显示层面的转换。你可以在SQL Plus中执行SELECT DEREF(REF(e)) FROM addresses e;,得到的结果会和SQL Developer中REF(e)的输出完全一致,这也能验证上述结论。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

