oracle集合类型使用的实验.TXT

集合使用的小实验
1.可变数组
(1)显示可变数组中的内容
SQL> declare
  2    type stud_varray_t is varray(10) of varchar2(100);
  3    stud_varray stud_varray_t:=stud_varray_t();
  4    i number:=1;
  5  begin
  6    stud_varray.extend(10);
  7    stud_varray(1):='ab1';
  8    stud_varray(2):='ab2';
  9    stud_varray(3):='ab3';
 10    stud_varray(4):='ab4';
 11    stud_varray(5):='ab5';
 12    stud_varray(6):='ab6';
 13    stud_varray(7):='ab7';
 14    stud_varray(8):='ab8';
 15 
 16    while stud_varray.exists(i)
 17    loop
 18      dbms_output.put_line(stud_varray(i));
 19      i:=i+1;
 20    end loop;
 21  end;
 22  /
ab1
ab2
ab3
ab4
ab5
ab6
ab7
ab8
 
PL/SQL procedure successfully completed

(2)确认未赋值的(默认为NULL)的元素是否显示了
SQL>
SQL> declare
  2    type stud_varray_t is varray(10) of varchar2(100);
  3    stud_varray stud_varray_t:=stud_varray_t();
  4    i number:=1;
  5  begin
  6    stud_varray.extend(10);
  7    stud_varray(1):='ab1';
  8    stud_varray(2):='ab2';
  9    stud_varray(3):='ab3';
 10    stud_varray(4):='ab4';
 11    stud_varray(5):='ab5';
 12    stud_varray(6):='ab6';
 13    stud_varray(7):='ab7';
 14    stud_varray(8):='ab8';
 15 
 16    while stud_varray.exists(i)
 17    loop
 18      dbms_output.put_line(stud_varray(i));
 19      dbms_output.put_line(i);
 20      i:=i+1;
 21    end loop;
 22  end;
 23  /
ab1
1
ab2
2
ab3
3
ab4
4
ab5
5
ab6
6
ab7
7
ab8
8
9
10
PL/SQL procedure successfully completed
(3)使用trim方法将末尾的元素删除
SQL>
SQL> declare
  2    type stud_varray_t is varray(10) of varchar2(100);
  3    stud_varray stud_varray_t:=stud_varray_t();
  4    i number:=1;
  5  begin
  6    stud_varray.extend(10);
  7    stud_varray(1):='ab1';
  8    stud_varray(2):='ab2';
  9    stud_varray(3):='ab3';
 10    stud_varray(4):='ab4';
 11    stud_varray(5):='ab5';
 12    stud_varray(6):='ab6';
 13    stud_varray(7):='ab7';
 14    stud_varray(8):='ab8';
 15    stud_varray.trim;
 16    while stud_varray.exists(i)
 17    loop
 18      dbms_output.put_line(stud_varray(i));
 19      dbms_output.put_line(i);
 20      i:=i+1;
 21    end loop;
 22  end;
 23  /
ab1
1
ab2
2
ab3
3
ab4
4
ab5
5
ab6
6
ab7
7
ab8
8
9
PL/SQL procedure successfully completed

(4)trim删除多个元素
SQL>
SQL> declare
  2    type stud_varray_t is varray(10) of varchar2(100);
  3    stud_varray stud_varray_t:=stud_varray_t();
  4    i number:=1;
  5  begin
  6    stud_varray.extend(10);
  7    stud_varray(1):='ab1';
  8    stud_varray(2):='ab2';
  9    stud_varray(3):='ab3';
 10    stud_varray(4):='ab4';
 11    stud_varray(5):='ab5';
 12    stud_varray(6):='ab6';
 13    stud_varray(7):='ab7';
 14    stud_varray(8):='ab8';
 15    stud_varray.trim(5);
 16    while stud_varray.exists(i)
 17    loop
 18      dbms_output.put_line(stud_varray(i));
 19      dbms_output.put_line(i);
 20      i:=i+1;
 21    end loop;
 22  end;
 23  /
ab1
1
ab2
2
ab3
3
ab4
4
ab5
5
PL/SQL procedure successfully completed
(5)所给下标超过数组中的元素数量时会报错
SQL> declare
  2    type stud_varray_t is varray(10) of varchar2(100);
  3    stud_varray stud_varray_t:=stud_varray_t();
  4    i number:=1;
  5  begin
  6    stud_varray.extend(10);
  7    stud_varray(1):='ab1';
  8    stud_varray(2):='ab2';
  9    stud_varray(3):='ab3';
 10    stud_varray(4):='ab4';
 11    stud_varray(5):='ab5';
 12    stud_varray(6):='ab6';
 13    stud_varray(7):='ab7';
 14    stud_varray(8):='ab8';
 15    stud_varray.trim(50);
 16    while stud_varray.exists(i)
 17    loop
 18      dbms_output.put_line(stud_varray(i));
 19      dbms_output.put_line(i);
 20      i:=i+1;
 21    end loop;
 22  end;
 23  /
