oracle 数组

转自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>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值