Oracle Array

102 阅读2分钟

单维数组

-- 不加 INDEX BY BINARY_INTEGER 写法
DECLARE
 TYPE SEQ_TYPE IS TABLE OF NUMBER;
 V_SEQ SEQ_TYPE:= SEQ_TYPE();
BEGIN
 V_SEQ.EXTEND;
 V_SEQ(1):= 2;

 V_SEQ.EXTEND;
 V_SEQ(2):= 3;

 V_SEQ.EXTEND;
 V_SEQ(3):= 3;
 FOR I IN 1.. V_SEQ.COUNT LOOP
  DBMS_OUTPUT.PUT_LINE(V_SEQ(I));
 END LOOP;
END;
-- 2 3 3


-- 加上 INDEX BY BINARY_INTEGER 写法
DECLARE
 TYPE SEQ_TYPE IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
 V_SEQ SEQ_TYPE;
BEGIN
 V_SEQ(1):= 2;
 V_SEQ(2):= 3;
 V_SEQ(3):= 3;

 FOR I IN 1.. V_SEQ.COUNT LOOP
  DBMS_OUTPUT.PUT_LINE(V_SEQ(I));
 END LOOP;
END;
-- 2 3 3

总结:INDEX BY BINARY_INTEGER 如果加上的话可以省略 SEQ_TYPE:= SEQ_TYPE() 初始化这个步骤;也不需要每插入一个空间就需要进行 EXTEND;

多维数组

--多维数组
DECLARE
  TYPE USER IS RECORD(
   ID     CHAR(20),
   NAME   CHAR(20),
   AGE    NUMBER
);
  TYPE U_TYPE_TAB IS TABLE OF USER INDEX BY BINARY_INTEGER; 
  USER_REC_ARRAY U_TYPE_TAB;
  USER_REC USER;
BEGIN
  -- 1.插入方式1:BULK COLLECT INTO
  SELECT ID,NAME,AGE BULK COLLECT INTO USER_REC_ARRAY FROM -- 这里插入数据相当与覆盖,所以使用BULK COLLECT INT0后数据还会变化时尽量写在前面。
    (SELECT '001' ID,'LAIN' NAME,16 AGE FROM DUAL UNION ALL  SELECT '002' ID,'NICO' NAME, 15 AGE FROM DUAL);

  -- 2.插入方式2:表达式 形式 赋值
  USER_REC.ID:= '005';
  USER_REC.NAME:= 'JACK';
  USER_REC.AGE:= 17;
  USER_REC_ARRAY(3):=USER_REC;

  -- 3.插入方式3:单格数据插入, 这里使用插入相当于吧JACK的ID替换为003了
  SELECT '003' INTO USER_REC_ARRAY(USER_REC_ARRAY.COUNT).ID FROM DUAL;

  /* 4.插入方式4:先查询插入,再进行表达式赋值。如果按照下面的写法:
     SELECT '004' INTO USER_REC_ARRAY(4).ID FROM DUAL;
     USER_REC.NAME:= 'SHARLEY';  USER_REC.AGE:= 18;
     USER_REC_ARRAY(4):=USER_REC;
     此时USER_REC会把当前行覆盖掉,所以这里004是被USER_REC给覆盖掉了,那么这里的USER_REC是没有给ID赋值的,取到的值就是上一个赋的值:005
     所以先插入的数据 004 会被 下面的表达式覆盖,结果会是:ID: '005', NAME: SHARLEY, AGE:18
  */
  -- 只要下面这种插入顺序,结果才会是:ID: 004, NAME: SHARLEY, AGE:18
  USER_REC.NAME:= 'SHARLEY';
  USER_REC.AGE:= 18;
  USER_REC_ARRAY(4).NAME:=USER_REC.NAME;
  USER_REC_ARRAY(4).AGE:=USER_REC.AGE;
  SELECT '004' INTO USER_REC_ARRAY(4).ID FROM DUAL;

  FOR I IN 1 .. USER_REC_ARRAY.COUNT LOOP
    DBMS_OUTPUT.PUT_LINE(USER_REC_ARRAY(I).ID || '-' || USER_REC_ARRAY(I).NAME || '-' || USER_REC_ARRAY(I).AGE);
  END LOOP;
END;

/*RESULT:
001                 -LAIN                -16
002                 -NICO                -15
003                 -JACK                -17
004                 -SHARLEY             -18
*/