全部產品
Search
文件中心

PolarDB:Varray

更新時間:Jul 06, 2024

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 varraytype

varray 是分配給 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