ORA-06533: 下标超出数量
ORA-06512: 在 line 15
(6)用limit方法显示集合的最大元素数量
SQL> declare
  2    type stud_varray_t is varray(10) of varchar2(100);
  3    stud_varray stud_varray_t:=stud_varray_t();
  4    i number:=1;
  5  begin
  6    stud_varray.extend(10);
  7    stud_varray(1):='ab1';
  8    stud_varray(2):='ab2';
  9    stud_varray(3):='ab3';
 10    stud_varray(4):='ab4';
 11    stud_varray(5):='ab5';
 12    stud_varray(6):='ab6';
 13    stud_varray(7):='ab7';
 14    stud_varray(8):='ab8';
 15    stud_varray.delete;
 16 
 17    dbms_output.put_line(stud_varray.limit);
 18  end;
 19  /
10
PL/SQL procedure successfully completed

2.嵌套表
(1)基本使用
SQL> declare
  2    type stud_tab_t is table of varchar2(100);
  3    stud_tab stud_tab_t:=stud_tab_t();
  4    i number:=1;
  5  begin
  6    stud_tab.extend(10);
  7    stud_tab(1):='ab1';
  8    stud_tab(2):='ab2';
  9    stud_tab(3):='ab3';
 10    stud_tab(4):='ab4';
 11    stud_tab(5):='ab5';
 12    stud_tab(6):='ab6';
 13    stud_tab(7):='ab7';
 14    stud_tab(8):='ab8';
 15    stud_tab.trim(5);
 16    while stud_tab.exists(i)
 17    loop
 18      dbms_output.put_line(stud_tab(i));
 19      dbms_output.put_line(i);
 20      i:=i+1;
 21    end loop;
 22  end;
 23  /
ab1
1
ab2
2
ab3
3
ab4
4
ab5
5
PL/SQL procedure successfully completed
(2)删除其中几个元素后
SQL> declare
  2    type stud_tab_t is table of varchar2(100);
  3    stud_tab stud_tab_t:=stud_tab_t();
  4    i number:=1;
  5  begin
  6    stud_tab.extend(10);
  7    stud_tab(1):='ab1';
  8    stud_tab(2):='ab2';
  9    stud_tab(3):='ab3';
 10    stud_tab(4):='ab4';
 11    stud_tab(5):='ab5';
 12    stud_tab(6):='ab6';
 13    stud_tab(7):='ab7';
 14    stud_tab(8):='ab8';
 15    stud_tab.delete(2);
 16    stud_tab.delete(5);
 17    stud_tab.delete(7);
 18    while stud_tab.exists(i)
 19    loop
 20      dbms_output.put_line(stud_tab(i));
 21      dbms_output.put_line(i);
 22      i:=i+1;
 23    end loop;
 24  end;
 25  /
ab1
1
PL/SQL procedure successfully completed
之所以只显示第一个元素,是因为第二个被我删除了。没调用到。
正确的调用方法应该是:
SQL> declare
  2    type stud_tab_t is table of varchar2(100);
  3    stud_tab stud_tab_t:=stud_tab_t();
  4    i number:=1;
  5  begin
  6    stud_tab.extend(10);
  7    stud_tab(1):='ab1';
  8    stud_tab(2):='ab2';
  9    stud_tab(3):='ab3';
 10    stud_tab(4):='ab4';
 11    stud_tab(5):='ab5';
 12    stud_tab(6):='ab6';
 13    stud_tab(7):='ab7';
 14    stud_tab(8):='ab8';
 15    stud_tab.delete(2);
 16    stud_tab.delete(5);
 17    stud_tab.delete(7);
 18 
 19    while stud_tab.exists(i)
 20    loop
 21      dbms_output.put_line(stud_tab(i));
 22      dbms_output.put_line(i);
 23      i:=stud_tab.next(i);
 24    end loop;
 25  end;
 26  /
ab1
1
ab3
3
ab4
4
ab6
6
ab8
8
9
10
PL/SQL procedure successfully completed

在集合为空时,不会显示任何内容:
SQL> declare
  2    type stud_tab_t is table of varchar2(100);
  3    stud_tab stud_tab_t:=stud_tab_t();
  4    i number:=1;
  5  begin
  6    stud_tab.extend(10);
  7    stud_tab(1):='ab1';
  8    stud_tab(2):='ab2';
  9    stud_tab(3):='ab3';
 10    stud_tab(4):='ab4';
 11    stud_tab(5):='ab5';
 12    stud_tab(6):='ab6';
 13    stud_tab(7):='ab7';
 14    stud_tab(8):='ab8';
 15    stud_tab.delete;
 16 
 17    while stud_tab.exists(i)
 18    loop
 19      dbms_output.put_line(stud_tab(i));
 20      dbms_output.put_line(i);
 21      i:=stud_tab.next(i);
 22    end loop;
 23  end;
 24  /
PL/SQL procedure successfully completed
SQL>

