PL/SQL - 数组



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

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

Varrays in PL/SQL

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

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

创建 VARRAY 类型

VARRAY 类型是使用CREATE TYPE语句创建的。您必须指定 VARRAY 的最大大小和存储在 VARRAY 中的元素的类型。

在模式级别创建 VARRAY 类型的基本语法如下:

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

其中:

  • varray_type_name 是一个有效的属性名称,
  • n 是 VARRAY 中的元素数量(最大值),
  • 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;

现在让我们来看几个例子来理解这个概念:

示例 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. 

请注意

  • 在 Oracle 环境中,VARRAY 的起始索引始终为 1。

  • 您可以使用 VARRAY 类型的构造函数方法(与 VARRAY 同名)初始化 VARRAY 元素。

  • VARRAY 是一维数组。

  • 声明 VARRAY 时,它会自动为空,并且必须在引用其元素之前进行初始化。

示例 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 | 
+----+----------+-----+-----------+----------+ 

以下示例使用了游标,您将在单独的章节中详细学习。

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. 
广告