溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PLSQL集合

發(fā)布時間:2020-07-31 02:05:22 來源:網(wǎng)絡(luò) 閱讀:707 作者:斷情漠 欄目:數(shù)據(jù)庫

PLSQL集合

  • 索引表(或者叫做關(guān)聯(lián)數(shù)組,associative array

  • 嵌套表(nested table

  • 變長數(shù)組(varray

  • 二維數(shù)組(多層集合)

索引表

---創(chuàng)建索引表類型的語法如下所示:               

TYPE  type_name IS TABLE OF  element_type

   INDEX BY index_type;  

table_name  TYPE_NAME;

--其中,element_type 指明集合中存放的數(shù)據(jù)的類型

--index_type指定下標的類型。只能是整型或者字符串

--使用下標來引用索引表中的單個元素,如下所示:

table_name(index);

---示例1:分別聲明一個游標和一個索引表類型,游標

--student表中檢索出前10個學(xué)生的姓名。遍歷游標,

--將每個學(xué)生的姓名保存到一個索引表類型的集合中,

--然后從集合中取出每個學(xué)生的姓名打印到屏幕上

declare
  --聲明游標,保存10個學(xué)生姓名
 cursor c_student is
   select last_name
     from student
     where rownum <= 10; 
  --聲明索引表集合類型
 type last_name_type is table of student.last_name%type
   index by pls_integer;   
  --聲明集合變量
 last_name_tab last_name_type;
  --聲明下標變量
 v_index pls_integer := 0;
begin
  --遍歷游標
  forr_student in c_student loop
   v_index := v_index + 1;
   --將學(xué)生姓名保存到集合中
   last_name_tab(v_index) := r_student.last_name; 
  endloop;
  --遍歷集合
  fori in 1..10 loop
   dbms_output.put_line( last_name_tab(i));
  endloop;
  --注意:引用不存在的集合元素會拋出NO_DATA_FOUND異常。
  --例如
 --dbms_output.put_line(last_name_tab(11));
end;

嵌套表

創(chuàng)建嵌套表的語法如下所示:

TYPE type_name IS TABLEOF element_type;

table_name  TYPE_NAME;

--該聲明非常類似于索引表的聲明,只是沒有INDEXBY子句。

--嵌套表的下標類型固定為Integer整型

declare
  --聲明游標,保存10個學(xué)生姓名
 cursor c_student is
   select last_name
     from student
     where rownum <= 10;   
  --聲明嵌套表集合類型
 type last_name_type is table of student.last_name%type;
  --聲明集合變量。必須使用構(gòu)造器函數(shù)進行初始化
  last_name_tab last_name_type := last_name_type();
  --聲明下標變量
  v_indexpls_integer := 0;
begin
  --遍歷游標
  forr_student in c_student loop
   v_index := v_index + 1;
   --必須調(diào)用extend方法添加存儲空間
    last_name_tab.extend;         --和數(shù)組一樣,每賦值一個元素需調(diào)用extend
   --將學(xué)生姓名保存到集合中
   last_name_tab(v_index) := r_student.last_name; 
  endloop;
  --遍歷集合
  fori in 1..10 loop
   dbms_output.put_line( last_name_tab(i));
  endloop; 
end;

變長數(shù)組

創(chuàng)建變長數(shù)組的語法如下所示:

TYPE  type_name IS VARRAY(size_limit) OFelement_type ;

varray_name  TYPE_NAME;

--size_limit:最大元素個數(shù)

 

--它和嵌套表類型的區(qū)別是:他有最大元素個數(shù)限制

--修改上例,使用保長數(shù)組類型

declare
  --聲明游標,保存10個學(xué)生姓名
 cursor c_student is
   select last_name
     from student
     where rownum <= 10;
  --聲明變長數(shù)組集合類型
  type last_name_type is varray(10) of student.last_name%type; 
  --聲明集合變量。必須使用構(gòu)造器函數(shù)進行初始化
  last_name_tab last_name_type := last_name_type();
  --聲明下標變量
 v_index pls_integer := 0;
begin
  --遍歷游標
  forr_student in c_student loop
   v_index := v_index + 1;
   --必須調(diào)用extend方法添加存儲空間
    last_name_tab.extend;   --每賦值一個元素需調(diào)用extend
   --將學(xué)生姓名保存到集合中
   last_name_tab(v_index) := r_student.last_name; 
  endloop;
  --遍歷集合
  fori in 1..10 loop
   dbms_output.put_line( last_name_tab(i));
  endloop; 
end;

--可見,變長數(shù)組在編碼使用的限制和嵌套表完全相同。

二維數(shù)組

Oracle 9i開始,PL/SQL允許創(chuàng)建元素類型為集合類型的集合。這種集合被稱為多層集合。

二維數(shù)組:有一個一維數(shù)組,其中的每個元素又是一個一維數(shù)組,那么這個一維數(shù)組叫做二維數(shù)組。

為引用這個多層集合中單獨的元素,需要使用如下語法:

varray_name(subscript  of the outer  varray)

          (subscript  of the  inner varray)

declare
  --聲明變長數(shù)組類型
  typevarray_type1 is varray(4) of number;
  --聲明多層集合(二維數(shù)組)
  typevarray_type2 is varray(3) of varray_type1;
  varray1varray_type1 := varray_type1(2,4,6,8);
  varray2varray_type2 := varray_type2(varray1);
begin
 varray2.extend;  --調(diào)用extend
  varray2(2):= varray_type1(1,3,5,7);
 varray2.extend;  --調(diào)用extend
  varray2(3):= varray_type1(8,8,8,8); 
  --遍歷集合
  for i in1..3 loop
    for j in1..4 loop
      dbms_output.put_line('varray2('||i||')('||j
      ||')='||varray2(i)(j));
    end loop;
  end loop;
 dbms_output.put_line('-------------------------------');
 
  --遍歷集合,實際的寫法
  for i invarray2.first..varray2.last loop
    for j invarray2(i).first..varray2(i).last loop
     dbms_output.put_line('varray2('||i||')('||j
      ||')='||varray2(i)(j));
    end loop;
  end loop;
end;
/


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI