KingbaseES PL/SQL 支持集合数据类型,集合数据类型也是一种复合数据类型,类似于编程语言中的数组。集合数据类型包括三种具体的类型:关联数组(Associative Array)、嵌套表(Nested Table)和可变数组(Varray)。
1 关联数组
1.1定义
关联数组(Associative Array):也称为索引表,是具有唯一键值的集合类型。
具有以下特性:
包含零或多个具有相同数据类型的元素;
用户可按键值检索;
键值可以是整型等数值类型,也可以是字符串等非数值类型;
键值连续且有序;
只能用于PL/SQL环境;
1.2 声明关联数组
语法定义如下:
TYPE assoc_type_name IS TABLE OF element_type [ NOT NULL ] INDEX BY index_type;
其中:
assoc_type_name :用户自定义关联数组名字
element_type:关联数组元素的数据类型,可以是标量数据类型,%type,%rowtype及用户自定义类型
index_type:关联数组索引数据类型,kingbase支持 INT | VARCHAR | VARCHAR2 | TEXT等类型
1.3示例
下面以具体的示例说明关联数组的使用:
set SQLTERM /
DECLARE
TYPE my_assoc_array_type1 IS TABLE OF varchar(20) INDEX BY varchar(20); --声明关联数组类型
var1 my_assoc_array_type1; --声明关联数组类型变量
i varchar(20);
BEGIN
--可关联数组变量赋值
var1('c1') :='kingbase';
var1('c2') :='tianjin';
--遍历关联数组每个元素值
i :=var1.first;
WHILE i is not null LOOP
DBMS_OUTPUT.PUT_LINE(var1(i));
i :=var1.next(i);
END LOOP;
END;
/
2 嵌套表
2.1 定义
嵌套表(Nested Table):像一个元素量任意的一维数组。
具有以下特点:
基于键-值对的集合类型;
与关联数组相比,它的键值只能为整型,即从1开始的连续值;
必须使用和其同名的构造函数进行初始化;
2.2声明嵌套表
可以通过type语句在plsql里声明嵌套表类型,语法如下:
TYPE nested_table_name IS TABLE OF element_type [ NOT NULL ];
其中:
nested_table_name :用户自定义嵌套表类型名字
element_type:嵌套表类型元素的数据类型,可以是标量数据类型,%type,%rowtype及用户自定义类型
也可以在通过create type语句在SQL层创建嵌套表类型,语法如下:
CREATE TYPE nested_table_name IS TABLE OF element_type [ NOT NULL ];
2.3示例
下面以具体的示例说明嵌套表类型的使用:
set SQLTERM /
DECLARE
TYPE my_nest_table_type1 IS TABLE OF VARCHAr(50); --声明嵌套表类型
var1 my_nest_table_type1 :=my_nest_table_type1(); --声明嵌套表类型变量,并通过构造函数进行初始化
i varchar(20);
BEGIN
var1 :=my_nest_table_type1('kingbase','tianjin','beijing'); --赋值
--遍历嵌套表每个元素值
FOR i IN 1..var1.count LOOP
DBMS_OUTPUT.PUT_LINE(var1(i));
END LOOP;
END;
/
3 可变数组
3.1定义
可变数组(Varray):是一个varray数据类型的集合。
具有以下特点:
下标类型为INT且从1开始;
必须使用和其同名的构造函数进行初始化;
在以下方面与嵌套表不同;
可变数组在定义时需指定最大元素个数,且实际应用中不能超过该限制;
可变数组的下标必须连续;
删除元素时,可变数组不能使用delete(n)和delete(m,n)方法,但可使用delete()方法(即删除所有元素)
3.2 声明可变数组
可以通过type语句在plsql里声明可变数组类型,语法如下:
TYPE varray_type_name IS VARRAY(size_limit) OF element_type [ NOT NULL ];
其中:
varray_type_name :用户自定义可变数组类型名字
size_limit: 可变数组最大元素个数,使用中不能超过该限制
element_type:可变数组类型元素的数据类型,可以是标量数据类型,%type,%rowtype及用户自定义类型
也可以在通过create type语句在SQL层创建可变数组类型,语法如下:
CREATE TYPE varray_type_name IS VARRAY(size_limit) OF element_type [ NOT NULL ];
3.3示例
下面以具体的示例说明可变数组类型的使用:
set SQLTERM /
DECLARE
TYPE my_nest_table_type1 IS VARRAY(10) OF VARCHAr(50); --声明可变数组类型
var1 my_nest_table_type1 := my_nest_table_type1(); --声明可变数组类型变量,并通过构造函数进行初始化
i varchar(20);
BEGIN
var1 :=my_nest_table_type1('kingbase','tianjin','beijing'); --赋值
--遍历可变数组每个元素值
FOR i IN 1..var1.count LOOP
DBMS_OUTPUT.PUT_LINE(var1(i));
END LOOP;
END;
/
4.集合方法
4.1集合方法简介
常用的集合方法参见下表,其中extend、trim、exists仅嵌套表和可变数组类型支持。
| 方法名 | 说明 | 用法 |
| count | 返回集合数据类型变量中当前的元素数 | count | count() |
| first | 返回变量的第一个索引值 | first | first() |
| last | 返回变量的最后一个索引值 | last | last() |
| prior | 返回指定索引的前一个索引值 | prior(index) |
| next | 返回指定索引的后一个索引值 | next(index) |
| delete | 从集合数据类型变量中删除元素 | delete | delete(),delete(index), delete(index1, index2) |
| limit | 返回可变数组中定义的最大元素数限制 | limit | limit() |
| extend | 在集合变量末尾扩展元 | extend | extend(),extend(num), extend(num, index) |
| trim | 从变量末尾开始删除元素 | trim | trim(),trim(num), |
| exists | 判断变量中指定索引元素是否存在,并返回Boolean 值 | exists(index) |
4.2集合方法示例
1.first、last方法示例
set SQLTERM /
DECLARE
TYPE my_type IS TABLE OF INT INDEX BY VARCHAr(10);
a my_type;
BEGIN
IF a.first() IS NULL THEN
DBMS_OUTPUT.PUT_LINE( 'There is no first element. ');
END IF;
a('no1') := 10;
a('no2') := 20;
a('no3') := 30;
a('no4') := 40;
DBMS_OUTPUT.PUT_LINE( 'First index is ' || a.first());
DBMS_OUTPUT.PUT_LINE( 'Last index is ' || a.last);
END;
/
2. count、prior、next方法示例
set SQLTERM /
DECLARE
TYPE my_type IS TABLE OF INT INDEX BY PLS_INTEGER;
a my_type;
i int := 0;
BEGIN
a(1) := 10;
a(2) := 20;
a(3) := 30;
DBMS_OUTPUT.PUT_LINE('Total elements of a : ' || a.count());
i := a.first();
WHILE i IS NOT NULL LOOP
DBMS_OUTPUT.PUT_LINE( 'a('|| i || ') is ' || a(i));
i := a.next(i);
END LOOP;
i := a.last();
WHILE i IS NOT NULL LOOP
DBMS_OUTPUT.PUT_LINE ('a('|| i || ') is ' || a(i));
i := a.prior(i);
END LOOP;
END;
/
3. delete方法示例
set SQLTERM /
DECLARE
TYPE my_type IS TABLE OF VARCHAr2(10) INDEX BY PLS_INTEGER;
a my_type;
BEGIN
a(1) := 'aaa';
a(2) := 'bbb';
a(3) := 'ccc';
a.delete(3);
a.delete(1);
DBMS_OUTPUT.PUT_LINE ('Total elements of a : ' || a.count);
a.delete();
DBMS_OUTPUT.PUT_LINE( 'Total elements of a : ' || a.count);
END;
/
【本文正在参与炫“库”行动-人大金仓有奖征文】
活动链接:https://bss.csdn.net/m/topic/kingbase



