人大金仓数据库KingbaseES PLSQL 集合类型介绍

栏目归类:人大金仓数据库
发布时间:2024-03-26 18:50:28

关键字:

KingbaseES、PLSQL、关联数组、可变数组、嵌套表

1.集合类型概述

集合类型是KingbaseES的PLSQL中支持的一种复合数据类型。 跟普通的标量数据类型不同的是,集合类型都是由类似于键值对(key-value)的复合数据结构组成的,因此在集合类型中可以通过集合变量的索引“key”去访问它存储的具体内容“value”。这种数据结构对于具有关联或者映射属性的两个数据来说,具有很好的逻辑体现效果, 在实际场景中也具有广泛的应用价值, 例如 JAVA中的map, C++ STL中的unordered_map等。KingbaseES中支持三种集合类型:关联数组、可变数组和嵌套表。

2.关联数组

关联数组是一组键值对。每个键都是一个唯一的索引,用于定位与之相关联的值,定义关联数组的语法为:

*TYPE ass_type IS TABLE OF value_type INDEX BY key_type; *

其中,ass_type是要定义的关联数组名称,value_type 是关联数组的值类型,key_type是关联数组中的键类型,这三个标识符都是用户自定义的,其余的关键字都是固定的。

关联数组中的键key_type支持多种数据类型,如字符串类型VARCHAR, STRING和整数类型PLS_INTERGER等。关联数组的值value_type是按照键key_type的排序顺序存储的,而不是按照其创建顺序存储的。关联数组具有下面的性质:

(1)定义了关联数组之后,如不对其填充,则其内容为空,但不是NULL; (2)关联数组可以容纳不定量的元素,它的容纳空间可以动态地增长; (3)关联数组的生命周期只存在于定义它的PLSQL程序块中,就像一个局部的临时变量一样,它只在内存中存在,而不占用磁盘空间; (4)关联数组仅在PLSQL的程序块中被支持,而不能在SQL的DML语句中使用关联数组来作为某个表的字段类型,例如,下面的用法是不被支持的:

\set SQLTERM /
DECLARE
TYPE my_type IS TABLE OF NUMBER  
INDEX BY VARCHAR(64);  --定义关联数组my_type
BEGIN
DROP TABLE IF EXISTS stu;
CREATE TABLE stu(id INT, name_score my_type ); 
/*该语句试图通过使用关联数组来作为name_score字段的数据类型,是不被支持的*/
END;
/

(5)关联数组不支持通过构造函数对其初始化(与后面的可变数组和嵌套表不同)。 下面的示例定义了一种按照字符串作为键的关联数组, 然后用三个元素填充了关联数组变量,最后按照键的字符串排序顺序将其打印出来。

\set SQLTERM / 
DECLARE 
TYPE name_age IS TABLE OF INT INDEX BY VARCHAR2(64);  
/*定义关联数组name_age, 其键的类型为VARCHAR2, 值的类型为INT*/ 
people name_age;  /*将变量people定义为关联数组类型*/ 
i VARCHAR2(64); 


BEGIN 
people('zs') := 25; 
people('ls') := 30; 
people('ww') := 40; 
/*使用三个元素填充关联数组*/
i := people.FIRST; /*获取关联数组的第一个键*/
WHILE i IS NOT NULL LOOP /*循环打印关联数组中的元素*/
RAISE NOTICE '% is % years old', i, people(i); 
i := people.NEXT(i); -- Get next element of array 
END LOOP; 
END; 
/
执行结果:
NOTICE: ls is 30 years old 
NOTICE: ww is 40 years old 
NOTICE: zs is 25 years old 

3.可变数组

可变数组是一个数组,它能够容纳的元素数量可以是零(空),也可以是定义时声明的最大值。定义可变数组的语法为:

TYPE varray_type IS VARRAY(size_limit) OF value_type;

其中,varray_type是要定义的可变数组名称,size_limit是可变数组能够存储的最大元素个数,value_type是数组中存储的值的数据类型,这三个标识符都是用户自定义的,其余的关键字都是固定的。

可变数组虽然称为数组,但是也可以从键值对的角度去理解它,因为数组也是通过数组下标(键)去访问数组中存储的内容(值)。跟关联数组不同,可变数组的下标(键)只能是整数,从1开始且必须连续,并且在定义可变数组的时候要指明该数组能够存储的最大元素个数(size_limit),且在实际使用的过程中不能超过该限制。另外,可变数组在未初始化的时候是一个空集合,必须通过与其同名的构造函数来初始化它。

