Chinaunix首页 | 论坛 | 博客

acc

  • 博客访问: 790398
  • 博文数量: 170
  • 博客积分: 7011
  • 博客等级: 少将
  • 技术积分: 1660
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-31 12:02
文章分类

全部博文(170)

文章存档

2014年(7)

2010年(2)

2009年(62)

2008年(25)

2007年(67)

2006年(7)

我的朋友

分类: Oracle

2014-06-02 17:28:51

Oracle 11gR2数组实例:一维,二维,可变数组

点击(此处)折叠或打开

  1. CREATE OR REPLACE PACKAGE BODY acc_array_pkg IS

  2.   --数组实例过程
  3.   PROCEDURE run_array_example_p IS
  4.   
  5.     -- 一维数组
  6.     TYPE arr1_typ IS VARRAY(2) OF VARCHAR2(100);
  7.     v_arr1 arr1_typ := arr1_typ('a1', 'b2');
  8.   
  9.     -- 二维数组2
  10.     TYPE arr2_1_typ IS VARRAY(3) OF NUMBER;
  11.     TYPE arr2_2_typ IS VARRAY(2) OF arr2_1_typ;
  12.     v_arr2 arr2_2_typ := arr2_2_typ(arr2_1_typ(11, 12, 13), arr2_1_typ(21, 22, 23));
  13.   
  14.     -- 二维数组2
  15.     TYPE arr3_1_typ IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;
  16.     TYPE arr3_2_typ IS TABLE OF VARCHAR2(10) INDEX BY VARCHAR2(10);
  17.     TYPE arr3_3_typ IS TABLE OF arr3_1_typ INDEX BY VARCHAR2(10);
  18.     TYPE arr3_4_typ IS TABLE OF arr3_2_typ INDEX BY BINARY_INTEGER;
  19.     v_arr3_1 arr3_3_typ;
  20.     v_arr3_2 arr3_4_typ;
  21.   BEGIN
  22.   
  23.     -- 一维数组实例
  24.     dbms_output.put_line('一维数组实例输出:');
  25.     FOR i IN 1 .. v_arr1.count LOOP
  26.       dbms_output.put_line(' ' || v_arr1(i));
  27.     END LOOP;
  28.   
  29.     -- 二维数组实例1
  30.     dbms_output.put_line('二维数组实例输出1:');
  31.     FOR j IN 1 .. v_arr2.count LOOP
  32.       FOR k IN 1 .. v_arr2(j).count LOOP
  33.         dbms_output.put(' ' || v_arr2(j) (k));
  34.       END LOOP;
  35.       dbms_output.put_line('');
  36.     END LOOP;
  37.   
  38.     -- 二维数组实例2
  39.     v_arr3_1('A')(5) := 'A5';
  40.     v_arr3_1('A')(6) := 'A6';
  41.     v_arr3_1('B')(5) := 'B5';
  42.   
  43.     v_arr3_2(5)('A') := '5A';
  44.     v_arr3_2(5)('B') := '5B';
  45.     v_arr3_2(6)('A') := '6A';
  46.     dbms_output.put_line('二维数组实例输出2:' || 'Count:' || v_arr3_1.count);
  47.     dbms_output.put_line(v_arr3_1('A') (5));
  48.     FOR m IN 1 .. v_arr3_1.count LOOP
  49.       FOR n IN 1 .. v_arr3_1(m).count LOOP
  50.         dbms_output.put(' ' || v_arr3_1(m) (n));
  51.       END LOOP;
  52.       dbms_output.put_line('');
  53.     END LOOP;
  54.   
  55.   EXCEPTION
  56.     WHEN no_data_found THEN
  57.       dbms_output.put_line('二维数组实例2:数组越界了,取数规则不同.');
  58.   END run_array_example_p;

  59.   --可变数组
  60.   PROCEDURE array_dynamic_example_p IS
  61.     --Oracle除了数组类型VARRAY之外,还有嵌套表和索引表也都可以实现类似数组的功能。
  62.     --使用索引表定义数组,不需要指定数组的上限,数组的大小只与内存限制有关。
  63.   
  64.     --可变数组实例1
  65.     TYPE arr_typ_1 IS TABLE OF NUMBER INDEX BY VARCHAR2(9);
  66.     v_arr_1 arr_typ_1;
  67.     v_idx_1 VARCHAR2(9);
  68.   
  69.     --可变数组实例2
  70.     TYPE arr_typ_2_record IS RECORD(
  71.       idx INTEGER,
  72.       str VARCHAR2(100));
  73.     TYPE arr_typ_2 IS TABLE OF arr_typ_2_record INDEX BY BINARY_INTEGER;
  74.     -- arr_type_2_record 等价于emp%rowtype
  75.     v_arr_2 arr_typ_2;
  76.     v_idx_2 INTEGER := 1;
  77.   
  78.     --可变数组实例3
  79.     TYPE arr_typ_3 IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER;
  80.     v_arr_3 arr_typ_3;
  81.   
  82.     --可变数组实例4
  83.     TYPE arr_typ_4 IS TABLE OF VARCHAR2(20);
  84.     v_arr_4 arr_typ_4 := arr_typ_4('北京', '上海', '广州');
  85.     --ORA-06531: Reference to uninitialized collection
  86.     --如果没有 INDEX BY BINARY_INTEGER ,则需 初始化
  87.   
  88.   BEGIN
  89.   
  90.     --可变数组实例1
  91.     dbms_output.put_line('可变数组实例1:');
  92.     --向数组中存数据
  93.     FOR i IN (SELECT job, COUNT(1) cnt FROM emp GROUP BY job) LOOP
  94.       v_arr_1(i.job) := i.cnt;
  95.       --索引是数组的下标
  96.     END LOOP;
  97.     v_idx_1 := v_arr_1.first;
  98.     WHILE (v_arr_1.exists(v_idx_1)) LOOP
  99.       dbms_output.put_line(rpad(v_idx_1, 15, '-') || ':' || v_arr_1(v_idx_1));
  100.       v_idx_1 := v_arr_1.next(v_idx_1);
  101.     END LOOP;
  102.   
  103.     --可变数组实例2
  104.     dbms_output.put_line('可变数组实例2:');
  105.     FOR j IN 1 .. 3 LOOP
  106.       v_arr_2(j).idx := j;
  107.       v_arr_2(j).str := to_char(v_arr_2(j).idx, '$09.00');
  108.     END LOOP;
  109.     WHILE (v_arr_2.exists(v_idx_2)) LOOP
  110.       dbms_output.put_line(v_arr_2(v_idx_2).idx || '/' || v_arr_2(v_idx_2).str);
  111.       v_idx_2 := v_idx_2 + 1;
  112.     END LOOP;
  113.   
  114.     --可变数组实例3
  115.     dbms_output.put_line('可变数组实例3:');
  116.     v_arr_3(1) := '北京';
  117.     v_arr_3(2) := '上海';
  118.     v_arr_3(3) := '广州';
  119.     dbms_output.put_line('COUNT,FIRST,LAST,NEXT,PRIOR方法返回的值是整数');
  120.     dbms_output.put_line('共有记录:' || v_arr_3.count);
  121.     dbms_output.put_line('第一条:' || v_arr_3.first);
  122.     dbms_output.put_line('最后一条:' || v_arr_3.last);
  123.     dbms_output.put_line('第二条的前一条:' || v_arr_3.prior(2));
  124.     dbms_output.put_line('第二条的后一条:' || v_arr_3.next(2));
  125.     --COUNT,FIRST,LAST,NEXT,PRIOR方法返回的值是整数
  126.     --以下3种表示的内容相同:
  127.     dbms_output.put_line('第一条记录内容:' || v_arr_3(v_arr_3.prior(2)));
  128.     dbms_output.put_line('第一条记录内容:' || v_arr_3(v_arr_3.first));
  129.     dbms_output.put_line('第一条记录内容:' || v_arr_3(1));
  130.   
  131.     --可变数组实例4
  132.     dbms_output.put_line('可变数组实例4:');
  133.     dbms_output.put_line('如果没有 INDEX BY BINARY_INTEGER ,则需 初始化');
  134.     v_arr_4(1) := '$北京';
  135.     v_arr_4(2) := '$上海';
  136.     v_arr_4(3) := '$广州';
  137.     dbms_output.put_line('共有记录:' || v_arr_4.count);
  138.     dbms_output.put_line('第一条:' || v_arr_4.first);
  139.     dbms_output.put_line('最后一条:' || v_arr_4.last);
  140.     dbms_output.put_line('第二条的前一条:' || v_arr_4.prior(2));
  141.     dbms_output.put_line('第二条的后一条:' || v_arr_4.next(2));
  142.     --COUNT,FIRST,LAST,NEXT,PRIOR方法返回的值是整数
  143.     --以下3种表示的内容相同:
  144.     dbms_output.put_line('第一条记录内容:' || v_arr_4(v_arr_4.prior(2)));
  145.     dbms_output.put_line('第一条记录内容:' || v_arr_4(v_arr_4.first));
  146.     dbms_output.put_line('第一条记录内容:' || v_arr_4(1));
  147.   
  148.   END array_dynamic_example_p;

  149. END acc_array_pkg;

