天天看點

PL/SQL集合(table)嵌套表操作執行個體講解執行個體

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

PL/SQL提供了三種集合類型:索引表或關聯數組、嵌套表、可變大小的數組或變長數組

Oracle文檔提供了每種類型的集合的以下特征:

集合類型 元素數量 下标類型 密集或稀疏 在哪裡建立 可以是對象類型屬性
關聯數組(或索引表) 無界 字元串或整數 兩種都可以 隻有在PL/SQL塊 No
嵌套表 無界 整數 開始密集,可以變得稀疏 無論是在PL/SQL塊或模式級别 Yes
可變大小的數組(變長數組) 有界 整數 總是密集 無論是在PL/SQL塊或模式級别 Yes

這兩種類型的PL/SQL表即,索引表和嵌套表,都具有相同的結構以及行使用下标符号通路。然而,這兩種類型的表有不同一個方面:嵌套表可以存儲在資料庫中的列,但索引表不能。

嵌套表

嵌套表是就像一個一維數組的元素的數量。然而,嵌套表不同于在以下幾方面的數組:

  • 數組具有元素的聲明的數量,但嵌套表不用聲明大小。嵌套表的大小可以動态地增加。
  • 數組總是密集的,也就是說,它總是有連續的下标。嵌套數組初始是緻密,但是删除它的元素時就會變成稀疏。

使用以下文法建立一個嵌套表:

TYPE type_name IS TABLE OF element_type [NOT NULL];

table_name type_name;      

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

集合方法

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

S.N. 方法名稱及用途
1

EXISTS(n)

傳回TRUE,如果一個集合中的第n個元素的存在;否則傳回FALSE

2

COUNT

傳回集合目前包含的元素數量

3

LIMIT

檢查集合的最大尺寸

4

FIRST

傳回在使用整數下标集合的第一個(最小的)索引号

5

LAST

傳回在使用整數下标集合的最後一個(最大的)索引号

6

PRIOR(n)

傳回集合中索引n前面的索引号

7

NEXT(n)

傳回索引n的下一個索引号

8

EXTEND

追加1個空元素到集合

9

EXTEND(n)

追加n個空元素到集合

10

EXTEND(n,i)

追加的第i個元素的集合的n個拷貝

11

TRIM

移除集合的末尾一個元素

12

TRIM(n)

移除一個集合末尾的n個元素

13

DELETE

移除一個集合中的所有元素,設定計數為0

14

DELETE(n)

移除關聯數組用數字鍵或嵌套表中的第n個元素。如果關聯數組有一個字元串鍵,對應于該鍵的值的元素将被删除。如果n為空,DELETE(N)什麼都不做

15

DELETE(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;      

運作結果截圖: