集合使用的小实验
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 /
(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
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
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 /
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
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
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 /
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
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 /
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 /
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
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 /
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
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 /
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
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
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 /
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 /
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
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
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 /
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
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/