当前位置: 代码迷 >> SQL >> PL/SQL_使用复合数据类型三(多级集合)
  详细解决方案

PL/SQL_使用复合数据类型三(多级集合)

热度:16   发布时间:2016-05-05 11:37:24.0
PL/SQL_使用复合数据类型3(多级集合)

多级集合

多级集合是指嵌套了集合类型的集合类型。从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;

  相关解决方案