下面的示例展示了可变数组的基本用法。

\set SQLTERM / 
DECLARE 
TYPE my_varray IS VARRAY(4) OF VARCHAR2(15);   
/*定义可变数组数据类型my_varray, 其值的类型为VARCHAR2*/
class my_varray := my_varray('zs', 'ls', 'ww', 'zl'); 
/*定义可变数组变量class, 并使用与可变数组数据类型名称相同的构造函数来初始化它,各个值对应的键自动从1开始填充*/
BEGIN 
/*使用循环来遍历打印可变数组中的各个元素,其中 class(i) 即为通过class的键i去引用它对应的值*/
FOR i IN 1..4 LOOP 
RAISE NOTICE '%.%' ,i ,class(i); 
END LOOP; 
END;
/   

执行结果:
NOTICE: 1.zs 
NOTICE: 2.ls 
NOTICE: 3.ww 
NOTICE: 4.zl 

4.嵌套表

嵌套表也属于一种键值对类型的集合数据类型。定义嵌套表的语法为:

TYPE nesttab_type IS TABLE OF value_type;

其中,nesttab_type是要定义的嵌套表数据类型的名称,value_type是嵌套表中存储的值的数据类型,这两个标识符都是用户自定义的,其余的关键字都是固定的。 跟可变数组类似,嵌套表的下标(键)只能是整数,且从1开始,嵌套表在未初始化的时候也是一个空集合,必须通过与其同名的构造函数来初始化它。但不同的是,嵌套表的下标可以不连续,并且,嵌套表在定义的时候不需要指定能够容纳的最大元素个数,当添加或删除元素时,嵌套表变量占用的内存量可以动态地增加或减少。

下面的示例展示了嵌套表的基本用法。

\set SQLTERM / 
DECLARE 
TYPE my_nesttab IS TABLE OF VARCHAR2(15); 
/*定义嵌套表数据类型my_nesttab, 其值的类型为VARCHAR2*/
fruits my_nesttab := my_nesttab('Apple', 'Orange', 'Banana', 'PEAR'); 
/*定义嵌套表变量fruits, 并使用与嵌套表数据类型名称相同的构造函数来初始化它,各个值对应的键自动从1开始填充*/
BEGIN 
/*使用循环来遍历打印嵌套表中的各个元素,其中,fruits.FIRST返回嵌套表fruits的第一个下标(键),fruits.LAST返回嵌套表fruits的最后一个下标(键), fruits(i) 即为通过fruits的键i去引用它对应的值*/
FOR i IN fruits.FIRST .. fruits.LAST LOOP
RAISE NOTICE '%', fruits(i); 
END LOOP; 
END;
/
执行结果:
NOTICE: Apple 
NOTICE: Orange 
NOTICE: Banana 
NOTICE: PEAR

5.集合方法

集合数据类型具有自己的方法,类似于C++中每个类具有成员函数一样,可以通过“集合变量名.方法名”的形式调用方法来获取该集合变量的一些属性。集合方法可以是函数,也可以是存储过程。下表总结了常用的集合方法。

file

表1 常用集合方法

6.总结

上面简要介绍了3种KingbaseES的PLSQL中支持的集合数据类型,它们之间既有区别,也有联系。下面根据它们各自的特点来总结每个集合数据类型的适用情况。

关联数组的适用情况:

(1)键的数据类型不止局限于整数的情形,如使用字符串作为键。

(2)存储元素的数量需要动态地变化的情形。

(3)关联数组只是临时存储的,欲使关联数组在数据库的整个会话周期内一直保持存在,可以在包中使用它。

可变数组的适用情况:

(1)已知需要存储的元素数量的最大上限。

(2)需要按照顺序访问元素。

(3)可变数组在使用时必须同时存储或检索所有元素,故其不适用于拥有大量元素的情况,那样效率会比较低。

嵌套表的适用情况:

(1)使用之前无法确定需要存储元素的个数。

(2)下标(键)是不连续的。

(3)需要删除或者更新局部的某些元素,但不能同时删除或者更新所有的元素。

更多信息,参见https://help.kingbase.com.cn/v8/index.html

文章来源:https://blog.csdn.net/arthemis_14/article/details/132768911
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
Hotcall 技术分享站