集合是具有相同数据类型的有序元素组。每个元素都有一个唯一的下标来表示它在集合中的位置。
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范围,并且下标超出此范围,则可能会发生此异常。