lightdb plorasql集合类型新增可变数组

文章目录

背景

在信创适配中,从Oracle迁移过来的存储过程使用到可变数组。因此在LightDB-X 23.4版本中对现有的集合类型进行了增强,添加了可变数组类型。

集合类型

在LightDB-X 23.4版本开始plorasql支持的集合类型同Oracle一致,覆盖了关联数组,可变数组和嵌套表三种类型,支持的方法如下

  • DELETE 从集合中删除元素。
  • EXTEND 将元素添加到集合的末尾。
  • EXISTS 如果集合的指定元素存在,则返回TRUE。
  • FIRST 返回集合中的第一个索引。
  • LAST 返回集合中的最后一个索引。
  • COUNT 返回集合中的元素数量。

可变数组

可变大小数组是一个数组,其元素数量可以从零(空)到声明的最大大小不等,在这里超过也支持。

要访问可变数组的元素,使用语法variable_name(index)。在数据库中存储和检索可变数组时,其索引和元素顺序将保持稳定。

随着您添加或删除元素,可变数组变量占用的内存量可以动态增加或减少。

目前只支持本地类型的可变数组,不支持全局可变数组。

可变数组示例

准备数据

复制代码
select dbms_output.serveroutput(true);
create table user_info(id int, name varchar(30));
insert into user_info values( 11, 'zhangsan');
insert into user_info values( 21, 'lisi');
insert into user_info values( 31, 'wangwu');

匿名块

复制代码
declare
    type id_array is varray(10) of INTEGER;
    ids id_array := id_array(11, 21);
    v_name varchar2(30);
begin
    if ids.exists(3) then
        dbms_output.put_line('ids(3) exists.');
    else
        dbms_output.put_line('ids(3) not exists.');
    end if;
    
    ids.extend;
    ids(ids.count) := 31;
    
    if ids.exists(3) then
        dbms_output.put_line('ids(3) exists.');
    else
        dbms_output.put_line('ids(3) not exists.');
    end if;
    
    dbms_output.put_line('count=' || ids.count);
    
    for i in ids.first .. ids.last loop
        select name into v_name from user_info where id = ids(i);
        dbms_output.put_line('ids(' || i || ') name is ' || v_name);
    end loop;

    ids.delete;
    dbms_output.put_line('after is.delete, count=' || ids.count);
end;
/

ids(3) not exists.
ids(3) exists.
count=3
ids(1) name is zhangsan
ids(2) name is lisi
ids(3) name is wangwu
after is.delete, count=0
DO

函数

复制代码
create or replace function f_varray() return int is
    type id_array is varray(10) of INTEGER;
    ids id_array := id_array(11, 21);
    v_name varchar2(30);
begin
    if ids.exists(3) then
        dbms_output.put_line('ids(3) exists.');
    else
        dbms_output.put_line('ids(3) not exists.');
    end if;
    
    ids.extend;
    ids(ids.count) := 31;
    
    if ids.exists(3) then
        dbms_output.put_line('ids(3) exists.');
    else
        dbms_output.put_line('ids(3) not exists.');
    end if;
    
    dbms_output.put_line('count=' || ids.count);
    
    for i in ids.first .. ids.last loop
        select name into v_name from user_info where id = ids(i);
        dbms_output.put_line('ids(' || i || ') name is ' || v_name);
    end loop;

    ids.delete;
    dbms_output.put_line('after is.delete, count=' || ids.count);
    return ids.count;
end;
/

select f_varray();

ids(3) not exists.
ids(3) exists.
count=3
ids(1) name is zhangsan
ids(2) name is lisi
ids(3) name is wangwu
after is.delete, count=0
 f_varray 
----------
        0
(1 row)

存储过程

复制代码
create or replace procedure p_varray() is
    type id_array is varray(10) of INTEGER;
    ids id_array := id_array(11, 21);
    v_name varchar2(30);
begin
    if ids.exists(3) then
        dbms_output.put_line('ids(3) exists.');
    else
        dbms_output.put_line('ids(3) not exists.');
    end if;
    
    ids.extend;
    ids(ids.count) := 31;
    
    if ids.exists(3) then
        dbms_output.put_line('ids(3) exists.');
    else
        dbms_output.put_line('ids(3) not exists.');
    end if;
    
    dbms_output.put_line('count=' || ids.count);
    
    for i in ids.first .. ids.last loop
        select name into v_name from user_info where id = ids(i);
        dbms_output.put_line('ids(' || i || ') name is ' || v_name);
    end loop;

    ids.delete;
    dbms_output.put_line('after is.delete, count=' || ids.count);
end;
/

call p_varray();

ids(3) not exists.
ids(3) exists.
count=3
ids(1) name is zhangsan
ids(2) name is lisi
ids(3) name is wangwu
after is.delete, count=0
CALL
相关推荐
晋阳十二夜5 小时前
【压力测试之_Jmeter链接Oracle数据库链接】
数据库·oracle·压力测试
GDAL6 小时前
Node.js v22.5+ 官方 SQLite 模块全解析:从入门到实战
数据库·sqlite·node.js
DCTANT7 小时前
【原创】国产化适配-全量迁移MySQL数据到OpenGauss数据库
java·数据库·spring boot·mysql·opengauss
AI、少年郎9 小时前
Oracle 进阶语法实战:从多维分析到数据清洗的深度应用(第四课)
数据库·oracle
赤橙红的黄9 小时前
自定义线程池-实现任务0丢失的处理策略
数据库·spring
DataGear10 小时前
如何在DataGear 5.4.1 中快速制作SQL服务端分页的数据表格看板
javascript·数据库·sql·信息可视化·数据分析·echarts·数据可视化
weixin_4383354010 小时前
分布式锁实现方式:基于Redis的分布式锁实现(Spring Boot + Redis)
数据库·redis·分布式
码不停蹄的玄黓10 小时前
MySQL Undo Log 深度解析:事务回滚与MVCC的核心功臣
数据库·mysql·undo log·回滚日志
Qdgr_10 小时前
价值实证:数字化转型标杆案例深度解析
大数据·数据库·人工智能
数据狐(DataFox)11 小时前
SQL参数化查询:防注入与计划缓存的双重优势
数据库·sql·缓存