Oracle 11gR2数组实例:一维,二维,可变数组
-
CREATE OR REPLACE PACKAGE BODY acc_array_pkg IS
-
-
--数组实例过程
-
PROCEDURE run_array_example_p IS
-
-
-- 一维数组
-
TYPE arr1_typ IS VARRAY(2) OF VARCHAR2(100);
-
v_arr1 arr1_typ := arr1_typ('a1', 'b2');
-
-
-- 二维数组2
-
TYPE arr2_1_typ IS VARRAY(3) OF NUMBER;
-
TYPE arr2_2_typ IS VARRAY(2) OF arr2_1_typ;
-
v_arr2 arr2_2_typ := arr2_2_typ(arr2_1_typ(11, 12, 13), arr2_1_typ(21, 22, 23));
-
-
-- 二维数组2
-
TYPE arr3_1_typ IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;
-
TYPE arr3_2_typ IS TABLE OF VARCHAR2(10) INDEX BY VARCHAR2(10);
-
TYPE arr3_3_typ IS TABLE OF arr3_1_typ INDEX BY VARCHAR2(10);
-
TYPE arr3_4_typ IS TABLE OF arr3_2_typ INDEX BY BINARY_INTEGER;
-
v_arr3_1 arr3_3_typ;
-
v_arr3_2 arr3_4_typ;
-
BEGIN
-
-
-- 一维数组实例
-
dbms_output.put_line('一维数组实例输出:');
-
FOR i IN 1 .. v_arr1.count LOOP
-
dbms_output.put_line(' ' || v_arr1(i));
-
END LOOP;
-
-
-- 二维数组实例1
-
dbms_output.put_line('二维数组实例输出1:');
-
FOR j IN 1 .. v_arr2.count LOOP
-
FOR k IN 1 .. v_arr2(j).count LOOP
-
dbms_output.put(' ' || v_arr2(j) (k));
-
END LOOP;
-
dbms_output.put_line('');
-
END LOOP;
-
-
-- 二维数组实例2
-
v_arr3_1('A')(5) := 'A5';
-
v_arr3_1('A')(6) := 'A6';
-
v_arr3_1('B')(5) := 'B5';
-
-
v_arr3_2(5)('A') := '5A';
-
v_arr3_2(5)('B') := '5B';
-
v_arr3_2(6)('A') := '6A';
-
dbms_output.put_line('二维数组实例输出2:' || 'Count:' || v_arr3_1.count);
-
dbms_output.put_line(v_arr3_1('A') (5));
-
FOR m IN 1 .. v_arr3_1.count LOOP
-
FOR n IN 1 .. v_arr3_1(m).count LOOP
-
dbms_output.put(' ' || v_arr3_1(m) (n));
-
END LOOP;
-
dbms_output.put_line('');
-
END LOOP;
-
-
EXCEPTION
-
WHEN no_data_found THEN
-
dbms_output.put_line('二维数组实例2:数组越界了,取数规则不同.');
-
END run_array_example_p;
-
-
--可变数组
-
PROCEDURE array_dynamic_example_p IS
-
--Oracle除了数组类型VARRAY之外,还有嵌套表和索引表也都可以实现类似数组的功能。
-
--使用索引表定义数组,不需要指定数组的上限,数组的大小只与内存限制有关。
-
-
--可变数组实例1
-
TYPE arr_typ_1 IS TABLE OF NUMBER INDEX BY VARCHAR2(9);
-
v_arr_1 arr_typ_1;
-
v_idx_1 VARCHAR2(9);
-
-
--可变数组实例2
-
TYPE arr_typ_2_record IS RECORD(
-
idx INTEGER,
-
str VARCHAR2(100));
-
TYPE arr_typ_2 IS TABLE OF arr_typ_2_record INDEX BY BINARY_INTEGER;
-
-- arr_type_2_record 等价于emp%rowtype
-
v_arr_2 arr_typ_2;
-
v_idx_2 INTEGER := 1;
-
-
--可变数组实例3
-
TYPE arr_typ_3 IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER;
-
v_arr_3 arr_typ_3;
-
-
--可变数组实例4
-
TYPE arr_typ_4 IS TABLE OF VARCHAR2(20);
-
v_arr_4 arr_typ_4 := arr_typ_4('北京', '上海', '广州');
-
--ORA-06531: Reference to uninitialized collection
-
--如果没有 INDEX BY BINARY_INTEGER ,则需 初始化
-
-
BEGIN
-
-
--可变数组实例1
-
dbms_output.put_line('可变数组实例1:');
-
--向数组中存数据
-
FOR i IN (SELECT job, COUNT(1) cnt FROM emp GROUP BY job) LOOP
-
v_arr_1(i.job) := i.cnt;
-
--索引是数组的下标
-
END LOOP;
-
v_idx_1 := v_arr_1.first;
-
WHILE (v_arr_1.exists(v_idx_1)) LOOP
-
dbms_output.put_line(rpad(v_idx_1, 15, '-') || ':' || v_arr_1(v_idx_1));
-
v_idx_1 := v_arr_1.next(v_idx_1);
-
END LOOP;
-
-
--可变数组实例2
-
dbms_output.put_line('可变数组实例2:');
-
FOR j IN 1 .. 3 LOOP
-
v_arr_2(j).idx := j;
-
v_arr_2(j).str := to_char(v_arr_2(j).idx, '$09.00');
-
END LOOP;
-
WHILE (v_arr_2.exists(v_idx_2)) LOOP
-
dbms_output.put_line(v_arr_2(v_idx_2).idx || '/' || v_arr_2(v_idx_2).str);
-
v_idx_2 := v_idx_2 + 1;
-
END LOOP;
-
-
--可变数组实例3
-
dbms_output.put_line('可变数组实例3:');
-
v_arr_3(1) := '北京';
-
v_arr_3(2) := '上海';
-
v_arr_3(3) := '广州';
-
dbms_output.put_line('COUNT,FIRST,LAST,NEXT,PRIOR方法返回的值是整数');
-
dbms_output.put_line('共有记录:' || v_arr_3.count);
-
dbms_output.put_line('第一条:' || v_arr_3.first);
-
dbms_output.put_line('最后一条:' || v_arr_3.last);
-
dbms_output.put_line('第二条的前一条:' || v_arr_3.prior(2));
-
dbms_output.put_line('第二条的后一条:' || v_arr_3.next(2));
-
--COUNT,FIRST,LAST,NEXT,PRIOR方法返回的值是整数
-
--以下3种表示的内容相同:
-
dbms_output.put_line('第一条记录内容:' || v_arr_3(v_arr_3.prior(2)));
-
dbms_output.put_line('第一条记录内容:' || v_arr_3(v_arr_3.first));
-
dbms_output.put_line('第一条记录内容:' || v_arr_3(1));
-
-
--可变数组实例4
-
dbms_output.put_line('可变数组实例4:');
-
dbms_output.put_line('如果没有 INDEX BY BINARY_INTEGER ,则需 初始化');
-
v_arr_4(1) := '$北京';
-
v_arr_4(2) := '$上海';
-
v_arr_4(3) := '$广州';
-
dbms_output.put_line('共有记录:' || v_arr_4.count);
-
dbms_output.put_line('第一条:' || v_arr_4.first);
-
dbms_output.put_line('最后一条:' || v_arr_4.last);
-
dbms_output.put_line('第二条的前一条:' || v_arr_4.prior(2));
-
dbms_output.put_line('第二条的后一条:' || v_arr_4.next(2));
-
--COUNT,FIRST,LAST,NEXT,PRIOR方法返回的值是整数
-
--以下3种表示的内容相同:
-
dbms_output.put_line('第一条记录内容:' || v_arr_4(v_arr_4.prior(2)));
-
dbms_output.put_line('第一条记录内容:' || v_arr_4(v_arr_4.first));
-
dbms_output.put_line('第一条记录内容:' || v_arr_4(1));
-
-
END array_dynamic_example_p;
-
-
END acc_array_pkg;
输出结果:
-
一维数组实例输出:
-
a1
-
b2
-
二维数组实例输出1:
-
11 12 13
-
21 22 23
-
二维数组实例输出2:Count:2
-
A5
-
二维数组实例2:数组越界了,取数规则不同.
-
可变数组实例1:
-
ANALYST--------:2
-
CLERK----------:4
-
MANAGER--------:3
-
PRESIDENT------:1
-
SALESMAN-------:4
-
可变数组实例2:
-
1/ $01.00
-
2/ $02.00
-
3/ $03.00
-
可变数组实例3:
-
COUNT,FIRST,LAST,NEXT,PRIOR方法返回的值是整数
-
共有记录:3
-
第一条:1
-
最后一条:3
-
第二条的前一条:1
-
第二条的后一条:3
-
第一条记录内容:北京
-
第一条记录内容:北京
-
第一条记录内容:北京
-
可变数组实例4:
-
如果没有 INDEX BY BINARY_INTEGER ,则需 初始化
-
共有记录:3
-
第一条:1
-
最后一条:3
-
第二条的前一条:1
-
第二条的后一条:3
-
第一条记录内容:$北京
-
第一条记录内容:$北京
-
第一条记录内容:$北京
阅读(3713) | 评论(0) | 转发(0) |