暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Halo集合类型系列——嵌套表(Nested Table)的正确使用

贾桂权 2024-12-05
88

一、集合类型

在Oracle数据库中集合类型分为以下三种,分别为关联数组(Associative Array)、嵌套表(Nested Table)和可变数组(VARRAY)。更加详细的介绍如下:

关联数组(Associative Array):又称索引表,通过数字或字符串作为下标来查找集合中的元素,元素数量不限。

嵌套表(Nested Table):与关联数组类似,使用有序数字作为元素的下标,元素的最大数量不限。

可变数组(VARRAY):使用有序数字作为元素的下标,元素的最大数量在定义时确定。

我们注意到了部分客户对集合类型存在着使用需求,而羲和(halo)数据库14版本的集合类型尚不足以满足客户的要求,因此我们在羲和(halo)数据库16版本专门针对集合类型做了增强处理,

接下来将会给大家带来羲和(halo)数据库16版本集合类型系列文章,今天的主题是如何正确使用嵌套表(Nested Table)。



二、嵌套表(Nested Table)

如果换一种角度来理解嵌套表(Nested Table)的话,可以将其类似看做是没有上限的一维数组。

并且访问嵌套表的元素也和访问数组元素类似,支持通过下标访问,最小下标值为1,通过小括号访问。

-- 访问n号元素 n为int类型 n >= 1
collection_name(n)  

当然也仅仅是类似看作一维数组,除了上面说到的和数组的区别在于:数组是有固定上限的,而嵌套表是无界的,大小可以动态增加。

除此之外,数组总是密集的(有连续的下标),嵌套表则不一定,嵌套表初始状态是密集集合,但是后续如果使用了DELETE集合方法(后续展开介绍),则会变成稀疏集合,从而不连续。

一张经典的图如下:


嵌套表语法定义如下:

-- 在Package或匿名块中
TYPE type_name IS TABLE OF element_type [NOT NULL];
-- 在SQL场景中,创建全局的嵌套表类型
CREATE TYPE type_name IS TABLE OF element_type [NOT NULL];


三、嵌套表变量初始化

如果想正常使用嵌套表,则必须对嵌套表进行初始化的动作,而对嵌套表进行初始化,需要使用对应构造函数。对于此处的构造函数而言,便是和嵌套表类型同名的函数。

初始化的动作可以发生在声明区域,也可以发生在执行区域。


没有初始化的嵌套表被自动赋值为NULL,当引用此嵌套表时,将会抛出预定义的异常。



四、集合方法

集合方法是对集合进行操作的内置函数或过程,一般点上相关方法,便代表着调用该方法。

collection_name.collection_method

嵌套表支持以下集合方法:

EXISTS
COUNT
LIMIT
FIRST and LAST
PRIOR and NEXT
EXTEND
TRIM
DELETE

通过相关的集合方法,可以帮助我们更容易的处理嵌套表的相关内容。

4.1、EXISTS

EXISTS用于检查元素是否存在,一般的使用语法为EXISTS(n),当嵌套表中n号位置元素存在,则返回ture,如果不存在,将返回false

当嵌套表变得稀疏的时候,这个方法可以帮助我们避免引用不存在的元素。(引用不存在的元素将会抛出预定义的异常)


4.2、COUNT

COUNT方法用于返回嵌套表中元素总体数量


4.3、LIMIT

LIMIT方法仅对可变数组(VARRAY)有意义,对于已正常初始化的嵌套表而言,返回NULL


4.4、FIRST and LAST

FIRST方法用于返回嵌套表中第一个元素下标,LAST方法用于返回嵌套表中最后一个元素下标。


4.5、PRIOR and NEXT

PRIOR方法用于返回上一个存在元素的下标,如果不存在上一个元素,则返回NULL。一般语法为PRIOR(n)

NEXT方法用于返回下一个存在元素的下标,如果不存在下一个元素,则返回NULL。一般语法为NEXT(n)

这对方法会跳过已删除的元素,所以当嵌套表变得稀疏时,也就是下标不连续,这个时候使用这对方法,可以更加方便的遍历整个嵌套表。


4.6、EXTEND

EXTEND方法用于扩充嵌套表的大小

  • EXTEND将一个 null 元素追加到嵌套表中。

  • EXTEND(n)将n个null 元素追加到嵌套表中。


4.7、TRIM

有扩充也就会有回收,TRIM方法便是用于删除嵌套表中尾部元素,并回收存储空间。

  • TRIM从集合的末尾删除一个元素。

  • TRIM(n)从集合的末尾删除n个元素。


4.8、DELETE

DELETE方法用于删除嵌套表中的元素,咋一看和TRIM方法好像是一样的,但其实并不一样。

二者的区别在于:DELETE方法删除元素后,元素的存储空间并没有被回收,因此,还可以通过赋值重新引用该元素;使用TRIM方法删除元素后,空间被回收,不可以再引用该元素,除非再次使用EXTEND方法。

因此使用DELETE方法,便可以将嵌套表变得稀疏。

  • DELETE从集合中删除所有元素。

  • DELETE(n)删除嵌套表第n个元素。

因此我们可以简单复现一下这张图



对删除的位置,重新赋值,可以重新访问



五、全局嵌套表类型

全局嵌套表类型可用作函数/存储过程参数或表字段类型。



六、声明

若文中存在错误或不当之处,敬请指出,以便我进行修正和完善。希望这篇文章能够帮助到各位。

文中相关测试内容基础环境为羲和(halo)数据库16版本Oracle模式(已创建拓展)和 Oracle19c。

如需获取同样的体验,敬请期待后续16版本公测。

文章转载:https://www.modb.pro/db/1844644828275109888

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

暂无图片
获得了2次点赞
暂无图片
内容获得1次评论
暂无图片
获得了2次收藏