oracle集合型別使用的實驗.TXT

to_be_Dba發表於2013-08-15
集合使用的小實驗
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章