集合是PL/SQL提供的用来同时处理多个数据的一种数据结构,如果说记录是一种单行多列的数据结构,那么集合就是一种单行多列的数据结构。
索引表:也成为关联数组,这种类型的集合可以通过数字或字符串作为下表来查找其中的元素,类似于其他语言中的哈希表,索引表是一种仅在PL/SQL中使用的数据结构。
嵌套表:使用有序数字作为嵌套表的下标,可以容纳任意个数的元素。嵌套表与索引表最大的区别在于可以定义嵌套表类型,把嵌套表存储到数据库中,并能同构SQL语句进行操作。
变长数组:在定义时保存固定数量的元素,但可以在运行时改变其容量。变长数组与嵌套表一样,使用有序数字作为瞎掰哦,也可以报讯到数据库中,但是不如嵌套表灵活。
可以看到这3中集合之间最大的区别在于,索引表只能在PL/SQL中使用,如果需要在内存中保存和维护列表,则优先选择索引表,索引表与高级语言中的数组非常相似,但是索引表提供了更加灵活的功能。
如果集合的内功哦人能够还要存储到数据库中,那么可以在嵌套表和变长数组之间进行选择。嵌套表是对索引表的扩充,添加了额外的集合方法扩展了索引表的功能,并且嵌套表也可也存储在数据库表中,直接使用SQL进行操作。
在PL/SQL中,嵌套表和索引表统称为PL/SQL表。
索引表的定义语法如下
TYPE type_name AS TABLE OF element_type[NOT NULL]
INDEX BY [PLS_INTEGER | BINARY_INTEGER | VARCHAR2(size)];
*type_naem:索引表的名称,符合PL/SQL标识符命名规则,最大长度不超过30个字符。
*element_type:是一个PL/SQL预定义的类型,用来表示在索引表中包含的数据类型,可以是任何标量类型
或复合类型,如%TYPE或%ROWTYPE对一个类型的引用,但不能是REF CURSOR类型。
*NOT NULL:这是可选的,默认值为允许NULL,如果指定了该选项,则表示表中的每一行都必须有一个值。
*INDEX BY :用来指定索引表要使用的索引的类型,在Oracle9i之前仅能指定PLS_INTEGER,Oracle9i以后
的版本中,INDEX BY 能指定BINARY_INTEGER及其任何子类型,变长的VARCHAR(size),或者使用%TYPE指向
一个基于VARCHAR2列的表类型。
--雇佣日期索引表集合
TYPE hiredate_idxt IS TABLE OF DATE INDEX BY PLS_INTEGER;
--部门编号集合
TYPE deptno_idxt IS TABLE OF dept.deptno%TYPE NOT NULL
INDEX BY PLS_INTEGER;
--记录类型的索引表,这个结构允许在PL/SQL程序中串接一个本地副本
TYPE emp_idxt IS TABLE OF emp%ROWTYPE INDEX BY NATURAL;
--由部门名称标识的部门记录的集合
TYPE deptname_idxt IS TABLE OF dept%ROWTYPE INDEX BY dept.dname%TYPE;
--定义集合的集合
TYPE private_collection_tt IS TABLE OF deptname_idxt INDEX BY VARCHAR2(100);