varray 或大小可變數組是一種將正整數與值相關聯的集合。它在許多方面與巢狀表格類似。
varray 具有以下特徵:
- varray 類型必須與最大大小限制一起定義。定義 varray 類型後,可以聲明該 varray 類型的varray 變數。使用 varray 變數(或簡稱為“varray”)進行資料操作。varray 中的元素數量不能超過 varray 類型定義中確定的最大大小限制。
- 聲明 varray 變數時,varray 最初不存在(它是一個 null 集合)。必須使用建構函式初始化 null varray。您還可以使用指派陳述式初始化 varray,其中賦值的右側是相同類型的初始化 varray。
- 鍵是正整數。
- 建構函式確定 varray 中元素的數量,該數量不得超過最大大小限制。EXTEND 方法可以向 varray 添加其他元素,直到達到最大大小限制。
- 與巢狀表格不同,varray 不能是稀疏的 - 索引值的賦值中沒有間隙。
- 嘗試引用超出其初始化大小或擴充大小,但未超出最大大小限制的 varray 元素將導致 SUBSCRIPT_BEYOND_COUNT 異常。
- 嘗試引用超出最大大小限制的 varray 元素或嘗試將 varray 擴充到超出最大大小限制將導致 SUBSCRIPT_OUTSIDE_LIMIT 異常。
TYPE IS VARRAY 語句用於在 SPL 程式的聲明部分中定義 varray 類型。
TYPE varraytype IS { VARRAY | VARYING ARRAY }(maxsize)
OF { datatype | objtype };varraytype 是分配給 varray 類型的標識符。datatype 是純量資料型別,例如 VARCHAR2 或 NUMBER。maxsize 是該類型的 varray 中允許的最大元素數。objtype 是先前定義的物件類型。
CREATE TYPE 命令可用於定義可供資料庫中所有 SPL 程式使用的 varray 類型。為了使用該 varray,必須使用聲明一個該 varray 類型的變數。以下是聲明 varray 變數的文法。
varray varraytypevarray 是分配給 varray 的標識符。varraytype 是先前定義的 varray 類型的標識符。
varray 使用 varray 類型的建構函式初始化。
varraytype ([ { expr1 | NULL } [, { expr2 | NULL } ]
[, ...] ])varraytype 是 varray 類型的建構函式的標識符,它與 varray 類型具有相同的名稱。expr1, expr2, … 是與 varray 的元素類型相容的運算式。如果指定 NULL,則會將相應的元素設定為 null。如果參數列表為空白,則返回空的 varray,這意味著表中沒有元素。如果 varray 是從物件類型定義的,則 exprn 必須返回該物件類型的對象。該對象可以是函數的傳回值或物件類型建構函式的傳回值。該對象也可以是具有相同 varray 類型的另一個 varray 的元素。
如果將 EXISTS 之外的集合方法應用於未初始化的 varray,則會引發 COLLECTION_IS_NULL 異常。
以下是 varray 的建構函式樣本:
DECLARE
TYPE varray_typ IS VARRAY(2) OF CHAR(1);
v_varray varray_typ := varray_typ('A','B');使用以下文法引用 varray 的元素。
varray(n)[.element ]varray 是先前聲明的 varray 的標識符。n 是正整數。如果 varray 的 varray 類型是從物件類型定義的,那麼 [.element ] 必須引用定義 varray 類型時所依據的物件類型中的屬性。或者,可以通過省略 [.element ]來引用整個對象。
以下是 varray 的樣本,已知其中將有四個元素。
DECLARE
TYPE dname_varray_typ IS VARRAY(4) OF VARCHAR2(14);
dname_varray dname_varray_typ;
CURSOR dept_cur IS SELECT dname FROM dept ORDER BY dname;
i INTEGER := 0;
BEGIN
dname_varray := dname_varray_typ(NULL, NULL, NULL, NULL);
FOR r_dept IN dept_cur LOOP
i := i + 1;
dname_varray(i) := r_dept.dname;
END LOOP;
DBMS_OUTPUT.PUT_LINE('DNAME');
DBMS_OUTPUT.PUT_LINE('----------');
FOR j IN 1..i LOOP
DBMS_OUTPUT.PUT_LINE(dname_varray(j));
END LOOP;
END;上面的樣本產生以下輸出:
DNAME
----------
ACCOUNTING
OPERATIONS
RESEARCH
SALES