Halo数据库关联数组功能演示
TYPE assoctype IS TABLE OF { datatype | rectype | objtype }INDEX BY { BINARY_INTEGER | PLS_INTEGER | VARCHAR2(n) };
FIRST是一个返回集合中第一个元素的下标的方法。
DECLARETYPE arr_typ IS TABLE OF integer INDEX BY varchar2(50);arr arr_typ;BEGINarr('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
DECLARETYPE arr_typ IS TABLE OF integer INDEX BY varchar2(50);arr arr_typ;BEGINarr('arr1') := -100;arr('arr2') := -10;arr('arr3') := 0;arr('arr4') := 10;arr('arr5') := 100;DBMS_OUTPUT.PUT_LINE('LAST element: ' || arr.LAST);END;/
DECLARETYPE arr_typ IS TABLE OF integer INDEX BY varchar2(50);arr arr_typ;BEGINarr('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是一个返回指定下标后面的下标的方法。
DECLARETYPE arr_typ IS TABLE OF integer INDEX BY varchar2(50);arr arr_typ;BEGINarr('arr1') := -100;arr('arr2') := -10;arr('arr3') := 0;arr('arr4') := 10;arr('arr5') := 100;DBMS_OUTPUT.PUT_LINE('NEXT element: ' || arr.next('arr4'));END;/
DECLARETYPE arr_typ IS TABLE OF integer INDEX BY varchar2(50);arr arr_typ;BEGINarr('arr1') := -100;arr('arr2') := -10;arr('arr3') := 0;arr('arr4') := 10;arr('arr5') := 100;DBMS_OUTPUT.PUT_LINE('PRIOR element: ' || arr.PRIOR('arr2'));END;/
DECLARETYPE arr_typ IS TABLE OF integer INDEX BY varchar2(50);arr arr_typ;BEGINarr('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;/
DECLARETYPE arr_typ IS TABLE OF integer INDEX BY varchar2(50);arr arr_typ;BEGINarr('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;/
-- 创建一个复合类型create type ob_type_test as object (col_a varchar2(50),col_b varchar2(50),col_c varchar2(50));declareTYPE 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';-- 让我们来简单构造一下关联数组数据-- 起始下标为 arr1for 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;-- 删除元素arr3arr.delete('arr3');-- 在此打印数组数量raise notice 'count2: %', arr.count;raise notice '----------------------------';-- 从arr0 到 arr8 判断元素是否存在for i in 0 .. 8 loopif arr.exists('arr'|| i) thenraise notice '% exists', 'arr'||i;elseraise notice '% is not exists', 'arr'||i;end if;end loop;raise notice '----------------------------';-- 清空数组arr.delete;-- 打印数组元素数量raise notice 'count3: %',arr.count;raise notice '----------------------------';end;/
运行结果如下
end
微信号|Halo Tech