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;

PL/SQL_使用复合数据类型3(多级集合),布布扣,bubuko.com

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

上一篇:从YH项目看软件开发过程


下一篇:安装 CentOS 时找不到硬盘的解决办法