zoukankan      html  css  js  c++  java
  • oracle 的数组(转)

    declare
    type t_indexby is table of number
    index by binary_integer;
    type t_nested is table of number;
    type t_varray is varray(10) of number;
    v_indexby t_indexby;
    v_nested t_nested;
    v_varray t_varray;
    begin
    v_indexby(1):=1;
    v_indexby(2):=2;
    v_nested:=t_nested(1,2,3,4,5);
    v_varray:=t_varray(1,2);
    end; 
    

    一段很简单的有关Oracle里数组的sample代码。看着这段由代表性的代码,不由想起自己以前独自摸索Oracle里数组类型的那种不弄明白决不姑息的激情。
    这段代码也还不错,通过简单的实例就把主要的数组类型都罗列出来叻,好的素材 不由又激发其我回答写写的欲望叻,所以也不吝指力,总结叻一番,也顺便填补一下我以前忘记归纳总结的空缺
    这段代码,收罗叻Oracle里数组的使用方式
    1. index by table
    2. nested table
    3. varray 可变数组
    这里是Oracle文档里对这三种数组类型的介绍
    An index-by table is the most flexible and generally best-performing collection type for use inside PL/SQL programs.
    A nested table is appropriate for large collections that an application stores and retrieves in portions.
    A VARRAY is appropriate for small collections that the application stores and retrieves in their entirety.
    这里是对通过应用性上的对他们三者的概括,好像没有给我们太直接的影响,还是让我们先对其了解,这里的应用性上体现的东西也就好理解叻。
    sample code中以对三种不同的type定义的方式开始。
    type t_indexby is table of number index by binary_integer; -- indexed by table
    type t_nesteed is table of number; -- nested table
    type t_varray is varray(10) of number; -- varray
    上两句和后一句有明显的不同,没有定义长度,而varray定义叻长度。varray有长度限制,访问是超过长度的话将提示越界的错误。而indexed by table和nested table显然没有这个限制,不过对于indexed by table和nested table,他们两个也是有区别的。
    上面sample的后部分就描述了两者的区别,对于index by table来说,这里已经指定了index的类型,直接用index的类型的变量做索引来标识着每个元素,而不需要扩展大小。这个功能有些像java里的map(有区别就是这里key是有顺序的),而nested table能则完全和list一样
    我们通过sample来看看
    v_indexby(1):=1;
    v_indexby(2):=2;
    这里分别在v_indexby里加了两个元素,为1, 1和2,2,注意这里的(1),(2)和后面nested table已经varray里的不一样,
    这里,我把它理解为key,而不是元素的序号。所以index by这里的下标,不一定是连续的,可以跳跃,而另两者就不同,另外两个是名符其实的数组对象了,下标表示的就是元素的序号,和java不同,从1开始。
    v_nested:=t_nested(1,2,3,4,5);
    v_varray:=t_varray(1,2);
    这里分别是定义了5个和2个元素的数组。
    v_nested:=t_nested(1,2,3,4,5); 5个元素,值为1,2,3,4,5
    v_varray:=t_varray(1,2); 2个元素 值为1,2
    强调一下,对于nested table来说,需要使用extend来扩展数组,添加元素的时候,而varrray不需要(已经知道长度了,定义的时候)。
    v_nested.extend; v_nested(v_nested.count) := 6;
    大家在这里基本上已经可以看到他们的区别了,index by table在结构上和nested table以及Varray有着本质的不同,那么势必使用的时候肯定不同了。由于index by table下标并不是序号,所以我们只能通过key来访问了,这里和java倒是一样的。
    上面的例子里,没有提供,而且我在网上找了很多的介绍都没有详细给出过index by table的遍历的方法的,这里我自己写了一个sample,供大家学习参考

     
    declare
    type t_array is table of varchar2(1000) index by binary_integer;
    v_array t_array;
    v_idx number;
    begin
    v_array(1) := 'a1';
    v_array(2) := 'a2';
    v_array(-1) := 'a-1'; -- 是key所以可以为负数
    v_idx := v_array.first;
    loop
    exit when v_idx is null;
    dbms_output.put_line(v_array(v_idx));
    v_idx := v_array.next(v_idx);
    end loop;
    end;
    / 
    

    结果 a-1 a1 a2 注意这里的方法,first,返回第一个key,next()返回下一个key 对于nested table来说,下标是序号,是不能为负数的

    declare
    type t_array is table of varchar2(1000);
    v_array t_array;
    v_idx varchar2(1000);
    begin
    v_array := t_array(); --- 一定要先初始话。
    v_array.extend; ---- 扩展数组
    v_array(1) := 'a1';
    v_array.extend;
    v_array(2) := 'a2';
    v_array.extend;
    v_array(3) := 'a-1'; ---- v_array(-1) := 'a-1'; 将出错
    v_idx := v_array.first;
    loop
    dbms_output.put(v_idx||' ');
    exit when v_idx is null;
    dbms_output.put_line(v_array(v_idx));
    v_idx := v_array.next(v_idx);
    end loop;
    end;
    /
    

    看看nested tabled的访问也可以和上面一样,当然也可以用更简单的方法来遍历

    for i in 1..v_array.count loop
    dbms_output.put(i||' ');
    dbms_output.put_line(v_array(i));
    end loop; 
    

    其实可以看到和java里的list的访问很类似了。
    这个知识点,很多人都写过sample,内容不是很多,但是小知识也要积累,劝学里 “不积跬步,无以至千里,不积小流,无以成江海”,学习固然如此,而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不合法

  • 相关阅读:
    POJ 2923 Relocation (状态压缩,01背包)
    HDU 2126 Buy the souvenirs (01背包,输出方案数)
    hdu 2639 Bone Collector II (01背包,求第k优解)
    UVA 562 Dividing coins (01背包)
    POJ 3437 Tree Grafting
    Light OJ 1095 Arrange the Numbers(容斥)
    BZOJ 1560 火星藏宝图(DP)
    POJ 3675 Telescope
    POJ 2986 A Triangle and a Circle
    BZOJ 1040 骑士
  • 原文地址:https://www.cnblogs.com/sekon/p/4294802.html
Copyright © 2011-2022 走看看