一、语法定义
TYPE assoctype IS TABLE OF { datatype | rectype | objtype }
INDEX BY { BINARY_INTEGER | PLS_INTEGER | VARCHAR2(n) };
assoctype是分配给数组类型的标识符,后续根据此标识符创建关联数组变量。
datatype是标量数据类型,例如VARCHAR2或NUMBER。
rectype是先前定义的记录类型。
objtype 是先前定义的对象类型。n是字符键的最大长度。
二、相关方法演示
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
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;
/
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;
/
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;
/
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;
/
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;
/
三、综合演示
-- 创建一个复合类型
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;
/
运行结果如下





