多层集合

多层集合

概述

存在两种模式级别的集合原型:VARRAY 和(嵌套)TABLE。两者都定义了一种指定类型元素的一维有序阵列,并且都可以用于创建用户自定义的模式级别类型,如下所示…

create type Arr_t is varray(255) of number;
/

…或…

create type Tab_t is table of varchar2(2000);
/

如果合适的话,元素类型可以是一种对象类型,如下所示…

create type Obj_t is object ( a number, b varchar2(4000), c date );

/

基于 VARRAY 或 TABLE 的模式级别类型实例可以作为一列的字段存储在相关的数据库表中,如下所示…

create type Arr_t is varray(255) of Obj_t;
/
create table t (id number, arr Arr_t);
/
insert into t ( id, arr ) values

  ( 1, Arr_t ( Obj_t ( 1, 'one', '1-Jan-01' ), Obj_t ( 2, 'two', '2-Jan-01' ) ) );
insert into t ( id, arr ) values
  ( 5, Arr_t ( Obj_t ( 5, 'five', '5-Jan-01' ), Obj_t ( 6, 'six', '6-Jan-01' ) ) );

VARRAY 和 TABLE 之间的主要区别是:

  • TABLE 是无序的,而 VARRY 保持了顺序。
  • VARRAY 定义有上界,而 TABLE 是无界的。
  • 小型 VARRAY 字段(<= 4000 字节)直接存储,大型 VARRAY 字段在给定的相关表中以不透明的系统管理 LOB 类型存储,而 TABLE 字段则作为几个行在单独的不透明系统管理相关表中存储。
这影响了访问的效率,引起了一种常见的权衡:固定的最大集合大小,具有更快的访问速度无限的集合大小,具有更慢的访问速度是相对而言的。。

PL/SQL 允许用户自定义类型的变量并提供机制,传送存储于模式级别集合内的数据至相应的 PL/SQL 结构以及从其中传出数据,如下所示…

declare
  cursor c is select id, arr from t;
  v_id number;
  v_arr Arr_t;
begin
  open c;

  loop
    fetch c into v_id, v_arr; exit when c%notfound;
    Dbms_Output.Put_Line ( v_id );
    for j in v_arr.first..v_arr.last
    loop
      Dbms_Output.Put_Line ( v_arr(j).a, v_arr(j).b, v_arr(j).c );
    end loop;
  end loop;
  close c;
end;

/

PL/SQL 允许在库单元内声明基于 VARRAY 或 TABLE 的类型。这一般存在于跨越几个库单元的重用包中。此外,PL/SQL 允许 TABLE 的 index-by 变量。(此变量不允许作为模式级别类型的基类。)在 Oracle9i 之前就支持以上这些特性。

Oracle9i 增强功能

多层集合的商务利益

将数据作为集合实例存储在数据库表的列中是一种支持确定访问路径的预先优化(一般访问每一所选行集合的所有元素)。填充和查询这种集合实例时需要用到 PL/SQL。在 PL/SQL 程序中构建数据的集合模型对于实现确定算法是必不可少的(示例参见代码示例中的完美三角算法)。集合可以作为批量绑定的目标,从而改善了数据库和 PL/SQL 过程之间数据传输的性能。

  • 以前只有在一维的条件下才能利用以上的好处。现在则可通过多层集合应用于任何类型的实际问。


寄送此页面
Printer View 打印机视图