PL/SQL程序設計語言提供叫一種叫做VARRAY的數據結構,其可存儲相同類型元素的一個固定大小的連續集合。VARRAY用於存儲數據的有序集合,但它往往是更加有用認為數組作為相同類型的變量的集合。
所有可變數組由連續的存儲位置。最低的地址對應於第一元素和最高地址的最後一個元素。
數組是所有集合類型數據的一部分,並且它代表了可變大小的的陣列。我們將研究其他集合類型在後面的“PL/SQL集合”章節。
在一個VARRAY每個元素都有與其相關聯的索引。它還具有可以動態改變一個最大大小。
一個VARRAY類型是用CREATE TYPE語句創建。必須指定最大長度,並存儲在VARRAY元素的類型。
對於在架構層面創造一個VRRAY類型的基本語法:
CREATE OR REPLACE TYPE varray_type_name IS VARRAY(n) of <element_type>
這裡,
varray_type_name 就是一個有效的屬性名
n是VARRAY元素(最大值)的數目
element_type 就是所述數組的元素的數據類型。
VARRAY的最大長度可以使用ALTER TYPE語句來改變。
例如,
CREATE Or REPLACE TYPE namearray AS VARRAY(3) OF VARCHAR2(10); / Type created.
PL/SQL塊創建VRRAY類型的基本語法:
TYPE varray_type_name IS VARRAY(n) of <element_type>
示例,
TYPE namearray IS VARRAY(5) OF VARCHAR2(10); Type grades IS VARRAY(5) OF INTEGER;
下面的程序說明了使用可變數組:
DECLARE type namesarray IS VARRAY(5) OF VARCHAR2(10); type grades IS VARRAY(5) OF INTEGER; names namesarray; marks grades; total integer; BEGIN names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); marks:= grades(98, 97, 78, 87, 92); total := names.count; dbms_output.put_line('Total '|| total || ' Students'); FOR i in 1 .. total LOOP dbms_output.put_line('Student: ' || names(i) || ' Marks: ' || marks(i)); END LOOP; END; /
當上述代碼在SQL提示符執行時,它產生了以下結果:
Student: Kavita Marks: 98 Student: Pritam Marks: 97 Student: Ayan Marks: 78 Student: Rishav Marks: 87 Student: Aziz Marks: 92 PL/SQL procedure successfully completed.
請注意:
在Oracle環境中,可變數組的起始索引始終為1
可以初始化使用VARRAY類型,它具有相同的名稱變長數組的構造方法VARRAY元素
可變數組是一維陣列
一個VARRAY當它被聲明自動為NULL值,必須初始化之前,它的元素可以被引用
VARRAY的元素也可以是任何%TYPE任何數據庫表或%ROWTYPE數據庫表的字段。下面的例子說明了這個概念:
我們將使用存儲在數據庫中的CUSTOMERS表:
Select * from customers; +----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | +----+----------+-----+-----------+----------+
以下是使用游標示例:
DECLARE CURSOR c_customers is SELECT name FROM customers; type c_list is varray (6) of customers.name%type; name_list c_list := c_list(); counter integer :=0; BEGIN FOR n IN c_customers LOOP counter := counter + 1; name_list.extend; name_list(counter) := n.name; dbms_output.put_line('Customer('||counter ||'):'||name_list(counter)); END LOOP; END; /
當上述代碼在SQL提示符執行時,它產生了以下結果:
Customer(1): Ramesh Customer(2): Khilan Customer(3): kaushik Customer(4): Chaitali Customer(5): Hardik Customer(6): Komal PL/SQL procedure successfully completed.