Oracle PL/SQL 程序设计读书笔记 - 第12章 集合
Oracle PL/SQL 程序设计读书笔记 - 第12章 集合
Oracle PL/SQL 程序设计读书笔记 - 第12章 集合
12.1 集合概述
12.1.1 集合概念和术语
- 集合类型:共有3种能用的集合类型:关联数组,嵌套表和VARRAY。
12.1.2 集合类型
- 关联数组:是一个只能在PL/SQL环境使用的,一维的,没有边界的,稀疏的,由同质元素构成的集合类型。(PL/SQL表,索引表)
- 嵌套表:是一维的,没有边界的,由同质元素组成的集合类型。是多重集合的,这同时意味着嵌套表中的元素没有固定的顺序。
- VARRAY:可变长的数组,和其他两种集合类型相似,也是一维的,由同质元素组成的集合类型。不过这种结合类型总是有边界并且是非稀疏的。可以用于PL/SQL和数据库。它的元素是有顺序的。
12.1.4 使用集合的场合
- 当我要在参数列表中使用这些集合类型时,我必须用带有包名的规范化形式。
- 如果使用的是嵌套表或者VARRAY类型,就可以在表的列中存取非原子数据。
- VARRAY作为列的数据类型可以实现和嵌套表相同的效果,不过VARRAYnteds提前声明最大尺寸,并且这种类型实际上是和表的剩余数据一起在“行内”保存的。也就是说VARRAY是针对小数组,而嵌套表列适合大数组。
12.1.5 选择一个集合类型
Oacle集合类型的对比(表12-2略)
12.2 集合方法(内置)
12.2.1 COUNT方法
COUNT用于计算一个关联数组,嵌套表或者VARRAY中定义的元素数量,如果元素已经通过DELETE或者TRIM操作从集合中移除了,COUNT计数不会包含这些元素。
如果把COUNT应用于一个已经初始化的,但还没有任何元素的集合,方法返回的是0。如果用于一个空的关联数组也是返回0
如果把COUNT用于一个未经初始化的嵌套表或者VARRAY,就会抛出异常。
12.2.2 DELETE方法
DELETE方法用于从一个关联数组、嵌套表或者VARRAY中删除一个,一批或者全部元素。DELETE(i,j)删除以i开始以j结束的闭区间内的所有元素。
如果i和j指向的是根本就不存在的元素,DELETE方法会尝试正确处理,而不抛出异常。
12.2.3 EXISTS方法
对嵌套表,关联数组,VARRAY使用EXISTS方法可以确定集合中是否包含指定的行。
如果把EXISTS方法用于一个未经初始化嵌套表或者VARRAY,或者一个已经初始化但还没有任何元素的集合,它只是简单的返回FALSE。而不会抛出异常。
12.2.4 EXTEND方法
向一个嵌套表或者VARRAYk添加一个元素需要单独的一个分配步骤。
EXTEND(n,i)追加了n个元素然后把每个元素都设置成和第i个元素相同的值。
如果对一个还没有被初始化的嵌套表或者VARRAY使用EXTEND方法,会抛出异常。
12.2.5 FIRST和LAST方法
对嵌套表,关联数组,VARRAY使用FIRST和LAST方法,会分别返回集合定义的最低和最高索引值。
对于一个已经初始化的但还没有任何元素的集合使用FIRST和LAST方法,返回的结果是NULL。对于VARRAY而言FIRST返回的永远是1,LAST返回的结果和COUNT相同。
12.2.6 LIMIT方法
使用LIMIT方法可以确定一个VARRAY中可以定义的元素的最大数量。如果把这个方法用于一个已经初始化的嵌套表或者关联数组,返回的结果是NULL。
12.2.7 PRIOR和NEXT方法
对嵌套表,关联数组,VARRAY使用PRIOR和NEXT方法可以遍历集合的内容。
PRIOR方法返回相对于i的前一个可用索引,NEXT返回的是下一个索引值。
12.2.8 TRIM方法
用TRIM方法可以从嵌套表或者VARRAY的尾端删除n个元素。如果不带参数,TRIM就只会删除一个元素。
12.3 使用集合
12.3.1 声明集合类型
- 你可以通过TYPE语句在一个PL/SQL程序中声明集合类型。那么这个集合类型对于这个TYPE语句所在的代码块内部是可用的。如果是在包的规范部分定义的TYPE,则那些对这个包有EXECUTE权限的模式下的任何程序都可以使用这个类型。
- 你也可以使用CREATE TYPE命令在数据库中定义一个嵌套表或者VARRAY类型,这时这个类型就是一个模式级别的对象。这种类型就可以用作数据库表的列的数据类型,可以用作对象类型的属性,也可以用于声明PL/SQL变量。任何对这个类型有EXECUTE权限的模式都可以引用这个类型。
声明关联数组集合类型
TYPE table_type_name IS TABLE OF datatype [ NOT NULL ] INDEX BY index_type;
12.3.2 集合变量的声明和初始化
collection_name collection_type {:= collection_type (...)};
12.3.3 用数据填充集合
刚刚初始化后的集合是空的。里面一个元素也没有。
- 使用赋值操作符。赋值操作的行为包括创建元素,然后在该索引处保存值。
- 集合赋值。实际上就是把一个集合拷贝到另一个集合。
- 用关系表中的行赋值
12.3.6 复杂数据类型的集合
- 使用了表的%ROWTYPE属性的记录的集合
我们通过在集合定义的语句的TABLE OF子句中指定一个记录类型来定义一个记录集合。这种方法只适用于在PL/SQL中声明的集合类型。而在数据库里定义的嵌套表和VARRAY类型就不能使用这种方法了。
- 用户定义记录类型的集合
- 对象类型和其他复杂类型的集合
- 集合的集合(直接和间接)
12.3.8 在SQL中使用集合
- CAST:把一个集合类型映射到另一种集合类型。包括把一个VARRAY映射成一个嵌套表。
- MULTISET:把一个数据库的表映射成集合。利用MULTISET和CAST,你可以像处理集合类型的列一样操作数据库表。
- TABLE:把一个集合映射成数据库表。正好和MULTISET相反:它返回的映射表只有一列。
12.4 嵌套表的多重集合操作
- = 比较两个嵌套表是否相同(命名类型,基数以及元素值)
- !=或<> 比较两个嵌套表是否不相同(命名类型,基数以及元素值)
- [NOT]IN() 根据IN左边的嵌套表是否在圆括号中的嵌套表列表中,则返回TRUE
- X MULTISET EXCEPT [DISTINCT] Y 返回一个集合,其元素属于X,但不属于Y
- X MULTISET INTERSET [DISTINCT] Y 返回一个交集
- X MULTISET EXCEPT [DISTINCT] Y 返回一个合集
- SET(X) 返回嵌套表X中的元素去重后的结果
- x IS [NOT] A SET 根据嵌套表是否是唯一元素组成返回TRUE
- x IS [NOT] EMPTY 根据嵌套表是否为空返回TRUE
- e [NOT] MEMBER [OF] x 根据表达式e是否是嵌套表x的一个成员返回TRUE
- y [NOT] SUBMULTISET [OF] x 根据嵌套表y的元素是否是嵌套表x的元素的子集而返回TRUE