暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

Halo集合类型系列——关联数组(Associative Array)

贾桂权 2024-12-06
75

一、前言

前不久,咱们带来了关于羲和数据库集合类型中的嵌套表的使用,顺带和Oracle19c对比了一下,基本功能上大差不差,前文链接如下

羲和(halo)数据库集合类型系列——学会嵌套表(Nested Table)的正确使用

上次将两款数据库的测试内容和运行结果一起截图,结果贴到文章中反而显得不是很清楚,像我这种眼神不太好使的同学,还需要多点一下图片。

这回咱们简单调整一下,先放出羲和(halo)数据库16版本的运行结果,再给出Oracle19c的运行截图,方便大家对比。

接下来给大家带来的是羲和(halo)数据库集合类型系列——关联数组(Associative Array)相关内容。


二、关联数组(Associative Array)

Associative Arrays(也称为 index-by 表)类似键值对的数组,其中每个键都是唯一的,用于在数组中查找相应的值。

键可以是整型或字符串类型,对于整数类型的键而言,键不必是连续的。

语法定义如下:

TYPE type_name IS TABLE OF element_type [NOT NULL]
   INDEX BY [PLS_INTEGER | BINARY_INTEGER | VARCHAR2(size_limit)];
复制

而访问的语法和嵌套表一致,只是没有嵌套表的限制,因为关联数组的键值比较随意

collection_name(n)  
复制

关联数组不需要进行初始化的操作,和绝大多数的类型不一样的是,当声明定义出一个关联数组类型变量,它的默认值不为NULL。

Halo:


Oracle:



三、集合方法

关联数组和嵌套表相比的话,嵌套表中元素的添加是通过EXTEND方法实现的,而关联数组可以直接赋值。

所以相较于嵌套表而言,关联数组的集合方法便没有EXTEND方法和TRIM方法。

调用语法一致,调用语法如下:

collection_name.collection_method
复制

关联数组支持以下集合方法:

EXISTS
COUNT
LIMIT
FIRST and LAST
PRIOR and NEXT
DELETE

通过相关的集合方法,可以帮助我们更容易的处理关联数组的相关内容

3.1、EXISTS

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

和嵌套表不一样的是,此处的n的类型,可以是非整数类型,也就是字符串类型。由关联数组类型的声明决定。

Halo:


Oracle:



3.2、COUNT

同嵌套表一致,COUNT方法用于返回关联数组中元素总体数量

Halo:


Oracle:



3.3、LIMIT

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

Halo:


Oracle:

预期行为不一致,不过国外有人和我有相似经历链接如下

https://asktom.oracle.com/ords/f?p=100:11:0::NO::P11_QUESTION_ID:9549043600346802813


但如果是INDEX BY BINARY_INTEGER又是正确的,感兴趣的同学可以自己研究一下



3.4、FIRST and LAST

如果关联数字类型定义键值为整型类型,则FIRST代表为最小值,可以为负数,LAST则为最大值。

若定义键值为字符串类型,则依据设定的排序规则,区分大小,FIRST、LAST分别反应此时的最大最小。

Halo:


Oracle:



3.5、PRIOR and NEXT

由于关联数组键值比较随意,所以如果需要遍历关联数组,就需要使用PRIOR和NEXT这两个方法了。

方法功能和方法名一致,不过有趣的是,当你输入不存在的键值,会依据内部的排序,来获取上一个值和下一个值(此处不演示)。

Halo:


Oracle:



3.6、DELETE

同嵌套表一致,使用DELETE方法删除关联数组中的元素,不会回收存储空间。

Halo:


Oracle:



四、全局集合类型?

在Oracle数据库中,关联数组是不允许创建全局类型的,不过这点在羲和数据库上放开了,我们支持使用如下语法去创建全局关联数组类型

CREATE TYPE type_name IS TABLE OF element_type [NOT NULL]
   INDEX BY [PLS_INTEGER | BINARY_INTEGER | VARCHAR2(size_limit)];
复制

不过Oracle其实也可以通过别的方法来创建类似的全局类型,比方说和Package结合。

Halo:


Oracle:



五、声明

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

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

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

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

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

评论