Halo Tech

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

Image
Image
关联数组是一种将唯一键与值相关联的集合。键不必是数字,也可以是字符数据。本文将简单展示一下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;/

Image

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

Image

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

Image

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

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

Image

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

Image

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

Image

三、综合演示
接下来让我们结合上面的内容,简单的组合一下,写一丢丢简单的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;/

运行结果如下

Image

好了,至此关于Halo数据库关联数组的功能就简单演示完毕了,如文中存在问题,欢迎指正,非常感谢!

end

Image

微信号|Halo Tech