zoukankan      html  css  js  c++  java
  • oracle数组使用实例

    <一维数组
    SET SERVEROUT ON SIZE 100000
    DECLARE
      TYPE T_VARRAY IS VARRAY(3) OF VARCHAR2(20);
      V_VAR T_VARRAY := T_VARRAY('I', 'LOVE', 'STUDY');
    BEGIN
      FOR I IN 1 .. V_VAR.COUNT LOOP
        DBMS_OUTPUT.PUT_LINE(V_VAR(I));
      END LOOP;
    END;
    /

    <二维数组
    <二维数组EXAMPLE1
    DECLARE
      TYPE T_VARRAY IS VARRAY(5) OF NUMBER;
      TYPE T_VARRAY_VARRAY IS VARRAY(2) OF T_VARRAY;
      V_VAR T_VARRAY_VARRAY := T_VARRAY_VARRAY(T_VARRAY(11, 12, 13, 14, 15),
                                               T_VARRAY(21, 22, 23, 24, 25));
    BEGIN
      FOR I IN 1 .. V_VAR.COUNT LOOP
        FOR J IN 1 .. V_VAR(I).COUNT LOOP
          DBMS_OUTPUT.PUT_LINE(V_VAR(I) (J));
        END LOOP;
      END LOOP;
    END;
    /
    <二维数组EXAMPLE2
    DECLARE
      TYPE T_NUM IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
      TYPE T_VAR IS TABLE OF NUMBER INDEX BY VARCHAR2(10);
      TYPE T_NUM_VAR IS TABLE OF T_NUM INDEX BY VARCHAR2(10);
      TYPE T_VAR_NUM IS TABLE OF T_VAR INDEX BY BINARY_INTEGER;
      V_NUM_VAR T_NUM_VAR;
      V_VAR_NUM T_VAR_NUM;
    BEGIN
      V_NUM_VAR('A')(5) := 1;
      V_VAR_NUM(5)('A') := 1;
    END;
    /

    <可变数组
    --嵌套表
    TYPE tbl_t IS TABLE OF VARCHAR2(30);
    my_tbl tbl_t := tbl_t('a', 'b', 'c'); --初始化
    Oracle除了数组类型VARRAY之外,还有嵌套表和索引表也都可以实现类似数组的功能。
    使用索引表定义数组,不需要指定数组的上限,数组的大小只与内存限制有关。
    <可变数组EXAMPLE1
    DECLARE
      TYPE T_TAB IS TABLE OF NUMBER INDEX BY VARCHAR2(30);
      --索引是数组的下标
      V_VAR T_TAB;
      V_STR VARCHAR2(30);
    BEGIN
      FOR I IN (SELECT OWNER, COUNT(1) CN FROM DBA_TABLES GROUP BY OWNER) LOOP
        V_VAR(I.OWNER) := I.CN;
        --索引是数组的下标
      END LOOP;
      V_STR := V_VAR.FIRST;
      WHILE (V_VAR.EXISTS(V_STR)) LOOP
        DBMS_OUTPUT.PUT_LINE(RPAD(V_STR, 20, '-') || ':' || V_VAR(V_STR));
        V_STR := V_VAR.NEXT(V_STR);
      END LOOP;
    END;
    /
    CTXSYS--------------:36
    DEV-----------------:1915
    HR------------------:7
    MARS3_WEB_USR-------:9
    <可变数组EXAMPLE2
    DECLARE
      TYPE T_REC IS RECORD(
        VINT INTEGER,
        VCHR VARCHAR2(100));
      TYPE T_TAB IS TABLE OF T_REC INDEX BY BINARY_INTEGER;
      --T_REC 等价 EMP%ROWTYPE
      V_VAR T_TAB;
      Y     INTEGER := 1;
    BEGIN
      FOR X IN 1 .. 3 LOOP
        V_VAR(X).VINT := X;
        V_VAR(X).VCHR := TO_CHAR(V_VAR(X).VINT, '$09.00');
      END LOOP;
      WHILE (V_VAR.EXISTS(Y)) LOOP
        DBMS_OUTPUT.PUT_LINE(V_VAR(Y).VINT || '/' || V_VAR(Y).VCHR);
        Y := Y + 1;
      END LOOP;
    END;
    /
    1/ $01.00
    2/ $02.00
    3/ $03.00

    <可变数组EXAMPLE3
    DECLARE
      TYPE T_TAB IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER;
      V_VAR T_TAB;
    BEGIN
      V_VAR(1) := '北京';
      V_VAR(2) := '上海';
      V_VAR(3) := '广州';
      DBMS_OUTPUT.PUT_LINE('共有记录:' || V_VAR.COUNT);
      DBMS_OUTPUT.PUT_LINE('第一条:' || V_VAR.FIRST);
      DBMS_OUTPUT.PUT_LINE('最后一条:' || V_VAR.LAST);
      DBMS_OUTPUT.PUT_LINE('第二条的前一条:' || V_VAR.PRIOR(2));
      DBMS_OUTPUT.PUT_LINE('第二条的后一条:' || V_VAR.NEXT(2));
      --COUNT,FIRST,LAST,NEXT,PRIOR方法返回的值是整数
      --以下3种表示的内容相同:
      DBMS_OUTPUT.PUT_LINE('第一条记录内容:' || V_VAR(V_VAR.PRIOR(2)));
      DBMS_OUTPUT.PUT_LINE('第一条记录内容:' || V_VAR(V_VAR.FIRST));
      DBMS_OUTPUT.PUT_LINE('第一条记录内容:' || V_VAR(1));
    END;
    /
    共有记录:3
    第一条:1
    最后一条:3
    第二条的前一条:1
    第二条的后一条:3
    第一条记录内容:北京
    第一条记录内容:北京
    第一条记录内容:北京

    <可变数组EXAMPLE4
    DECLARE
      TYPE T_TAB IS TABLE OF VARCHAR2(20);
      V_VAR T_TAB := T_TAB('北京', '上海', '广州');
      --ORA-06531: Reference to uninitialized collection
      --如果没有 INDEX BY BINARY_INTEGER ,则需 初始化
    BEGIN
      V_VAR(1) := '$北京';
      V_VAR(2) := '$上海';
      V_VAR(3) := '$广州';
      DBMS_OUTPUT.PUT_LINE('共有记录:' || V_VAR.COUNT);
      DBMS_OUTPUT.PUT_LINE('第一条:' || V_VAR.FIRST);
      DBMS_OUTPUT.PUT_LINE('最后一条:' || V_VAR.LAST);
      DBMS_OUTPUT.PUT_LINE('第二条的前一条:' || V_VAR.PRIOR(2));
      DBMS_OUTPUT.PUT_LINE('第二条的后一条:' || V_VAR.NEXT(2));
      --COUNT,FIRST,LAST,NEXT,PRIOR方法返回的值是整数
      --以下3种表示的内容相同:
      DBMS_OUTPUT.PUT_LINE('第一条记录内容:' || V_VAR(V_VAR.PRIOR(2)));
      DBMS_OUTPUT.PUT_LINE('第一条记录内容:' || V_VAR(V_VAR.FIRST));
      DBMS_OUTPUT.PUT_LINE('第一条记录内容:' || V_VAR(1));
    END;
    /
    共有记录:3
    第一条:1
    最后一条:3
    第二条的前一条:1
    第二条的后一条:3
    第一条记录内容:$北京
    第一条记录内容:$北京
    第一条记录内容:$北京

  • 相关阅读:
    每个程序员都应该了解的内存知识
    关于CPU Cache -- 程序猿需要知道的那些事
    【转载】十分钟搞清字符集和字符编码
    初学 Java Web 开发,请远离各种框架,从 Servlet 开发
    XML
    接口比对象更加抽象
    【转载】Dom4j的使用(全而好的文章)
    BZOJ4870:[SHOI2017]组合数问题(组合数学,矩阵乘法)
    BZOJ1089:[SCOI2003]严格n元树(DP,高精度)
    BZOJ1259:[CQOI2007]矩形rect(DFS)
  • 原文地址:https://www.cnblogs.com/songzhenhua/p/9312853.html
Copyright © 2011-2022 走看看