Oracle 集合類型介紹

注:以下內容整理自網絡。

---------------------------------------------------

集合類型  


1. 使用條件:

   a. 單行單列的數據,使用標量變量 。 
   b. 單行多列數據,使用記錄 [ 詳細講解請見: 點擊打開鏈接 ]
   c. 單列多行數據,使用集合

       *集合:類似於編程語言中數組也就是。pl/sql集合類型包括關聯數組Associative array(索引表 pl/sql table)、嵌套表(Nested Table)、變長數組(VARRAY)。


2. 三種集合類型區別:

     Nested table與VARRY既可以被用於PL/SQL,也可以被直接用於數據庫中,但是Associative array不行,也就是說,Associative array是不能通過CREATE TYPE語句進行單獨創建,只能在PL/SQL塊(或Package)中進行定義並使用(即適用範圍是PL/SQL Block級別),而Nested table與VARRAY則可以使用CREATE TYPE進行創建(即適用範圍是Schema級別),它們還可以直接作爲數據庫表中列的類型。


3.  集合的方法:

       exists(index) 索引處的元素是否存在  
       count 當前集合中的元素總個數  
       limit 集合元素索引的最大值  
          索引表和嵌套表是不限個數的,所以返回null,變長數組返回定義時的最大索引  
       first  返回集合第一個元素索引  
       last  返回集合最後一個元素索引  
       prior 當前元素的前一個  
       next 當前元素的後一個  
      
       extend 擴展集合的容量,增加元素 只是用於嵌套表和varry類型  
           x.extend 增加一個null元素  
           x.extend(n) 增加n個null元素  
           x.extend(n,i) 增加n個元素,元素值與第i個元素相同  
       trim 從集合的尾部刪除元素 只用於NEST TABLE和VARRY類型  
       trim 從集合尾部刪除一個元素  
       trim(n) 從集合尾部刪除n個元素  
       delete 按索引刪除集合元素  
           delete 刪除所有  
           delete(index) 刪除第index個  
           delete(a,b) 刪除a--b之間的所有元素 

4.  集合類型的聲明與初始化:

    1)關聯數組:
         a. 下標無限制,可以爲負數  
         b. 元素個數無限制  
         c.  定義  
              TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY key_type;  
              type_name:用戶自定義數據類型的名字  
              element_type:索引表中元素類型  
              key_type:索引表元素下標的數據類型(BINARY_INTEGER,PLS_INTEGER,VARCHAR2)  

         d. 例1:

            

[sql] view plain copy
  1. declare  
  2.   type index_tab_type is table of varchar2(30) index by BINARY_INTEGER;  
  3.   v_table index_tab_type;  
  4. begin  
  5.   v_table(-1) :='hello';--設定下標爲-1的元素的值  
  6.   v_table(1)  :=',';  
  7.   dbms_output.put_line(v_table(-1)||'-'||v_table(1));  
  8.   dbms_output.put_line('元素個數:'||v_table.count);  
  9.   v_table(5) :='world';  
  10.   dbms_output.put_line('元素個數:'||v_table.count);  
  11.   dbms_output.put_line('第一個元素'||v_table.first);  
  12.   dbms_output.put_line('最後一個元素'||v_table.last);  
  13. end;  
  14. /  

[sql] view plain copy
  1. hello-,  
  2. 元素個數:2  
  3. 元素個數:3  
  4. 第一個元素-1  
  5. 最後一個元素5  
  6.   
  7. PL/SQL 過程已成功完成。  
         e.例2:使用varchar2作爲索引元素類型 ,其實也就和java中的map一樣了 key-value(鍵值對)形式存儲

[sql] view plain copy
  1. declare  
  2.   type index_tab_type is table of varchar2(30) index by varchar2(30);  
  3.   v_table index_tab_type;  
  4.   v_record emp%rowtype;  
  5. begin  
  6.   --emp表中查詢3條記錄,以name-job的形式存儲到索引表中  
  7.   select * into v_record from emp where emp.empno=7788;  
  8.   v_table(v_record.ename):= v_record.job;  
  9.   select * into v_record from emp where emp.empno=7844;  
  10.   v_table(v_record.ename):= v_record.job;  
  11.   select * into v_record from emp where emp.empno=7900;  
  12.   v_table(v_record.ename):= v_record.job;  
  13.   dbms_output.put_line(v_table.count);--3  
  14.   dbms_output.put_line(v_table(v_record.ename));--CLERK  
  15. end;  
  16. /  

[sql] view plain copy
  1. 3  
  2. CLERK  
  3.   
  4. PL/SQL 過程已成功完成。  


     2)嵌套表 Nested Table
         a. 下標從1開始,元素個數滅有限制(*使用時必須先初始化,用extend屬性可以擴展元素個數)  
         b.  可以作爲表定義數據類型,但是前提是要先create 創造嵌套表類型,這就可以實現1對多了定義  
                TYPE type_name IS TABLE OF element_type;  
         c.  和索引表的區別也就是看看有無index by語句,嵌套表的索引固定是int型的 . 

         d.例1:

