Plsql 简明教程

PL/SQL - Arrays

在本章中,我们将讨论 PL/SQL 中的数组。PL/SQL 编程语言提供了一个称为 VARRAY 的数据结构,它可以存储相同类型元素的固定大小顺序集合。varray 用于存储有序数据集合,但是往往最好将数组视为相同类型变量的集合。

所有 varray 均由连续的内存位置组成。最低地址对应于第一个元素,最高地址对应于最后一个元素。

varrays

数组是集合类型数据的一部分,它代表可变大小的数组。我们将在后面一章中学习其他集合类型 'PL/SQL Collections'

varray 中的每个元素都有一个与之关联的索引。它还具有可以动态更改的最大大小。

Creating a Varray Type

Varray 类型由 CREATE TYPE 语句创建。你必须指定 varray 中存储的最大大小和元素类型。

在模式级别创建 VARRAY 类型的基本句法是 −

CREATE OR REPLACE TYPE varray_type_name IS VARRAY(n) of <element_type>

其中,

  1. varray_type_name 是一个有效的属性名,

  2. n 是 varray 中的元素数(最大值),

  3. element_type 是数组元素的数据类型。

可以使用 ALTER TYPE 语句更改 varray 的最大大小。

例如,

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;

现在让我们通过几个示例来理解这个概念 -

Example 1

以下程序说明了 varray 的使用 −

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 提示符下执行时,它会生成以下结果:

Total 5 Students
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.

Please note

  1. 在 Oracle 环境中,varray 的起始索引始终为 1。

  2. 你可以使用与 varray 同名的 varray 类型的构造方法来初始化 varray 元素。

  3. Varrays are one-dimensional arrays.

  4. varray 在声明时会自动变为 NULL,并且必须在引用其元素之前对其进行初始化。

Example 2

varray 的元素也可以是数据库表的任何 %ROWTYPE 或数据库表字段的任何 %TYPE。以下示例对该概念进行了说明。

我们将使用存储在数据库中的 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 |
+----+----------+-----+-----------+----------+

下面的示例使用 cursor ,你将在另一章中详细学习它。

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.