PL/SQL 集合

        集合是具有相同数据类型的有序元素组。每个元素都有一个唯一的下标来表示它在集合中的位置。

        PL/SQL提供了三种集合类型 :

  • 索引表
  • 嵌套表
  • 数组

索引表

        索引表(也称为关联数组)是一组键 - 值对。每个键都是唯一的,用来定位相应的值。键可以是整数或字符串。

1、创建索引表语法:

-- 定义索引表类型:指明值类型和键类型
TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY subscript_type;

-- 使用索引表类型定义索引表变量
table_name type_name;

2、实例

        以下示例显示了如何创建一个索引表来存储整数值以及名称,然后打印出索引表的名称和值。

DECLARE
   TYPE salary IS TABLE OF NUMBER INDEX BY VARCHAR2(20);
   salary_list salary;
   name VARCHAR2(20);
BEGIN

   -- adding elements to the table
   salary_list('Rajnish') := 62000;
   salary_list('Minakshi') := 75000;
   salary_list('Martin') := 100000;
   salary_list('James') := 78000;

   -- printing the table
   name := salary_list.FIRST;
   WHILE name IS NOT NULL LOOP
      dbms_output.put_line ('Salary of ' || name || ' is ' || TO_CHAR(salary_list(name)));
      name := salary_list.NEXT(name);
   END LOOP;
END;
/

        索引表的元素也可以是任何数据库表的%ROWTYPE或任何数据库表字段的%TYPE。 如下所示:

DECLARE
   CURSOR c_customers IS select name from customers;
   TYPE c_list IS TABLE of customers.name%type INDEX BY binary_integer;
   name_list c_list;
   counter integer :=0;
BEGIN
   FOR n IN c_customers LOOP
      counter := counter +1;
      name_list(counter) := n.name;
      dbms_output.put_line('Customer('||counter||'):'||name_list(counter));
   END LOOP;
END;
/

嵌套表

        嵌套表就像一个具有任意数量元素的一维数组。但是,嵌套表与数组在以下几个方面不同:

  • 数组是一个有声明数量的元素集合,但是一个嵌套的表没有。嵌套表的大小可以动态增加。
  • 数组总是密集的,即它总是具有连续的下标。 嵌套数组最初是密集的,但是当从其中删除元素时,它可能变得稀疏。

1、创建嵌套表语法:

-- 声明嵌套表类型,指明元素的数据类型【不用指明大小!】
TYPE type_name IS TABLE OF element_type [NOT NULL]; -- 创建嵌套表变量 table_name type_name;

        嵌套表可以存储在数据库列中。它可以进一步用于简化SQL操作,您可以使用更大的表来连接单列表。索引表不能存储在数据库中。

2、 实例

DECLARE
   TYPE names_table IS TABLE OF VARCHAR2(10); 
   TYPE grades IS TABLE OF INTEGER;
   names names_table;
   marks grades;
   total integer;
BEGIN 
   names := names_table('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;
/

        嵌套表的元素也可以是任何数据库表的%ROWTYPE或任何数据库表字段的%TYPE。如下所示:

DECLARE
   CURSOR c_customers IS SELECT name FROM customers; 
   TYPE c_list IS TABLE 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;
/

数组

        参考PL/SQL 数组

集合方法

        PL/SQL提供了内置的集合方法,使集合更易于使用。

COUNT:返回集合中的元素数目。

DELETE:从集合中除去所有元素。

DELETE (n):从索引表(关联数组)中除去元素 n。不能从 VARRAY 集合数组中除去各个元素。

DELETE(n1,n2):从索引表(关联数组)中除去所有从 n1 到 n2 的元素。不能从 VARRAY 集合数组中除去各个元素。

EXISTS (n):如果指定的元素存在,那么返回 TRUE。

EXTEND:对集合追加单一 NULL 元素。

EXTEND (n):对集合追加 n 个 NULL 元素。

EXTEND (n1, n2):对集合追加第 n2th 个元素的 n1 个副本。

FIRST:返回集合中的最小索引号。

LAST:返回集合中的最大索引号。

LIMIT:对于 VARRAY,返回最大元素数目;对于嵌套的表,返回 NULL。

NEXT (n):返回紧跟在指定索引后面的元素的索引编号。

PRIOR (n):返回紧跟在指定索引前面的元素的索引编号。

TRIM:从集合末尾除去单个元素。不能从关联数组集合类型中除去元素。

TRIM (n):从集合末尾除去 n 个元素。不能从关联数组集合类型中除去元素。

集合异常

        下表提供了集合异常情况以及何时引发:

COLLECTION_IS_NULL:尝试在一个原子空集合上进行操作。

NO_DATA_FOUND:下标指定被删除的元素或关联数组中不存在的元素。

SUBSCRIPT_BEYOND_COUNT:下标超出了集合中元素的数量。

SUBSCRIPT_OUTSIDE_LIMIT:下标超出允许的范围。

VALUE_ERROR:下标为空或不能转换为键类型。如果键定义为PLS_INTEGER范围,并且下标超出此范围,则可能会发生此异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值