[sql] view plain copy
  1. declare  
  2.      type nest_table_type is table of emp.ename%type;  
  3.      v_nest_tab nest_table_type;  
  4. begin  
  5.      v_nest_tab :=nest_table_type('x');--初始化 必須! 語句 type_name(...)  
  6.      select ename into v_nest_tab(1) from emp where empno=7788;  
  7.      dbms_output.put_line(v_nest_tab(1));  
  8. end;  

[sql] view plain copy
  1. SCOTT  
  2.   
  3. PL/SQL 過程已成功完成。  

          e.例2:在表列中使用嵌套表 嵌套表類型的列是單獨一個表存儲先創建一個這樣的類型才能使用

[sql] view plain copy
  1.  create type nest_tab_type is table of varchar2(30);     
  2.   create table test_nest_tab(    
  3.      id int,    
  4.      vals nest_tab_type --使用    
  5.   ) nested table vals store as nest_tab;--vals字段用嵌套表存儲,表明nest_tab    
  6.   --上面語句執行完之後,在生成TEST_NEST_TAB的同時會生出一個關聯表NEST_TAB用來存儲關聯表的數據    
  7. --插入數據    
  8. insert into test_nest_tab values(1,nest_tab_type('one','two','three','four'));    
  9. --查詢數據    
  10. declare     
  11.   v_id int;    
  12.   v_tab nest_tab_type;    
  13. begin    
  14.   select * into v_id,v_tab from test_nest_tab where id=1;    
  15.   dbms_output.put_line(v_id);    
  16.   for i in 1..v_tab.count loop    
  17.   dbms_output.put_line(v_tab(i));    
  18.   end loop;    
  19. end;    

[sql] view plain copy
  1. 1  
  2. one  
  3. two  
  4. three  
  5. four  
  6.   
  7. PL/SQL 過程已成功完成。  

      3)Varry 可變數組 

        a. 定義  
             TYPE type_name IS VARRAY(size_limit) OF element_type[NOT NULL];  
        b.  這個就和Java中的數組差不多了,下標from 1 ,定義時先指定最大元素個數,也和varchar2(size)這種一樣。  
        c.  使用時也必須先用構造方法初始化 ,可以作爲表列類型  
        d.  例1:
       

[sql] view plain copy
  1. declare  
  2.   type varr is VARRAY(10) of int;  
  3.   v_varr varr :=varr();  
  4. begin  
  5.   --dbms_output.put_line(varr.count);  
  6.   for i in 1..5 loop  
  7.       v_varr.extend;  
  8.       v_varr(i) :=i*i;  
  9.   end loop;  
  10.   
  11.   for i in 1..5 loop  
  12.       dbms_output.put_line(v_varr(i));  
  13.   end loop;  
  14. end;  
  15. /  

[sql] view plain copy
  1. 1  
  2. 4  
  3. 9  
  4. 16  
  5. 25  
  6.   
  7. PL/SQL 過程已成功完成。  

            e.例2:可變數組作爲表列類型 可變數組是存儲在表內部的,不同於嵌套表

[sql] view plain copy
  1. create type varr_type is varray(10) of varchar2(30);--先創建類型    
  2. create table test_varray(    
  3.     id int,    
  4.     name varchar2(30),    
  5.     params varr_type --param是使用可變數組類型    
  6. );    
  7. --插入數據    
  8. insert into test_varray values(1,'bird',varr_type('a','b','c'));    
  9. --查詢數據    
  10. declare     
  11.     v_varr varr_type;    
  12.     v_name test_varray.name%type;    
  13. begin    
  14.     select name,params into v_name,v_varr from test_varray where id=1;    
  15.     for i in 1..v_varr.count loop    
  16.     dbms_output.put_line(v_varr(i));    
  17.     end loop;    
  18. end;   

[sql] view plain copy
  1. a  
  2. b  
  3. c  
  4.   
  5. PL/SQL 過程已成功完成。  


5. 如何選擇適用的集合類型:


       通常來說,對集合類型的第一選擇應該是Associative array,因爲它不需要初始化或者EXTEND操作,並且是迄今爲止最高效的集合類型。唯一不足的一點是它只能用於PL/SQL而不能直接用於數據庫。

  如果你需要允許使用負數索引,應該選擇Associative array;

  如果你需要使用10g,11g中的那些集合操作,應該選擇Nested table;

  如果你需要限制集合元素的個數,應該選擇VARRAY。




 -------------------------------------------------------------------------------------------

 ★ Present by dylan.★

發佈了7 篇原創文章 · 獲贊 9 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章