多级集合
多级集合是指嵌套了集合类型的集合类型。从Oracle9i开始,允许集合类型嵌套另一种集合类型,从而在PL/SQL中实现了多维数组。DECLARE --定义一维VARRAY TYPE a1_varray_type IS VARRAY(10) OF INT; --定义二维VARRAY集合 TYPE na1_varray_type IS VARRAY(10) OF a1_varray_type; --初始化二维集合变量 nv1 na1_varray_type := na1_varray_type( a1_varray_type(58,100,102), a1_varray_type(55,6,73), a1_varray_type(2,4) ); BEGIN dbms_output.put_line(‘显示二维数组所有元素‘); FOR i IN 1..nv1.count LOOP FOR j IN 1..nv1(i).count LOOP dbms_output.put_line(‘nv1(‘ || i || ‘,‘ || j || ‘)=‘ || nv1(i)(j)); END LOOP; END LOOP; END;示例二:在PL/SQL块中使用多级嵌套表
DECLARE --定义一维嵌套表 TYPE a1_table_type IS TABLE OF INT; --定义二维嵌套表 TYPE na1_table_type IS TABLE OF a1_table_type; --初始化二维集合变量 nv1 na1_table_type := na1_table_type( a1_table_type(2,4), a1_table_type(5,73) ); BEGIN dbms_output.put_line(‘显示二维数组所有元素:‘); FOR i IN 1..nv1.count LOOP FOR j IN 1..nv1(i).count LOOP dbms_output.put_line(‘nv1(‘ || i || ‘,‘ || j || ‘)=‘ || nv1(i)(j)); END LOOP; END LOOP; END;
示例三:在PL/SQL块中使用多级索引表
在PL/SQL块中实现类似于多维数组的功能时,如果多维数组的元素个数没有限制,那么不仅可以使用多级嵌套表实现,也可以使用多级索引表实现。
DECLARE --定义一维table TYPE a1_table_type IS TABLE OF INT INDEX BY BINARY_INTEGER; --定义二维table集合 TYPE na1_table_type IS TABLE OF a1_table_type INDEX BY BINARY_INTEGER; nv1 na1_table_type; BEGIN --初始化二维table集合 nv1(1)(1) := 10; nv1(1)(2) := 5; nv1(2)(1) := 100; nv1(2)(2) := 50; --循环输出 dbms_output.put_line(‘显示二维数组所有元素‘); FOR i IN 1..nv1.count LOOP FOR j IN 1..nv1(i).count LOOP dbms_output.put_line(‘nv1(‘ || i || ‘,‘ || j || ‘)=‘ || nv1(i)(j)); END LOOP; END LOOP; END;
集合方法
集合方法是Oracle所提供的用于操纵集合变量的内置函数或过程,其中EXISTS,COUNT,LIMIT,FIRST,NEXT,PRIOR和NEXT是函数,而EXTEND,TRIM和DELETE则是过程。集合方法的调用语法如下:
collection_name.method_name[(parameters)]注意,集合方法只能在PL/SQL语句中使用,而不能在SQL语句中调用。另外集合方法EXTEND和TRIM只适用于嵌套表和VARRAY,而不适用于索引表。DELETE该过程只适用于嵌套表和索引表,而不适用于VARRAY。
1、EXISTS
该方法用于确定集合元素是否存在,如果集合元素存在,则返回TRUE;如果集合元素不存在,则返回FALSE。
DECLARE TYPE ename_table_type IS TABLE OF emp.ename%TYPE; ename_table ename_table_type; BEGIN IF ename_table.EXISTS(1) THEN ename_table(1) := ‘SCOTT‘; ELSE dbms_output.put_line(‘必须初始化集合元素‘); END IF; END;2、COUNT
该集合方法用于返回当前集合变量中的元素总个数。如果集合元素存在数值,则统计结果会包含该元素;如果集合元素为NULL,则统计结果不会包含该元素。
DECLARE TYPE ename_table_type IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER; ename_table ename_table_type; BEGIN --只有索引表才不必集合初始化 ename_table(-5) := ‘张三‘; ename_table(1) := ‘李四‘; ename_table(5) := ‘王五‘; ename_table(10) := ‘赵六‘; dbms_output.put_line(‘集合元素总个数:‘ || ename_table.COUNT); END;3、LIMIT
该方法用于返回集合元素的最大个数。因为嵌套表和索引表的元素个数没有限制,所以调用该方法会返回NULL;而对于VARRAY来说,该方法会返回VARRAY所允许的最大元素个数。
DECLARE TYPE ename_table_type IS VARRAY(20) OF emp.ename%TYPE; ename_table ename_table_type := ename_table_type(‘marray‘); BEGIN dbms_output.put_line(‘集合元素中的最大个数:‘ || ename_table.LIMIT); END;4、FIRST和LAST
FIRST方法用于返回集合变量第一个元素的下标,而LAST方法则用于返回集合变量最后一个元素的下标。 DECLARE TYPE ename_table_type IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER; ename_table ename_table_type; BEGIN ename_table(-5) := ‘张三‘; ename_table(1) := ‘李四‘; ename_table(5) := ‘王五‘; ename_table(10) := ‘赵六‘; dbms_output.put_line(‘第一个元素下标:‘ || ename_table.FIRST); dbms_output.put_line(‘第一个元素:‘ || ename_table(ename_table.FIRST)); dbms_output.put_line(‘最后一个元素下标:‘ || ename_table.LAST); dbms_output.put_Line(‘最后一个元素:‘ || ename_table(ename_table.LAST)); END;5、PRIOR和NEXT
PRIOR方法用于返回当前集合元素的前一个元素的下标,而NEXT方法则用于返回当前集合元素的后一个元素的下标。 DECLARE TYPE ename_table_type IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER; ename_table ename_table_type; BEGIN ename_table(-5) := ‘张三‘; ename_table(1) := ‘李四‘; ename_table(5) := ‘王五‘; ename_table(10) := ‘赵六‘; dbms_output.put_line(‘元素下标5的前一个元素下标:‘ || ename_table.PRIOR(5)); dbms_output.put_line(‘元素下标5的前一个元素:‘ || ename_table(ename_table.PRIOR(5))); dbms_output.put_line(‘元素下标5的后一个元素下标:‘ || ename_table.NEXT(5)); dbms_output.put_line(‘元素下标5的后一个元素:‘ || ename_table(ename_table.NEXT(5))); END;6、EXTEND
该方法用于扩展集合变量的尺寸,并为它们增加元素。注意,该方法只适用于嵌套表和VARRAY。该方法有EXTEND,EXTEND(n),EXTEND(n,i)等三种调用格式,其中EXTEND用于为集合变量添加一个null元素,EXTEND(n)用于为集合变量添加n个null元素,而EXTEND(n,i)则用于为集合变量添加n个元素(元素值与第i个元素相同)。
DECLARE TYPE ename_table_type IS VARRAY(20) OF VARCHAR2(20); ename_table ename_table_type; BEGIN ename_table := ename_table_type(‘mary‘); ename_table.EXTEND(5,1); dbms_output.put_line(‘元素总个数:‘ || ename_table.COUNT); dbms_output.put_line(‘元素输出:‘); FOR i IN 1..ename_table.COUNT LOOP dbms_output.put_line(‘ename_table(‘ || i || ‘)=‘ || ename_table(i)); END LOOP; END;7、TRIM
该方法用于从集合尾部删除元素,它有TRIM和TRIM(n)两种调用格式。其中TRIM用于从集合尾部删除一个元素;而TRIM(n)则用于从集合尾部删除n个元素。注意,该方法只适用于嵌套表和VARRAY。
DECLARE TYPE ename_table_type IS VARRAY(20) OF VARCHAR2(20); ename_table ename_table_type; BEGIN ename_table := ename_table_type(‘A‘,‘A‘,‘A‘,‘A‘,‘A‘); ename_table.TRIM(2); dbms_output.put_line(‘元素总个数:‘ || ename_table.COUNT); END;8、DELETE
该方法用于删除集合元素,但该方法只适用于嵌套表和索引表,而不适用于VARRAY。该方法有DELETE,DELETE(n),DELETE(m,n)等三种调用格式。其中DELETE用于删除集合变量的所有元素;DELETE(n)用于删除集合变量的第n个元素;而DELETE(m,n)则用于删除集合变量中从m到n之间的所有元素。
DECLARE TYPE ename_table_type IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER; ename_table ename_table_type; BEGIN ename_table(-5) := ‘张三‘; ename_table(1) := ‘李四‘; ename_table(5) := ‘王五‘; ename_table(10) := ‘赵六‘; ename_table.DELETE(5); dbms_output.put_line(‘元素总个数:‘ || ename_table.COUNT); END;