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  不保留 保留 
       
posted on 2013-07-05 11:25  Kelly_HanShuai  阅读(142)  评论(0)    收藏  举报