转自http://blog.chinaunix.net/uid-23072872-id-3436393.html
一维固定数组
SQL> DECLARE
2 TYPE type_array IS VARRAY(3) OF VARCHAR2(10);
3 v_array type_array:=type_array('abc','bcd','def');
4 BEGIN
5 FOR i IN 1..v_array.count LOOP
6 dbms_output.put_line(v_array(i));
7 END LOOP;
8 END;
9 /
abc
bcd
def
一维可变数组
SQL> DECLARE
2 TYPE type_tab IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;
3 v_tab type_tab;
4 BEGIN
5 v_tab(1):='abc';
6 v_tab(2):='bcd';
7 v_tab(3):='cde';
8 FOR i IN 1..v_tab.count LOOP
9 dbms_output.put_line(v_tab(i));
10 END LOOP;
11 END;
12 /
abc
bcd
cde
-------------------------------------------------
如果在定义类型type_tab时省略了INDEX BY BINARY_INTEGER,
则必须用v_tab.extend语句“移动”行
比如:
SQL> DECLARE
2 TYPE type_tab IS TABLE OF VARCHAR2(10);
3 v_tab type_tab := type_tab();
4 BEGIN
5 v_tab.extend;
6 v_tab(1):='abc';
7 v_tab.extend;
8 v_tab(2):='bcd';
9 v_tab.extend;
10 v_tab(3):='cde';
11 FOR i IN 1..v_tab.count LOOP
12 dbms_output.put_line(v_tab(i));
13 END LOOP;
14 END;
15 /
abc
bcd
cde
多维数组
先定义一个表yy,结构如下:
Name Type Nullable Default Comments
ID INTEGER Y
NAME VARCHAR2(10) Y
CODE CHAR(3) Y
-------------
SQL> DECLARE
2 TYPE type_tab IS TABLE OF yy%ROWTYPE INDEX BY BINARY_INTEGER;
3 v_tab type_tab;
4 BEGIN
5 -- 向变量数组v_tab填充数据
6 SELECt * BULK COLLECT INTO v_tab FROM yy;
7
8 -- 循环提取所有行
9 FOR i IN 1..v_tab.count LOOP
10 -- 每一行有三个数据分别打印
11 dbms_output.put(v_tab(i).id||' ');
12 dbms_output.put(v_tab(i).name||' ');
13 dbms_output.put_line(v_tab(i).code||' ');
14 END LOOP;
15 END;
16 /
1 ab a01
2 bb a02
3 cc a01
4 dd a03
5 ee a04
6 ff a05
--------------------------------------------------
SQL> -- 也可以用record实现多维数组的功能
SQL> DECLARE
2 -- 先定义record作为多维数组的类型
3 TYPE type_rec IS RECORD(ID INT ,CODE VARCHAR2(10) ,NAME CHAR(3));
4 TYPE type_tab IS TABLE OF type_rec INDEX BY BINARY_INTEGER;
5 v_tab type_tab;
6 BEGIN
7 -- 向变量数组v_tab填充数据
8 SELECt * BULK COLLECT INTO v_tab FROM yy;
9
10 -- 循环提取所有行
11 FOR i IN 1..v_tab.count LOOP
12 -- 每一行有三个数据分别打印
13 dbms_output.put(v_tab(i).id||' ');
14 dbms_output.put(v_tab(i).name||' ');
15 dbms_output.put_line(v_tab(i).code||' ');
16 END LOOP;
17 END;
18 /
1 a01 ab
2 a02 bb
3 a01 cc
4 a03 dd
5 a04 ee
6 a05 ff
PL/SQL procedure successfully completed
SQL>