欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PL/SQL集合(table)嵌套表操作实例

程序员文章站 2022-07-05 22:58:47
集合是一个有序组具有相同的数据类型的元素。每个元素进行标识的唯一标表示其在集合中的位置。 PL/SQL提供了三种集合类型:索引表或关联数组、嵌套表、可变大小的数组或变长数组 O...

集合是一个有序组具有相同的数据类型的元素。每个元素进行标识的唯一标表示其在集合中的位置。

PL/SQL提供了三种集合类型:索引表或关联数组、嵌套表、可变大小的数组或变长数组

Oracle文档提供了每种类型的集合的以下特征:

集合类型 元素数量 下标类型 密集或稀疏 在哪里创建 可以是对象类型属性
关联数组(或索引表) * 字符串或整数 两种都可以 只有在PL/SQL块 No
嵌套表 * 整数 开始密集,可以变得稀疏 无论是在PL/SQL块或模式级别 Yes
可变大小的数组(变长数组) 有界 整数 总是密集 无论是在PL/SQL块或模式级别 Yes

这两种类型的PL/SQL表即,索引表和嵌套表,都具有相同的结构以及行使用下标符号访问。然而,这两种类型的表有不同一个方面:嵌套表可以存储在数据库中的列,但索引表不能。

嵌套表

嵌套表是就像一个一维数组的元素的数量。然而,嵌套表不同于在以下几方面的数组:

数组具有元素的声明的数量,但嵌套表不用声明大小。嵌套表的大小可以动态地增加。

数组总是密集的,也就是说,它总是有连续的下标。嵌套数组初始是致密,但是删除它的元素时就会变成稀疏。

使用以下语法创建一个嵌套表:

TYPE type_name IS TABLE OF element_type [NOT NULL];

table_name type_name;

这个声明是类似声明的索引表中,但没有INDEX BY子句。嵌套表可以被存储在数据库中的列,所以它可用于简化在那里加入一个较大的表中的单个列,使用SQL操作。关联数组不能存储在数据库中。嵌套表的元素也可以是任何数据库表字段%TYPE和任何数据库表或%ROWTYPE。

集合方法

PL/SQL提供,使集合更容易使用内置集合方法。下表列出了这些方法和用途:

S.N. 方法名称及用途
1 EXISTS(n)
返回TRUE,如果一个集合中的第n个元素的存在;否则返回FALSE
2 COUNT
返回集合当前包含的元素数量
3 LIMIT
检查集合的最大尺寸
4 FIRST
返回在使用整数下标集合的第一个(最小的)索引号
5 LAST
返回在使用整数下标集合的最后一个(最大的)索引号
6 PRIOR(n)
返回集合中索引n前面的索引号
7 NEXT(n)
返回索引n的下一个索引号
8 EXTEND
追加1个空元素到集合
9 EXTEND(n)
追加n个空元素到集合
10 EXTEND(n,i)
追加的第i个元素的集合的n个拷贝
11 TRIM
移除集合的末尾一个元素
12 TRIM(n)
移除一个集合末尾的n个元素
13 DELETE
移除一个集合中的所有元素,设置计数为0
14 DELETE(n)
移除关联数组用数字键或嵌套表中的第n个元素。如果关联数组有一个字符串键,对应于该键的值的元素将被删除。如果n为空,DELETE(N)什么都不做
15 DELETE(m,n)
移除关联数组或嵌套表范围m..n所有元素。如果m大于n或如果m大于或n是零,DELETE(M,N)什么也不做

集合异常

下表提供了集合异常和引发,当它们:

集合异常 引发情况
COLLECTION_IS_NULL 尝试在一个原子空(null)的集合操作
NO_DATA_FOUND 下标指定被删除的元素,或关联数组的一个不存在的元素
SUBSCRIPT_BEYOND_COUNT 下标超过了一个集合的元素数
SUBSCRIPT_OUTSIDE_LIMIT 下标超出了允许的范围
VALUE_ERROR 下标为空(null)或不可转换的键类型。如果该键被定义为PLS_INTEGER范围,下标是在该范围之外可能会出现这样的异常

嵌套表操作实例:

-- Created on 2018/4/2 by E.WANG 
/*
集合是一个有序组具有相同的数据类型的元素。
每个元素进行标识的唯一标表示其在集合中的位置。
PL/SQL提供了三种集合类型:索引表或关联数组、嵌套表、可变大小的数组或变长数组。
嵌套表是就像一个一维数组的元素的数量。然而,嵌套表不同于在以下几方面的数组:

数组具有元素的声明的数量,但嵌套表不用声明大小。嵌套表的大小可以动态地增加。
数组总是密集的,也就是说,它总是有连续的下标。嵌套数组初始是致密,但是删除它的元素时就会变成稀疏。
使用以下语法创建一个嵌套表:
TYPE type_name IS TABLE OF element_type [NOT NULL];
table_name type_name;
这个声明是类似声明的索引表中,但没有INDEX BY子句。
*/
declare 
  --创建一个游标
  cursor emp_cursor is  select ename from emp;
  --创建一个嵌套表
  type emp_table is table of emp.ename%type;
  --声明并初始化表
  empTable emp_table:=emp_table();
  --用来保存key
  keyValue integer:=0;
begin
  --打开并获取游标数据
  --数据获取完关闭游标
  for tmp in emp_cursor loop
      --是key值加一
      keyValue:=keyValue+1;
      --EXTEND:追加1个空元素到集合
      empTable.extend;
      --给索引表赋值
      empTable(keyValue):=tmp.ename;
  end loop;

  
  --FIRST:返回在使用整数下标集合的第一个(最小的)索引号
  keyValue := empTable.FIRST;
  --当键不为空时进行下一个循环
  WHILE keyValue IS NOT null LOOP
      dbms_output.put_line
      ('Emp name: ' || TO_CHAR(empTable(keyValue) || ' The emp index: ' || keyValue));
      --返回索引keyValue的下一个索引号
      keyValue := empTable.NEXT(keyValue);
   END LOOP;
  --LAST:返回在使用整数下标集合的最后一个(最大的)索引号
  keyValue:= empTable.LAST;
  
end;

运行结果截图:

PL/SQL集合(table)嵌套表操作实例