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的学习更应如此。 以前的庸惰,我今天还是还叻。 “走江湖的,迟早要还的”。
    Oracle对Index by 数组的官方介绍
    http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28843/tdddg_procedures.htm#insertedID8

    -----------------------------------------------------------------------------------------------------------------------

    方法 描述 使用限制
    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不合法

    原文: http://www.jb51.net/article/19496.htm

    alarm   作者:NewSea     出处:http://newsea.cnblogs.com/    QQ,MSN:iamnewsea@hotmail.com

      如无特别标记说明,均为NewSea原创,版权私有,翻载必纠。欢迎交流,转载,但要在页面明显位置给出原文连接。谢谢。
  • 相关阅读:
    Java volatile 关键字底层实现原理解析
    volatile关键字?MESI协议?指令重排?内存屏障?这都是啥玩意
    聊聊缓存一致性协议
    JIT原理
    java 泛型详解
    Java中的逆变与协变
    疯狂的String
    java中synchronized与Lock的异同
    不使用的大对象为什么要手动设置null,真的有效吗?
    不使用反射如何调用某个实例对象的方法
  • 原文地址:https://www.cnblogs.com/newsea/p/1905478.html
Copyright © 2011-2022 走看看