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

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;
/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
达梦数据库,可以使用GROUP BY子句来实现类似于MySQL的Group_Concat(expr)函数的功能。GROUP BY子句用于根据指定的列对结果进行分组,并且可以结合聚合函数来对每个分组进行计算。在达梦数据库,可以使用GROUP BY子句和GROUP_CONCAT函数来实现类似的功能。GROUP_CONCAT函数用于将每个分组的多个值合并为一个字符串,并且可以使用特定的分隔符进行分隔。 例如,以下是在达梦数据库使用GROUP BY和GROUP_CONCAT函数将多个值合并为一个字符串的示例: SELECT column1, GROUP_CONCAT(column2 SEPARATOR ',') FROM table GROUP BY column1; 这个查询将根据column1列对表的数据进行分组,并将每个分组的column2列的多个值合并为一个字符串,使用逗号作为分隔符。 需要注意的是,在达梦数据库,语法和函数名称可能会有所不同,因此具体的语法和函数名称可能需要根据实际情况进行调整。可以参考达梦数据库的官方文档或咨询相关支持来获取更详细的信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [达梦数据库迁移之group by 替换](https://blog.csdn.net/weixin_44907192/article/details/123328932)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [达梦数据库的GROUP BY语句](https://blog.csdn.net/Oraclesand/article/details/126870609)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

保定公民

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值