1、集合概述。
1)、集合概念和术语:
元素和索引值:集合是由若干个元素组成,集合中的元素有时候会称之为“行”,所以对应的索引值称为“行号”;
集合类型:分为三种,关联数组、嵌套表、Varray。
集合或集合实例:术语“集合”可能代表一个关联数组、嵌套表或者varray类型的PL/SQL变量,或者代表一个嵌套表或Varray类型的数据列。
集合实例就是一个特定集合的实例。
同质元素:集合中的所有元素都是相同类型的,所以称为同质的。集合中的元素类型可以是复合或者复杂的数据类型,也可以是一个集合。
一维或者单维:一个集合中的每一行总是只有一列,类似于一维数组。
无界对有界:集合中的行数有没有限制,有限制的叫有界,无限制的就叫无界。
稀疏和紧凑:一个集合从第一行到最后一行的所有行都被定义并且赋值(包括Null值),这个集合就叫做紧凑的,否则就叫做稀疏的,稀疏的定义的行之间存在间隙。
用整数索引:所有集合类型都提供了通过行号引用记录的能力,这个行号就是一个整型数据值,整数索引。
用字符串索引:oracle 9i R2版本以后,可以使用字符串值(最长可以为32K)作为关联数组的索引值,不过嵌套表和Varray类型不支持这个特性。
外部表:有嵌套表类型或者Varray类型的列的表,称为外部表。
内部表:内部表的用作表的列的内嵌的集合类型,也可以叫做表的嵌套列。
存储表:是Oracle 创建的用来装载内部表(一个嵌套表的类型的列)的物理表。
2)、集合类型:
关联数组:一个只能在PL/SQL环境中使用的,一维的、没有边界的、稀疏的、由同质元素构成的集合类型。
嵌套表:是一个一维的、没有边界的、由同质元素组成的集合类型。可以同时应用于PL/SQL和数据库定义(如表的一列定义成嵌套表类型),嵌套表是多重集合的,里面的元素没有固定的顺序。
VARRAY:可变长度的数组,也是一维的、由同质元素组成的集合类型。有边界并且非稀疏的,可以应用于PL/SQL和数据库定义,不过里面的元素是固定顺序的。
3)、集合示例:
关联数组:
Declare
Type list_of_name_t IS TABLE of person.first_name%TYPE
Index by PLS_INTERGER ---定义关联数组list_of_name_t
happyfamily list_of_name_t;//声明一个list_of_name_t关联数组的变量
l_row PLS_Interger;
Begin
happlyfamily(23423432):='Eli'; --给happyfamily数组变量赋值,里面的索引号可以是任意数,也可以为负数,
happlyfamily(-2349):='Steven'; --- 不过不建议这么乱写索引值,看起来很乱的。
happlyfamily(22):='veva';
l_row:=happlyfamily.FIRST; --上面赋值的结果,索引值最小的在最前面,也就是happyfamily.First 为‘Steven’值。
While (l_row is not null)
loop
DBMS_OUTPUT.put_line(happlfamily(l_row));
l_row:=happlyfamily.next(l_row);---next方法读取下一个有数据的行,跳过没有数据的空隙。
End loop;
End;
使用嵌套表:
Create type list_of_names_t is Table of varchar2(100); ----创建嵌套表类型
Declare
happyfamily list_of_names_t :=list_of_name_t(); ---声明三个list_of_name_t变量,调用嵌套类型构造函数进行初始化,嵌套表使用之前必须初始化。
children list_of_names_t :=list_of_name_t();
parents list_of_names_t :=list_of_name_t();
Begin
happyfamily.Extend(4);--- Extend方法为嵌套表准备空间了,在向嵌套表放入一行数据之前,必须显示的请求一行数据
happyfamily(1):='Eli';
happyfamily(2):='Steven';
happyfamily(3):='Chris';
happyfamily(4):='Veva';
children.Extend; --每次扩展空间一个
children(1):='Chris';
child.Extend;
children(2):='Eli';
parents:=happyfamily Multiset except children; ---happyfamily集合排除child集合,剩下的就是parents集合。
For l_row in parents.first .. parents.last
loop
DBMS_Ountput.put_line(parents(l_row));
End loop;
End;
使用VARRAY:
Create type first_names_t Is Varray(2) of Varchar2(100);----创建Varray的类型,必须指定Varray集合的最大长度(这里最大长度为2)
Create type children_names_t Is Varray(1) of Varchar2(100);
Create table family(surname varchar2(1000),parent_names first_names_t,children_names children_names_t);--创建一张包含Varray类型的列的表
Declare
parents first_names_t :=first_names_t(); ---声明变量,和嵌套表一样,必须初始化
children children_names_t:=children_names_t();
Begin
parents.Extend(2);----申请空间
parents(1):='Samuel';
parents(2):='Charina';
--
children.extend;
children(1):='Feather';
Insert into family(suiname,parent_name,children_name) values('',parents,children)
End;
4)、使用集合的场合:
在记录中使用结合,记录的组成元素的类型可以是关联数组、嵌套表和Varray类型的集合,和其他类型一样处理。
用作程序参数的集合:当做函数或过程的参数。
集合用作函数返回值的数据类型:函数返回值可以是一个集合。
作为数据库表“列”的集合:嵌套表和Varray可以为数据库列的类型,看上去就像一行数据对应某列多行数据的。
用作对象类型的属性的集合:对象的可以具有集合类型的属性。
5)、选择使用什么类型的集合:
| 属性 | 关联数组 | 嵌套表 | VARRAY |
| 维度 | 一维 | 一维 | 一维 |
| 是否可用于SQL | 不可用 | 可用 | 可用 |
| 是否可作为表的类型 | 不可用 |
可用,数据是在行外 保存(一个单独的表) |
可用,数据保存在行内 (在同一表中) |
| 未初始化的状态 | 空(不能是Null);元素未定义 |
自动就是null,对元素的引用是非法的。 |
自动就是null,对元素的引用是非法的。 |
| 初始化 | 在声明时自动完成 | 通过构造函数,或者赋值,或者Fetch操作完成 | 通过构造函数,或者赋值,或者Fetch操作完成 |
| 是否稀疏 | 是 | 开始不是,后来删除了就是了 | 不是 |
| 是否有界 | 无界 | 可以扩展 | 有界 |
| 可以随时对任意元素赋值 | 可以 | 不可以,可以需要先Extend进行扩展 | 不可以,可以需要先Extend进行扩展,而且Extend扩展不能超过上边界 |
| 扩展方法 | 给一个新下标指向的元素赋值 | 使用内置的Extend过程,无最大值限制 |
使用内置的Extend过程,有最大值限制 |
| 可以比较相等与否 | 不可以 | 可以,orcacle 10g或以后的版本 | 不可以 |
| 是否可以通过集合操作符进行操作 | 不可以 | 可以,oracle 10或以后的版本 | 不可以 |
| 存取数据时是否保留顺序或者下标 | N/A | 不保留 | 保留 |
浙公网安备 33010602011771号