输出结果:

点击(此处)折叠或打开

  1. 一维数组实例输出:
  2. a1
  3. b2
  4. 二维数组实例输出1:
  5. 11 12 13
  6. 21 22 23
  7. 二维数组实例输出2:Count:2
  8. A5
  9. 二维数组实例2:数组越界了,取数规则不同.


点击(此处)折叠或打开

  1. 可变数组实例1:
  2. ANALYST--------:2
  3. CLERK----------:4
  4. MANAGER--------:3
  5. PRESIDENT------:1
  6. SALESMAN-------:4
  7. 可变数组实例2:
  8. 1/ $01.00
  9. 2/ $02.00
  10. 3/ $03.00
  11. 可变数组实例3:
  12. COUNT,FIRST,LAST,NEXT,PRIOR方法返回的值是整数
  13. 共有记录:3
  14. 第一条:1
  15. 最后一条:3
  16. 第二条的前一条:1
  17. 第二条的后一条:3
  18. 第一条记录内容:北京
  19. 第一条记录内容:北京
  20. 第一条记录内容:北京
  21. 可变数组实例4:
  22. 如果没有 INDEX BY BINARY_INTEGER ,则需 初始化
  23. 共有记录:3
  24. 第一条:1
  25. 最后一条:3
  26. 第二条的前一条:1
  27. 第二条的后一条:3
  28. 第一条记录内容:$北京
  29. 第一条记录内容:$北京
  30. 第一条记录内容:$北京





阅读(3616) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~