达梦数据库中集合类型的使用

DM PL/SQL的使用过程中,如果我们想储存单个的数据,我们可以利用声明变量的方式来存储,如果我们想存储单行多列的数据,我们可以用到记录类型(record),如果我们想保存单列多行的数据,则可以利用利用集合类型的方式来存储。本文将介绍达梦数据库中常用的几种集合类型以及他们的特点。

一、索引表

索引表的特点:

1.可以使用数字或者字母作为下标

2.以数字做下标时可以使用负数

3.只能在PL/SQL块中使用,无法作为表字段

下面进行一些测试,首先是数字做下标的索引表

declare 
  type index_tab_type is table of varchar(30) index by int; 
  v_table index_tab_type; 
begin 
  v_table(-1):='hello';--设定下标为-1的元素的值 
  v_table(1) :='and ';  --设定下标为1的元素的值 
  v_table(5):='world'; 
  print('元素个数为:'||v_table.count); 
  print('第一个元素是'||v_table(v_table.first));--输出第一个元素 
  print('最后一个元素是'||v_table(v_table.last));  --输出最后一个元素
end; 

执行结果如下

然后是字母做下标的索引表

declare 
  type index_tab_type is table of varchar(30) index by varchar(1); 
  v_table index_tab_type; 
begin 
  v_table('a'):='hello';--设定下标为-1的元素的值 
  v_table('c'):='world'; 
  print('元素个数:'||v_table.count); 
  print('第一个元素'||v_table(v_table.first)); 
  print('最后一个元素'||v_table(v_table.last)); 
end; 

输出结果

可以看到,当采用字符做下标的时候,索引表的存储类似与键值(key-value)的存储方式

二、Varray(变长数组)

Varray的特点:

1.声明的时候需要声明最大容量。

2.首次使用时需要初始化。

3.初始化时实际大小为0,需要利用extend方法来扩张上限才能增加元素。

这里我们换一种方式,把示例库DMHR中employee表上ID为1001至1005的5个人的名字存入此varray内,测试如下

DECLARE
TYPE MY_ARRAY_TYPE IS VARRAY(10) OF VARCHAR(100); --声明一个最大容量为100的varray
v MY_ARRAY_TYPE;
BEGIN
v:=MY_ARRAY_TYPE();  --初始化varray
FOR I IN 1..5 LOOP
v.EXTEND();  --扩张上限
SELECT employee_name INTO v(I) FROM dmhr.employee
WHERE employee_id=1000+i;
END LOOP;
PRINT ' v.COUNT()='||v.COUNT();
FOR I IN 1..v.COUNT() LOOP
PRINT'v('||i||')='||v(i);
END LOOP;
END;

输出结果

需要注意的是,varray在使用时一定要利用extend来扩张上限,不然会有收集下标越界的报错。

三、嵌套表

嵌套表和varray类型用法类似,主要区别在于嵌套表在使用时不用指定元素上限。

这里我们采用结合游标制造一个比较复杂的例子,我们先采用一个游标ename_cursor来存储job_id为21的员工姓名信息,然后通过遍历游标把对应的员工姓名存储到嵌套表中,相关代码如下:

DECLARE
--下面这句是嵌套表的声明,可以看到这里并不用指定元素上限
TYPE ename_array_type is table of dmhr.employee.employee_name%TYPE;
--定义一个游标
CURSOR ename_cursor is select employee_name from dmhr.employee where job_id=21;
--初始化嵌套表,此时嵌套表为空
ename_arrayename_array_type:=ename_array_type(); --初始化嵌套表
i number:=0;
BEGIN
for ename in ename_cursor
loop
i:=i+1;
--执行extend函数,为数组增加一个null元素
ename_array.EXTEND;
ename_array(i):=ename.employee_name;
print(ename.employee_name);
end loop;
--注意嵌套表下标是从1开始的,而不是0
for j in 1..ename_array.count()loop
print(ename_array(j));
end loop;
END;
/

 执行结果如下,注意,图没有截全。

数组类型

前文所述的三种集合类型用法跟oracle较类似,除此之外,在DM PL/SQL中,我们也可以使用直接声明的方式来使用数组类型,也就是array类型。跟大多数编程语言类型,DM PL/SQL中的数组类型可以使用静态或动态的方式定义,具体演示如下。

静态数组:

DECLARE
--TYPE 定义一维数组类型
TYPE Arr IS ARRAY VARCHAR[3];
a Arr;
BEGIN
FOR I IN1..3 LOOP
a[I] :=I*10;
PRINT a[I];
END LOOP;
END;
/

动态数组:

DECLARE
TYPE Arr IS ARRAY VARCHAR[];
a Arr;
BEGIN
a := NEW VARCHAR[4];--动态分配空间
FOR I IN 1..4 LOOP
a[I] :=I*4;
PRINT a[I];
END LOOP;
END;
/

猜你喜欢

转载自blog.csdn.net/qq_35273918/article/details/129820998
今日推荐