在本章中,我们将讨论学习pl/sql中的数组。 pl/sql编程语言提供了一种称为varray
的数据结构,它可以存储相同类型的元素的固定大小顺序集合。varray
用于存储有序的数据集合,但通常最好将数组视为相同类型变量的集合。
所有varray
是由连续的内存位置组成。最低的地址对应于第一个元素,而最后一个元素的地址最高。参考以下图示 -
数组是集合类型数据的一部分,表示可变大小的数组。 我们将在后面的“pl/sql集合”这一章中学习其他集合类型。
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
-
set serveroutput on size 99999;
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提示符下执行时,它会产生以下结果 -
请注意 -
varrays
的起始索引始终为1
。varray
类型的构造方法初始化varray
元素,该方法与varray
具有相同的名称。varrays
是一维数组。varray
在声明时自动为null
,并且必须在引用元素之前初始化它。示例-2
变量的元素也可以是任何数据库表的%rowtype
或任何数据库表字段的%type
表来引用表示。 以下示例说明了这个概念。
将使用数据库中存储的customers
表,结构和数据如下所示 -
create table customers
( id number(10) not null,
name varchar2(50) not null,
age number(2) not null,
address varchar2(50),
salary float(2) not null,
constraint customers_pk primary key (id)
);
insert into customers (id,name,age,address,salary) values(1, '罗大牛',32,'北京', 22999.00);
insert into customers (id,name,age,address,salary) values(2, 'maxsu',25,'海口', 5999.00);
insert into customers (id,name,age,address,salary) values(3, 'hinew',22,'广州', 9800.98);
insert into customers (id,name,age,address,salary) values(4, '李小路',26,'北京', 18700.00);
insert into customers (id,name,age,address,salary) values(5, '张友德',28,'上海', 18999.00);
insert into customers (id,name,age,address,salary) values(6, '李连定',42,'深圳', 32999.00);
以下示例使用游标引用(有关游标将在单独的章节中详细介绍和学习)。参考以下代码 -
set serveroutput on size 99999;
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提示符下执行时,它会产生以下结果 -