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

第一条记录内容:$北京

第一条记录内容:$北京

第一条记录内容:$北京

你可能感兴趣的:(oracle 数组)