Oracle 11g Release 1 (11.1) PL/SQL_理解 Collection 类型

2014-11-24 18:51:29 · 作者: · 浏览: 0

另外,若有一个用编程语言写的函数,其涉及集合操作,出于某种必要的原因,想改写成 Oracle 函数,那么,对了解 Oracle 集合操作很有必要。


先定义 collection 类型,之后再声明该类型的变量。


你可以在模式级别、包或 PL/SQL 块内定义一个 collection 类型。


在模式级别创建的 collection 类型是 standalone stored type。用 CREATE TYPE 语句创建。它存储在数据库,直到用 DROP TYPE 语句删除该类型。


在包内创建的 collection 类型是 packaged type。它存储在数据库,直到用 DROP PACKAGE 语句删除包。


在 PL/SQL 块创建的 collection 类型只在块内可用,只有块嵌入在 standalone 或 packaged subprogram 中它才存储在数据库。



collection 类型遵循与其他类型、变量一样的作用域和实例化规则。当你输入一个块或子程序时,collection 被实例化,当退出时,销毁。在一个包中,当初从引用包时,collection 被实例化,并在结束数据库会话时,销毁。



你可以在任何 PL/SQL 块、子程序,或包的声明部分,使用 TYPE 来定义 TABLEVARRAY 类型。


对于在 PL/SQL 内声明的 nested tablevarray,table 或 varray 的元素类型可以是,除了 REF CURSOR 以外的任意 PL/SQL 数据类型。


当定义一个 VARRAY 类型时,必须用一个正整数指定最大大小。如下所示,定义一个能最多存储 366 个日期的 VARRAY


associative arrays 可以用任意键值插入元素。键不需要是连续的。键的数据类型可以是 PLS_INTEGERVARCHAR2,或 VARCHAR2 子类型的一个:VARCHARSTRING、或 LONG.


必须指定基于 VARCHAR2 键的长度,除了 LONG,因为,它等价于声明一个 VARCHAR2(32760) 类型的键。类型 RAWLONG RAWROWIDCHARCHARACTER 不允许做为一个 associative array 的键。LONGLONG RAW 仅仅是为了向后兼容。


不允许初始化子句。associative arrays 没有构造标记。当使用基于 VARCHAR2 键来引用 associative arrays 中的一个元素时,你可以使用如 DATETIMESTAMP 等类型,只要该类型可以用 TO_CHAR 函数转换成 VARCHAR2


定义一个 collection 类型后,用该类型声明变量。在声明中使用新类型名,同预定义类型一样,如 NUMBER


示例 1:演示声明 nested table、varray 和 associative array