暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Halo数据库关联数组功能演示

贾桂权 2024-09-18
83
关联数组是一种将唯一键与值相关联的集合。键不必是数字,也可以是字符数据。本文将简单展示一下Halo数据库中新增的关联数组相关功能。

一、语法定义

    如果指定了INDEXBY BINARY_INTEGER或PLS_INTEGER,则键可以是任何负整数、正整数或零。如果指定了INDEXBY VARCHAR2,则键可以是字符数据。

TYPE assoctype IS TABLE OF { datatype | rectype | objtype }
INDEX BY { BINARY_INTEGER | PLS_INTEGER | VARCHAR2(n) };

    assoctype是分配给数组类型的标识符,后续根据此标识符创建关联数组变量。
    datatype是标量数据类型,例如VARCHAR2或NUMBER。
    rectype是先前定义的记录类型。
    objtype 是先前定义的对象类型。n是字符键的最大长度。


二、相关方法演示

2.1、FIRST

    FIRST是一个返回集合中第一个元素的下标的方法。

DECLARE
TYPE arr_typ IS TABLE OF integer INDEX BY varchar2(50);
arr arr_typ;
BEGIN
arr('arr1') := -100;
arr('arr2') := -10;
arr('arr3') := 0;
arr('arr4') := 10;
arr('arr5') := 100;
DBMS_OUTPUT.PUT_LINE('FIRST element: ' || arr.FIRST);
END;
/


2.2、LAST

    LAST是一个返回集合中最后一个元素的下标的方法。

DECLARE
TYPE arr_typ IS TABLE OF integer INDEX BY varchar2(50);
arr arr_typ;
BEGIN
arr('arr1') := -100;
arr('arr2') := -10;
arr('arr3') := 0;
arr('arr4') := 10;
arr('arr5') := 100;
DBMS_OUTPUT.PUT_LINE('LAST element: ' || arr.LAST);
END;
/


2.3、COUNT
    COUNT是一种返回集合中元素数量的方法。

DECLARE
TYPE arr_typ IS TABLE OF integer INDEX BY varchar2(50);
arr arr_typ;
BEGIN
arr('arr1') := -100;
arr('arr2') := -10;
arr('arr3') := 0;
arr('arr4') := 10;
arr('arr5') := 100;
DBMS_OUTPUT.PUT_LINE('COUNT: ' || arr.COUNT);
END;
/


2.4、NEXT

    NEXT是一个返回指定下标后面的下标的方法。

DECLARE
TYPE arr_typ IS TABLE OF integer INDEX BY varchar2(50);
arr arr_typ;
BEGIN
arr('arr1') := -100;
arr('arr2') := -10;
arr('arr3') := 0;
arr('arr4') := 10;
arr('arr5') := 100;
DBMS_OUTPUT.PUT_LINE('NEXT element: ' || arr.next('arr4'));
END;
/


2.5、PRIOR
    PRIOR方法返回集合中指定下标前面的下标。

DECLARE
TYPE arr_typ IS TABLE OF integer INDEX BY varchar2(50);
arr arr_typ;
BEGIN
arr('arr1') := -100;
arr('arr2') := -10;
arr('arr3') := 0;
arr('arr4') := 10;
arr('arr5') := 100;
DBMS_OUTPUT.PUT_LINE('PRIOR element: ' || arr.PRIOR('arr2'));
END;
/


2.6、EXISTS
    EXISTS方法验证集合中是否存在下标。如果存在下标,则EXISTS返回TRUE;如果不存在下标,则EXISTS返回FALSE。

DECLARE
TYPE arr_typ IS TABLE OF integer INDEX BY varchar2(50);
arr arr_typ;
BEGIN
arr('arr1') := -100;
arr('arr2') := -10;
arr('arr3') := 0;
arr('arr4') := 10;
arr('arr5') := 100;
DBMS_OUTPUT.PUT_LINE('The index exists: ' ||
CASE WHEN arr.exists('arr5') = TRUE THEN 'true' ELSE 'false' END || ' arr5');
DBMS_OUTPUT.PUT_LINE('The index exists: ' ||
CASE WHEN arr.exists('arr6') = TRUE THEN 'true' ELSE 'false' END || ' arr6');
END;
/


