位置:首頁 > 數據庫 > PL/SQL教學 > PL/SQL數組

PL/SQL數組

PL/SQL程序設計語言提供叫一種叫做VARRAY的數據結構,其可存儲相同類型元素的一個固定大小的連續集合。VARRAY用於存儲數據的有序集合,但它往往是更加有用認為數組作為相同類型的變量的集合。

所有可變數組由連續的存儲位置。最低的地址對應於第一元素和最高地址的最後一個元素。

Varrays in PL/SQL

數組是所有集合類型數據的一部分,並且它代表了可變大小的的陣列。我們將研究其他集合類型在後麵的“PL/SQL集合”章節。

在一個VARRAY每個元素都有與其相關聯的索引。它還具有可以動態改變一個最大大小。

創建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;

示例 1

下麵的程序說明了使用可變數組:

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值,必須初始化之前,它的元素可以被引用

示例 2

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.