3.索引表(关联数组)
1)前面两种集合类型:嵌套表和可变数组(varray)必须进行初始化才可以使用,而对关联数组进行初始化会报错。
SQL> declare
  2    type stud_tab_t is table of varchar2(100) index by pls_integer;
  3    stud_tab stud_tab_t:=stud_tab_t();
  4    i number:=1;
  5  begin
  6    stud_tab.extend(10);
  7    stud_tab(1):='ab1';
  8    stud_tab(2):='ab2';
  9    stud_tab(3):='ab3';
 10    stud_tab(4):='ab4';
 11    stud_tab(5):='ab5';
 12    stud_tab(6):='ab6';
 13    stud_tab(7):='ab7';
 14    stud_tab(8):='ab8';
 15    stud_tab.delete(2);
 16    stud_tab.delete(5);
 17    stud_tab.delete(7);
 18 
 19 
 20    while stud_tab.exists(i)
 21    loop
 22      dbms_output.put_line(stud_tab(i));
 23      dbms_output.put_line(i);
 24      i:=stud_tab.next(i);
 25    end loop;
 26  end;
 27  /
ORA-06550: 第 3 行, 第 24 列:
PLS-00222: 在此范围中不存在名为 'STUD_TAB_T' 的函数
ORA-06550: 第 3 行, 第 12 列:
PL/SQL: Item ignored
ORA-06550: 第 6 行, 第 3 列:
PLS-00320: 此表达式的类型声明不完整或格式不正确
ORA-06550: 第 6 行, 第 3 列:
…………
ORA-06550: 第 11 行, 第 3 列:
PL/SQL: Statement ignored
ORA-06550: 第 12 行, 第 3 列:
PLS-00320: 此表达式的类型声明不完整或格式不正确
O
SQL> declare
  2    type stud_tab_t is table of varchar2(100) index by pls_integer;
  3    stud_tab stud_tab_t;
  4    i number:=1;
  5  begin
  6    stud_tab.extend(10);
  7    stud_tab(1):='ab1';
  8    stud_tab(2):='ab2';
  9    stud_tab(3):='ab3';
 10    stud_tab(4):='ab4';
 11    stud_tab(5):='ab5';
 12    stud_tab(6):='ab6';
 13    stud_tab(7):='ab7';
 14    stud_tab(8):='ab8';
 15    stud_tab.delete(2);
 16    stud_tab.delete(5);
 17    stud_tab.delete(7);
 18 
 19 
 20    while stud_tab.exists(i)
 21    loop
 22      dbms_output.put_line(stud_tab(i));
 23      dbms_output.put_line(i);
 24      i:=stud_tab.next(i);
 25    end loop;
 26  end;
 27  /

ORA-06550: 第 6 行, 第 3 列:
PLS-00306: 调用 'EXTEND' 时参数个数或类型错误
ORA-06550: 第 6 行, 第 3 列:
PL/SQL: Statement ignored
2)正确的引用方法
SQL>
SQL> declare
  2    type stud_tab_t is table of varchar2(100) index by pls_integer;
  3    stud_tab stud_tab_t;
  4    i number:=1;
  5  begin
  6    stud_tab(1):='ab1';
  7    stud_tab(2):='ab2';
  8    stud_tab(3):='ab3';
  9    stud_tab(4):='ab4';
 10    stud_tab(5):='ab5';
 11    stud_tab(6):='ab6';
 12    stud_tab(7):='ab7';
 13    stud_tab(8):='ab8';
 14    stud_tab.delete(2);
 15    stud_tab.delete(5);
 16    stud_tab.delete(7);
 17 
 18 
 19    while stud_tab.exists(i)
 20    loop
 21      dbms_output.put_line(stud_tab(i));
 22      dbms_output.put_line(i);
 23      i:=stud_tab.next(i);
 24    end loop;
 25  end;
 26  /
ab1
1
ab3
3
ab4
4
ab6
6
ab8
8
PL/SQL procedure successfully completed

3)使用字符串索引的集合
SQL> declare
  2    type stud_tab_t is table of varchar2(100) index by varchar2(100);
  3    stud_tab stud_tab_t;
  4    i number:=1;
  5  begin
  6    stud_tab('a1'):='ab1';
  7    stud_tab('a2'):='ab2';
  8    stud_tab('a3'):='ab3';
  9    dbms_output.put_line(stud_tab('a1'));
 10    dbms_output.put_line(stud_tab('a2'));
 11    dbms_output.put_line(stud_tab('a3'));
 12  end;
 13  /
ab1
ab2
ab3
PL/SQL procedure successfully completed
还可以采用拼接的方式得到集合索引:
SQL> declare
  2    type stud_tab_t is table of varchar2(100) index by varchar2(100);
  3    stud_tab stud_tab_t;
  4    i number:=1;
  5  begin
  6    stud_tab('a1'):='ab1';
  7    stud_tab('a2'):='ab2';
  8    stud_tab('a3'):='ab3';
  9    while stud_tab.exists('a'||i)
 10    loop
 11      dbms_output.put_line(stud_tab('a'||i));
 12      dbms_output.put_line(i);
 13      i:=i+1;
 14    end loop;
 15  end;
 16  /
ab1
1
ab2
2
ab3
3
PL/SQL procedure successfully completed

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26451536/viewspace-768613/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26451536/viewspace-768613/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值