Q7,从7.3版本之后,oracle的集合数据类型变为三种:Index_by表、嵌套表和Varray。这三种类型的集合相似点为:都是一维的类似数组的结构;都有内建的方法;访问由点分割。同时他们也存在很多差异,包括数据绑定、稀疏性(sparsity)和数据中的存储能力都不同。
l 绑定涉及到集合中元素数量的限制:varray集合中的元素数量是有限的,不能超出其定义时给出的maxsize范围,index_by和嵌套表则是没有限制的。
l 稀疏性描述了集合的下标是否有间隔,index_by表总是稀疏的;嵌套表开始是紧密的,如果有元素删除则变为稀疏表;varray类型的集合则是紧密的,它的下标之间没有间隔。
l Index_by表不能存储在数据库中,但嵌套表和varray则可以被存储在数据库中。
Q8,Index_by表的定义如图所示,其中element_type可以是任何合法的PL/SQL数据类型,包括:PLS/INTEGER、SIGNTYPE和BOOLEAN。这是因为index_by数据类型不能存储在数据库中,所以其元素类型没有限制。
初始化:Index_by类型集合的初始化操作是自动进行的。
type type_name is table of element_type [not null] index by binary_integer;
图3 index_by集合的定义
Q9,嵌套表的定义如图所示,它在定义上跟index_by的区别仅仅在于没有子句index by binary_integer。Element_type可以是一个记录,但这个记录只能使用标量数据类型字段以及能用于数据库的数据类型(不能是PLS_Integer,Boolean或signtype)。嵌套表可以作为列存储在数据库表中,所以集合可以是null,用户可以使用is null操作符检测集合是否为null。存储在一个数据库中的嵌套表并不与表中的其他数据存放在一个数据块中,它们实际上被另外存放在第二个表中。从数据库中取回的嵌套表不保证元素的顺序,并且由于集合数据是离线存储的,对于大型集合嵌套表是一个不错的选择。
初始化:需要使用内建的构造函数对集合进行初始化操作,构造函数和集合的名称相同,同时有一组参数,每个参数对应一个元素,如果参数为null,则该元素被初始化为null。
type type_name is table of element_type [not null];
图4 嵌套表类型集合的定义
Q10,Varray类型集合的定义如图所示,这种类型的集合下标是被限制的,其记录只能使用标量数据字段(同嵌套表类似)。Varray集合同样可以为null,用户可以使用is null进行检测。但是varray存储在数据库中时与表中的其他数据是存放在同一个数据块中的,由于其存储的在线性,varray很适合于小型集合。
初始化:需要使用内建的构造函数对集合进行初始化操作,构造函数和集合的名称相同,同时有一组参数,每个参数对应一个元素,如果参数为null,则该元素被初始化为null。
type type_name is [varray|varying array] (max_size) of element_type [not null];
图5 varray类型集合的定义
Q11,集合的方法
方法 |
描述 |
使用限制 |
Count |
返回集合中元素的个数 |
|
Delete |
删除集合中所有元素 |
|
Delete(x) |
删除元素下标为x的元素,如果x为null,则集合保持不变 |
对varray非法 |
Delete(x,y) |
删除元素下标从x到y的元素,如果x>y则集合保持不变 |
对varray非法 |
Exists(x) |
如果集合元素x已经初始化,则返回ture否则返回false |
|
Extend |
在集合末尾添加一个元素 |
对index_by非法 |
Extend(x) |
在集合末尾添加x个元素 |
对index_by非法 |
Extend(x,n) |
在集合末尾添加元素n的x个副本 |
对index_by非法 |
First |
返回集合第一个元素的下标号,对于varray集合始终返回1 |
|
Last |
返回集合中最后一个元素的下标号,对于varray集合返回值始终等于count |
|
Limit |
返回varry集合的最大元素个数,对于嵌套表和index_by始终为null |
Index_by和嵌套表无效 |
Next() |
返回元素x之后紧挨着他的元素的值,如果该元素是最后一个元素,则返回null |
|
Prior() |
返回集合中元素在x之前紧挨着他的元素的值,如果该元素是第一个元素,则返回null |
|
Trim |
从集合末端开始删除一个元素 |
|
Trim(x) |
从集合末端开始删除x个元素 |
|
|
|
|
表2 集合的方法