GBase 8s
其他
文章
南大通用GBase 8s 嵌套表 返回方式简介
发表于2026-09-16 16:13:31334次浏览1个评论
嵌套表是 GBase 8s 兼容模式下重要的集合数据类型,在业务迁移、集合类型开发中经常使用。创建嵌套表存储子表时,支持RETURN AS VALUE与RETURN AS LOCATOR两种返回模式,二者在数据传输、内存开销、查询表现、访问逻辑上差异明显,选型不当会带来性能或者使用上的问题。
本文结合实操样例,对比两种模式的核心差异,并提供完整可复现的测试 SQL,帮助开发人员理解、合理选择嵌套表返回方式。
嵌套表 return as value 与 return as locator 区别
默认行为:默认为 return as value return as value 返回实际值,return as locator 返回引用
在数据库中,嵌套表(nested table)是一种集合数据类型,可以存储零个或多个元素,这些元素可以是标量类型或对象类型。嵌套表可以通过两种主要方式返回给调用者:RETURN AS VALUE 和 RETURN AS LOCATOR。这两种方式在性能和功能上有一些重要的区别。
RETURN AS VALUE
- 内存占用:当使用
RETURN AS VALUE时,嵌套表的数据会随调用返回的结果集一起传输。这意味着整个嵌套表的数据会被复制到调用者的内存空间中。 - 性能:由于数据需要在客户端和服务器之间传输,对于大型嵌套表,这种方式可能会消耗较多内存和带宽,影响性能。
- 用法:这种方式适用于嵌套表数据相对较小的情况,或者当嵌套表数据需要在客户端进行大量处理时。
- 访问方式:调用者可以直接访问和操作返回的嵌套表数据,无需额外的数据库访问。
RETURN AS LOCATOR
- 内存占用:
RETURN AS LOCATOR返回的是一个指向嵌套表数据的引用(locator),而不是实际数据本身。这意味着只有引用信息会被传输,而不是整个嵌套表的数据。 - 性能:由于只传输引用信息,这种方式通常比
RETURN AS VALUE更节省内存和带宽。然而,当需要访问嵌套表数据时,数据库访问仍然需要发生,这可能引入额外的延迟。 - 用法:这种方式适用于嵌套表数据较大,或者当只需要访问嵌套表的一小部分数据时。通过引用,可以按需从数据库中检索数据。
- 访问方式:调用者需要通过引用(locator)来访问嵌套表数据,这通常涉及额外的数据库操作,如使用
DBMS_LOB包或特定的数据库函数来检索数据。
总结
- RETURN AS VALUE:适用于小型嵌套表或需要在客户端进行大量处理的情况。数据随结果集一起返回,便于直接访问,但可能消耗较多内存和带宽。
- RETURN AS LOCATOR:适用于大型嵌套表或只需要访问部分数据的情况。返回的是数据引用,节省内存和带宽,但访问数据时需要额外的数据库操作。
实操用例
create database testdb with log;
set environment sqlmode 'oracle';
create type typ1 is table of int;
create table tmp_1(c1 typ1) nested table c1 store as ntmp_1;
create table tmp_2(c1 typ1) nested table c1 store as ntmp_2 return as locator;
info tables;
insert into tmp_1 values(typ1(1,3,5,7));
insert into tmp_2 values(typ1(1,3,5,7));
select * from tmp_1; --查询c1字段显示typ1(1,3,5,7)
select * from tmp_2; --查询c1字段显示(REFCURSOR)
select * from ntmp_1;
select * from ntmp_2;
drop table ntmp_1; --报错313
drop table tmp_1; --将tmp_1与ntmp_1全部删掉
info tables;
drop table ntmp_2; --报错313
info tables;
drop table tmp_2;
create table tmp_3(c1 typ1) nested table c1 store as ntmp_3 return as value; --同tmp_1
info tables;
insert into tmp_3 values(typ1(1,3,5,7));
select * from tmp_3;
select * from ntmp_3;
drop table tmp_3;
info tables;
drop type typ1;
执行现象说明:
RETURN AS VALUE:查询主表直接展示完整集合内容;RETURN AS LOCATOR:查询主表字段返回(REFCURSOR)引用游标,不会直接吐出全部嵌套集合数据;- 嵌套存储子表(ntmp_1/ntmp_2/ntmp_3)不允许直接 drop,直接删除会报 313 错误;删除主表会连带清理对应的嵌套子表。
总结
- 不写关键字时,嵌套表默认采用
RETURN AS VALUE;小集合场景优先使用默认模式,开发调试直观简单。 - 嵌套表数据量很大,客户端不需要一次性读取全部集合内容,建议选用
RETURN AS LOCATOR,降低网络传输与客户端内存压力,但需要业务适配 locator 引用访问逻辑。 - 嵌套生成的子存储表不能单独 drop,删除主表才会级联清理子表,运维不要尝试直接操作 ntmp 类嵌套子表。
- 该特性依赖 Oracle 兼容模式,建库后需要执行
set environment sqlmode 'oracle'开启。
大家在做 Oracle 迁移、嵌套表业务开发时,如果遇到查询返回 REFCURSOR、性能异常、313 删表报错等问题,欢迎在社区评论区交流讨论。
评论
登录后才可以发表评论
GBase用户28017发表于 1个月前
总结得不错
热门帖子
- 12025-12-01浏览数:183893
- 22023-05-09浏览数:26562
- 42023-09-25浏览数:20256
- 52020-05-11浏览数:19045