9. PL/SQL VARRAY

PL/SQL提供叫一種叫做VARRAY的資料結構,其可儲存相同類型的一個固定大小的連續集合。VARRAY用於儲存資料的有序集合,但它往往是更加有用認為數組作為相同類型的變數的集合。
所有可變數組由連續的儲存位置。最低的地址對應於第一個位元和最高地址的最後一個位元。
VARRAY是所有集合類型資料的一部分,並且它代表了可變大小的的陣列。在一個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區塊建置VARRAY類型的基本語法:
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

下面的程序說明了使用可變varry:


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;
/


結果如下:


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環境中,可varry的起始索引始終為1
·       可以初始化使用VARRAY類型,它具有相同的名稱變長數組的構造方法VARRAY位元
·       可變數組是一維陣列
·       一個VARRAY當它被聲明自動為NULL值,必須初始化之前,它的位元可以被引用

範例 2

VARRAY的位元也可以是任何%TYPE任何資料庫表或%ROWTYPE資料庫表的字段。下面的例子說明了這個概念:
我們將使用儲存在資料庫中的CUSTOMERS Table:


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;
/


結果如下:
Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal
PL/SQL procedure successfully completed.

沒有留言:

張貼留言