PL/SQL编程语言提供了一种称为VARRAY
的数据结构,它可以存储相同类型的元素的固定大小顺序集合。varray
用于存储有序的数据集合,但通常最好将数组视为相同类型变量的集合。
所有varray
是由连续的内存位置组成。最低的地址对应于第一个元素,而最后一个元素的地址最高。参考以下图示 -
数组是集合类型数据的一部分,表示可变大小的数组。
varray
中的每个元素都具有与之相关联的索引。它还具有可以动态更改的容量(大小)。
创建Varray类型
使用CREATE TYPE
语句创建varray
类型。必须指定存储在varray
中的元素的最大容量(大小)和类型。
在模式(schema)级创建VARRAY
类型的基本语法是 -
CREATE OR REPLACE TYPE varray_type_name IS VARRAY(n) of <element_type>
其中,
varray_type_name
是一个有效的属性名称;n
是varray
中元素的数量(最大值);element_type
是数组元素的数据类型。
可以使用ALTER TYPE
语句更改变量的最大大小
例如 -
CREATE Or REPLACE TYPE namearray AS VARRAY(3) OF VARCHAR2(10);
/
在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
以下程序说明了如何使用varrays
-
SQL> declare
2 type namearray is varray(5) of varchar2(10);
3 type grades is varray(5) of integer;
4 names namearray;
5 marks grades;
6 total integer;
7 begin
8 names := namearray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz');
9 marks := grades(98, 97, 78, 87, 92);
10 total := names.count;
11 dbms_output.put_line('Total ' || total || ' Students ');
12 for i in 1 .. total loop
13 dbms_output.put_line('Student: ' || names(i) || '
14 Marks: ' || marks(i));
15 end loop;
16 end;
17 /
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环境中,
varrays
的起始索引始终为1
。 - 可以使用
varray
类型的构造方法初始化varray
元素,该方法与varray
具有相同的名称。 varrays
是一维数组。varray
在声明时自动为NULL
,并且必须在引用元素之前初始化它。
示例-2
变量的元素也可以是任何数据库表的%ROWTYPE
或任何数据库表字段的%TYPE
表来引用表示。 以下示例说明了这个概念。
将使用数据库中存储的CUSTOMERS
表,结构和数据如下所示 -
以下示例使用游标引用。参考以下代码 -
SQL> declare
2 cursor c_customers is
3 select name from customers;
4 type c_list is varray (6) of customers.name% type;
5 name_list c_list := c_list();
6 counter integer := 0;
7 begin
8 for n in c_customers loop
9 counter := counter + 1;
10 name_list.extend;
11 name_list(counter) := n.name;
12 dbms_output.put_line('Customer(' || counter || '):' || name_list(counter));
13 end loop;
14 end;
15 /
Customer(1):罗大牛
Customer(2):Maxsu
Customer(3):Hinew
Customer(4):李小路
Customer(5):张友德
Customer(6):李连定
PL/SQL procedure successfully completed