Oracle复合数据类型基础知识

一 复合数据类型概述

      PL/SQL 有两种复合数据结构: 记录和集合 。记录有不同的域组成,集合由不同的元素组成。在PL/SQL 中集合在定义的时候必须使用TYPE语句,然后才是创建和使用这种类型的变量。

      集合类型: 变长数组(VARRAY),嵌套表(NESTED_TAB),关联数组(索引表---INDEX_BY);其实也可以分为两种,索引表是嵌套表的的拓展。
      三种类型的相似处:
  • 都是一维的类似数组的结构      
  • 都是内建的方法
  • 访问由点分割
      三种类型的不同处:
  • 数据绑定:数据绑定设计到集合中元素数量的限制,变长数组集合中的元素是的数量是有限制的,索引表和嵌套表则没有限制。
  • 稀疏性:稀疏性描述了集合的下标是否有间隙,索引表总是稀疏的;嵌套表开始是紧密的,但如果元素被删除了嵌套表可以是稀疏的,可以说嵌套表是相对于疏松;变长数组类型的集合是紧密的,它的下标之间没有间隔。
  • 存储方式:索引表不能存储在数据库中,但嵌套表和变长数组表可以被存储在数据库中。
二 索引表
      索引表集合的定义语法如下:TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY BINARY_INTERGET;这里面最重要的关键字是INDEX BY BINARY_INTERGET,没有这个关键字,那么集合将是一个嵌套表,element_type可以是任何合法的PL/SQL数据类型----(PLS/INTEGER,SIGNTYPE 和BOOLEAN)。其他的集合类型对数据库的数据类型都有限制,但索引表不能存储在数据库中,所以没有这些限制。

      一旦定义了索引表,就可以向创建其他变量那样创建索引表的变量:如:
       declare
            type test_tab1 is table of varchar2(50) index by binary_integer;
            v_test_tab test_tab1;
       begin

三 嵌套表

      嵌套表非常类似于索引表,创建的语法也非常相似。使用TYPE语句,只是没有INDEX BY BINARY_INTEGER字串。

      嵌套表的定义语法:TYPE type_name IS TABLE OF element_type [NOT NULL];

      NOT NULL选项用于要求集合所有的元素是否有值,element_type可以是一个记录,但是这个记录只能使用标量数据类型字段以及只用于数据库的数据类型(不能是PLS―INTEGER,BOOLEAN或SIGNTYPE)。

      嵌套表和变长数组表都能作为列存储在数据库表中,所以集合自身而不是单个的元素可以为NULL,oracle称这种整个集合为NULL的为“自动设置为NULL(atomically null)”以区别元素为NULL的情况。当集合为NULL时,即使不会产生异常,用户也不能引用集合中的元素。用户可以使用IS NULL操作符检测集合是否为NULL。

      存储在一个数据库中的嵌套表并不与表中的其他数据存放在同一个数据块中,它们实际上被存放在第二个表中。正如没有order by字句select语句不能保证返回任何有顺序的数据,从数据库中取回的嵌套表也不能保证元素的顺序。由于集合数据是离线存储的,对于大型集合嵌套表是一个不错的选择。

四 变长数组
      变长数组或数据变量都有元素的限制。在PL/SQL中,变长数组像其他集合一样变长数组定义依然使用type语句,但关键字VARRAY或VARRYING ARRAY告诉ORACLE这是一个VARRAY集合。

      变长数组定义语法格式:TYPE type_name IS [VARRAY|VARYING ARRAY] (max_size) OF element_type [NOT NULL];

      max_size是一个整数,用于表示VARRAY集合拥有的最多元素数目。VARRAY集合的元素数量可以低于max_size,但不能超过max_size。element_type是一维元素的数据类型,如果element_type是记录,那么这个记录只能使用标量数据字段(与嵌套表类似)。NOT NULL 字串表示集合中的每一个元素都必须有值。

      与嵌套表相似,VARRAY能够自动为NULL,可以使用IS NULL操作符进行检测。与嵌套表不同的是,当VARRAY存储在数据库中时与表中的其他数据存放在同一个数据块中。按照元素的排序保存在VARRAY中。由于变长数组集合是在线存储的,所以变长数组表很适合于小型集合。

五 集合的方法

  除了构造函数外,集合还有很多内建函数,这些函数称为方法。调用方法的语法如下:

   collection.method

  下表中列出oracle中集合的方法:
 方法  描述  使用限制
 COUNT  返回集合中元素的个数  
 DELETE  删除集合中所有元素  
 DELETE()  删除元素下标为x的元素,如果x为null,则集合保持不变  对VARRAY非法
 DELETE(,)  删除元素下标从X到Y的元素,如果X>Y集合保持不变  对VARRAY非法
 EXIST()  如果集合元素x已经初始化,则返回TRUE, 否则返回FALSE  
 EXTEND  在集合末尾添加一个元素  对Index_by非法
 EXTEND()  在集合末尾添加x个元素  对Index_by非法
 EXTEND(,)  在集合末尾添加元素n的x个副本  对Index_by非法
 FIRST  返回集合中的第一个元素的下标号,对于VARRAY集合始终返回1。  
LAST  返回集合中最后一个元素的下标号, 对于VARRAY返回值始终等于COUNT.  
 LIMIT          
 返回VARRY集合的最大的元素个数,对于嵌套表和对于嵌套表和Index_by为null  Index_by集合无用
 NEXT()  返回在元素x之后及紧挨着它的元素的值,如果该元素是最后一个元素,则返回null.  
 PRIOR()  返回集合中在元素x之前紧挨着它的元素的值,如果该元素是第一个元素,则返回null。  
 TRI M  从集合末端开始删除一个元素  对于index_by不合法
 TRIM()  从集合末端开始删除x个元素  对index_by不合法


六 关于集合之间的比较
   集合不能直接用于比较,要比较两个集合,可以设计一个函数,该函数返回一个标量数据类型。
              IF stock_list1>stock_list2 ----非法
              IF sort_collection(stock_list1)>sort_collection(stock_list2) THEN --合法
  但可以比较在集合内的两个元素。

你可能感兴趣的:(oracle,数据库,嵌套表,索引表,复合数据类型,变量数组)