Oracle array usage

本文深入探讨了Oracle数据库中数组(如VARRAY、嵌套表和索引表)、二维数组和可变数组的概念及其用法。通过具体实例展示了如何声明、初始化和遍历这些数据结构,为数据库开发人员提供了宝贵的实践指导。
一维数组
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 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;

二维数组
Example 1
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 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;

Example 2
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 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;

可变数组
嵌套表
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 TYPE tbl_t IS TABLE OF VARCHAR2(30);
my_tbl tbl_t := tbl_t('a', 'b', 'c'); --初始化

Oracle
除了数组类型VARRAY之外,还有嵌套表和索引表也都可以实现类似数组的功能。
使用索引表定义数组,不需要指定数组的上限,数组的大小只与内存限制有关。
Example 1

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;

Example 2
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 DECLARE

  TYPE T_REC IS RECORD(VINT INTEGER,VCHR VARCHAR2(100));
    --T_REC 等价 EMP%ROWTYPE
  TYPE T_TAB IS TABLE OF T_REC INDEX BY BINARY_INTEGER;

  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;

Output:
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 1/ $01.00
2/ $02.00
3/ $03.00

Example 3
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 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;
Output

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 共有记录:3
第一条:1
最后一条:3
第二条的前一条:1
第二条的后一条:3
第一条记录内容:北京
第一条记录内容:北京
第一条记录内容:北京


Example 4
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 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;

Output

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 共有记录:3
第一条:1
最后一条:3
第二条的前一条:1
第二条的后一条:3
第一条记录内容:$北京
第一条记录内容:$北京
第一条记录内容:$北京

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26118480/viewspace-714200/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26118480/viewspace-714200/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值