9、PL/SQL数组

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

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值