1. 程式人生 > >PL/SQL集合(table)巢狀表操作例項講解例項

PL/SQL集合(table)巢狀表操作例項講解例項

集合是一個有序組具有相同的資料型別的元素。每個元素進行標識的唯一標表示其在集合中的位置。

PL/SQL提供了三種集合型別:索引表或關聯陣列、巢狀表、可變大小的陣列或變長陣列

Oracle文件提供了每種型別的集合的以下特徵:

集合型別元素數量下標型別密集或稀疏在哪裡建立可以是物件型別屬性
關聯陣列(或索引表)無界字串或整數兩種都可以只有在PL/SQL塊No
巢狀表無界整數開始密集,可以變得稀疏無論是在PL/SQL塊或模式級別Yes
可變大小的陣列(變長陣列)有界整數總是密集無論是在PL/SQL塊或模式級別Yes

這兩種型別的PL/SQL表即,索引表和巢狀表,都具有相同的結構以及行使用下標符號訪問。然而,這兩種型別的表有不同一個方面:巢狀表可以儲存在資料庫中的列,但索引表不能。

巢狀表

巢狀表是就像一個一維陣列的元素的數量。然而,巢狀表不同於在以下幾方面的陣列:

  • 陣列具有元素的宣告的數量,但巢狀表不用宣告大小。巢狀表的大小可以動態地增加。

  • 陣列總是密集的,也就是說,它總是有連續的下標。巢狀陣列初始是緻密,但是刪除它的元素時就會變成稀疏。

使用以下語法建立一個巢狀表:

TYPE type_name ISTABLEOF element_type [NOTNULL];

table_name type_name;

這個宣告是類似宣告的索引表中,但沒有INDEX BY子句。巢狀表可以被儲存在資料庫中的列,所以它可用於簡化在那裡加入一個較大的表中的單個列,使用SQL操作。關聯陣列不能儲存在資料庫中。巢狀表的元素也可以是任何資料庫表字段%TYPE和任何資料庫表或%ROWTYPE。

集合方法

PL/SQL提供,使集合更容易使用內建集合方法。下表列出了這些方法和用途:

S.N.方法名稱及用途
1EXISTS(n)
返回TRUE,如果一個集合中的第n個元素的存在;否則返回FALSE
2COUNT
返回集合當前包含的元素數量
3LIMIT
檢查集合的最大尺寸
4FIRST
返回在使用整數下標集合的第一個(最小的)索引號
5LAST
返回在使用整數下標集合的最後一個(最大的)索引號
6PRIOR(n)
返回集合中索引n前面的索引號
7NEXT(n)
返回索引n的下一個索引號
8EXTEND
追加1個空元素到集合
9EXTEND(n)
追加n個空元素到集合
10EXTEND(n,i)
追加的第i個元素的集合的n個拷貝
11TRIM

移除集合的末尾一個元素
12TRIM(n)
移除一個集合末尾的n個元素
13DELETE
移除一個集合中的所有元素,設定計數為0
14DELETE(n)
移除關聯陣列用數字鍵或巢狀表中的第n個元素。如果關聯陣列有一個字串鍵,對應於該鍵的值的元素將被刪除。如果n為空,DELETE(N)什麼都不做
15DELETE(m,n)
移除關聯陣列或巢狀表範圍m..n所有元素。如果m大於n或如果m大於或n是零,DELETE(M,N)什麼也不做

集合異常

下表提供了集合異常和引發,當它們:

集合異常引發情況
COLLECTION_IS_NULL嘗試在一個原子空(null)的集合操作
NO_DATA_FOUND下標指定被刪除的元素,或關聯陣列的一個不存在的元素
SUBSCRIPT_BEYOND_COUNT下標超過了一個集合的元素數
SUBSCRIPT_OUTSIDE_LIMIT下標超出了允許的範圍
VALUE_ERROR下標為空(null)或不可轉換的鍵型別。如果該鍵被定義為PLS_INTEGER範圍,下標是在該範圍之外可能會出現這樣的異常

巢狀表操作例項:

-- Created on 2018/4/2 by E.WANG 
/*
集合是一個有序組具有相同的資料型別的元素。
每個元素進行標識的唯一標表示其在集合中的位置。
PL/SQL提供了三種集合型別:索引表或關聯陣列、巢狀表、可變大小的陣列或變長陣列。
巢狀表是就像一個一維陣列的元素的數量。然而,巢狀表不同於在以下幾方面的陣列:

陣列具有元素的宣告的數量,但巢狀表不用宣告大小。巢狀表的大小可以動態地增加。
陣列總是密集的,也就是說,它總是有連續的下標。巢狀陣列初始是緻密,但是刪除它的元素時就會變成稀疏。
使用以下語法建立一個巢狀表:
TYPE type_name IS TABLE OF element_type [NOT NULL];
table_name type_name;
這個宣告是類似宣告的索引表中,但沒有INDEX BY子句。
*/
declare 
  --建立一個遊標
  cursor emp_cursor is  select ename from emp;
  --建立一個巢狀表
  type emp_table is table of emp.ename%type;
  --宣告並初始化表
  empTable emp_table:=emp_table();
  --用來儲存key
  keyValue integer:=0;
begin
  --開啟並獲取遊標資料
  --資料獲取完關閉遊標
  for tmp in emp_cursor loop
      --是key值加一
      keyValue:=keyValue+1;
      --EXTEND:追加1個空元素到集合
      empTable.extend;
      --給索引表賦值
      empTable(keyValue):=tmp.ename;
  end loop;

  
  --FIRST:返回在使用整數下標集合的第一個(最小的)索引號
  keyValue := empTable.FIRST;
  --當鍵不為空時進行下一個迴圈
  WHILE keyValue IS NOT null LOOP
      dbms_output.put_line
      ('Emp name: ' || TO_CHAR(empTable(keyValue) || ' The emp index: ' || keyValue));
      --返回索引keyValue的下一個索引號
      keyValue := empTable.NEXT(keyValue);
   END LOOP;
  --LAST:返回在使用整數下標集合的最後一個(最大的)索引號
  keyValue:= empTable.LAST;
  
end;

執行結果截圖: