一、集合的类型
1.索引表或关联数组(Index-by 表)
索引表是一种无序的集合,其元素通过键(而非连续的整数索引)进行访问。索引表也称为关联数组或哈希表。
2.嵌套表(Nested Table)
嵌套表是一种可以包含重复元素的有序集合,其长度是可变的,且支持在数据库中作为表的列类型存储。
3.可变长数组(VARRAY)
可变长数组是一种具有固定最大长度的有序集合,其元素数量在声明时指定一个上限,但在使用时可以动态增长,直到达到这个上限。
二、创建集合的基本格式
1.索引表
TYPE associative_array_type IS TABLE OF element_type INDEX BY index_type;
associative_array_type
:定义关联数组的类型名。element_type
:指定关联数组元素的数据类型。index_type
:指定关联数组索引的数据类型,通常是整数(如BINARY_INTEGER或PLS_INTEGER)或字符串(如VARCHAR2)。
2.嵌套表
TYPE nested_table_type IS TABLE OF element_type [NOT NULL];
nested_table_type
:定义嵌套表的类型名。element_type
:指定嵌套表元素的数据类型。
3.可变长数组
TYPE varray_type IS VARRAY(size_limit) OF element_type [NOT NULL];
varray_type
:定义可变长数组的类型名。size_limit
:指定可变长数组元素的最大个数。element_type
:指定数组元素的数据类型。
三、基本使用
1.索引表
DECLARE
TYPE string_associative_array IS TABLE OF VARCHAR2(100) INDEX BY PLS_INTEGER;
v_strings string_associative_array;
BEGIN
v_strings(-1) := 'Hello'; -- 通过键赋值
v_strings(3) := 'World';
DBMS_OUTPUT.PUT_LINE(v_strings(-1)); -- 访问并输出元素
DBMS_OUTPUT.PUT_LINE(v_strings(3));
v_strings.DELETE(-1); -- 删除键为1的元素
IF NOT v_strings.EXISTS(-1) THEN
DBMS_OUTPUT.PUT_LINE('Key -1 does not exist.'); -- 检查键是否存在并输出
END IF;
END;
2.嵌套表
DECLARE
TYPE number_nested_table IS TABLE OF NUMBER;
v_numbers number_nested_table := number_nested_table(1, 2, 3); -- 初始化
BEGIN
v_numbers.EXTEND; -- 扩展数组长度
v_numbers(v_numbers.LAST) := 4; -- 添加新元素
FOR i IN v_numbers.FIRST..v_numbers.LAST LOOP
DBMS_OUTPUT.PUT_LINE(v_numbers(i)); -- 访问并输出元素
END LOOP;
END;
3.可变长数组
DECLARE
TYPE name_varray IS VARRAY(10) OF VARCHAR2(50);
v_names name_varray := name_varray(); -- 初始化
BEGIN
v_names.EXTEND; -- 扩展数组长度
v_names(v_names.LAST) := 'Alice'; -- 添加新元素
v_names.EXTEND;
v_names(v_names.LAST) := 'Bob';
v_names.EXTEND; -- 再次扩展数组长度
v_names(v_names.LAST) := 'Charlie'; -- 添加新元素
FOR i IN 1..v_names.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(v_names(i)); -- 访问并输出元素
END LOOP;
END;
四、集合的方法
1.first取集合的第一个元素的下标
2.last取集合的最后一个元素的下标
3.count 取集合的总长度
4.limit 取集合元素下标的最大值 (索引表和嵌套表是不限个数的,所以返回null,变长数组返回定义时的最大索引 )
5.delete([n]) 删除集合中的元素,加n表示下标,删除对应下标的值
6.extend(n[,ind]):扩展集合元素 n是一个数字,表示扩展的元素个数,ind是集合中的一个元素的下标,加上它表示扩展集合时,给扩展的元素加上值,值是ind这个下标对应的元素
7.next(下标)取当前元素下一个元素的下标
8.prior(下标)取当前元素上一个元素的下标
9.exists 检查某个索引是否存在于索引表中
10.trim(数量) 减少集合的大小,移除末尾的一个或多个元素
五、注意事项
1.使用集合之前必须要初始化,对于索引表初始化是自动进行的,但是对于嵌套表和VARRAY就必须使用内建的构造函数。如果重新调用,嵌套表和 VARRAY 自动置 NULL,这不只是元素NULL,而是整个集合置 NULL。给集合内的元素赋值需要使用下标符号。 将一个集合的值赋给另一个集合,只需要简单的使用赋值操作符。
2.集合不能直接用于比较,要比较两个集合,可以设计一个函数,该函数返回一个标量数据类型。
3.使用 EXTEND
方法增加集合容量时,确保不要超过 VARRAY 的最大限制。