2.7 DELETE
    DELETE 方法删除集合中的条目。此处演示删除指定位置数组元素。

DECLARE
TYPE arr_typ IS TABLE OF integer INDEX BY varchar2(50);
arr arr_typ;
BEGIN
arr('arr1') := -100;
arr('arr2') := -10;
arr('arr3') := 0;
arr('arr4') := 10;
arr('arr5') := 100;
DBMS_OUTPUT.PUT_LINE('COUNT: ' || arr.count);
DBMS_OUTPUT.PUT_LINE('The index exists: ' ||
CASE WHEN arr.exists('arr3') = TRUE THEN 'true' ELSE 'false' END || ' arr3');
arr.delete('arr3');
DBMS_OUTPUT.PUT_LINE('The index exists: ' ||
CASE WHEN arr.exists('arr3') = TRUE THEN 'true' ELSE 'false' END || ' arr3');
DBMS_OUTPUT.PUT_LINE('COUNT: ' || arr.count);
END;
/


三、综合演示

    接下来让我们结合上面的内容,简单的组合一下,写一丢丢简单的sql测试看看。

-- 创建一个复合类型
create type ob_type_test as object (col_a varchar2(50),col_b varchar2(50),col_c varchar2(50));

declare
TYPE arr_typ IS TABLE OF ob_type_test INDEX BY varchar2(50);
TYPE arr_typ2 IS TABLE OF integer INDEX BY PLS_INTEGER;
arr arr_typ;
var_a ob_type_test;
var_b varchar(50);
begin
-- 复合类型遍历赋值
var_a.col_a := 'a';
var_a.col_b := 'b';
var_a.col_c := 'c';

-- 让我们来简单构造一下关联数组数据
-- 起始下标为 arr1
for i in 1 .. 5 loop
-- 往关联数组填充数据
arr('arr'||i) := var_a;
-- 更新一下var_a数据 每次附加个'x'
var_a.col_a := var_a.col_a||'x';
var_a.col_b := var_a.col_b||'x';
var_a.col_c := var_a.col_c||'x';
end loop;

raise notice '----------------------------';
-- 接下来简单正序遍历看看数据
var_b := arr.first;

while var_b is not null loop
-- 打印当前数组元素的相关数据
-- 此处打印采用的是PG的方式 如需在Oracle运行 可以使用下面语句
-- DBMS_OUTPUT.PUT_LINE(var_b ||' '|| arr(var_b).col_a ||' '|| arr(var_b).col_b ||' '|| arr(var_b).col_c);
raise notice '% % % %', var_b, arr(var_b).col_a, arr(var_b).col_b, arr(var_b).col_c;
-- 获取下一个数组元素
var_b := arr.next(var_b);
end loop;

raise notice '----------------------------';
-- 逆序遍历
var_b := arr.last;

while var_b is not null loop
-- 打印当前数组元素的相关数据
raise notice '% % % %', var_b, arr(var_b).col_a, arr(var_b).col_b, arr(var_b).col_c;
-- 获取上一个数组元素
var_b := arr.prior(var_b);
end loop;

raise notice '----------------------------';
-- 打印一下当前数组元素数量
raise notice 'count: %', arr.count;

-- 删除元素arr3
arr.delete('arr3');

-- 在此打印数组数量
raise notice 'count2: %', arr.count;

raise notice '----------------------------';
-- 从arr0 到 arr8 判断元素是否存在
for i in 0 .. 8 loop
if arr.exists('arr'|| i) then
raise notice '% exists', 'arr'||i;
else
raise notice '% is not exists', 'arr'||i;
end if;
end loop;
raise notice '----------------------------';

-- 清空数组
arr.delete;
-- 打印数组元素数量
raise notice 'count3: %',arr.count;
raise notice '----------------------------';
end;
/


    运行结果如下

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论