单维数组
-- 不加 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
*/