集合方法
概述
集合方法是一系列返回有关集合的信息的函数或对集合进行操作的过程,详细信息如下表所示。
集合方法 | 描述 | 使用限制 |
---|---|---|
DELETE | 删除集合所有元素 | 通用 |
DELETE(n) | 删除集合下标为n的元素 | 对VARRAY非法 |
DELETE(n,m) | 删除集合下标为n~m的元素 | 对VARRAY非法 |
TRIM | 从集合末端开始删除1个元素 | 对ITABLE非法 |
TRIM(n) | 从集合末端开始删除n个元素 | 对ITABLE非法 |
EXTEND | 为集合添加一个元素,初始值为NULL | 对ITABLE非法 |
EXTEND(n) | 为集合添加n个元素,初始值为NULL | 对ITABLE非法 |
EXTEND(n,m) | 为集合添加n个元素,初始值为m | 对ITABLE非法 |
EXISTS(n) | 若下标为n的元素存在时,返回TRUE | 通用 |
COUNT或COUNT() | 该集合元素的数目 | 通用 |
LIMIT | 返回VARRAY数组创建时指定的SIZE | VARRAY |
FIRST或FIRST() | 返回第一个元素索引号,空返回NULL | 通用 |
LAST或LAST() | 返回最后一个元素索引号,空返回NULL | 通用 |
PRIOR(n) | 返回当前元素n的前一个索引号,空返回NULL | 通用 |
NEXT(n) | 返回当前元素n的下一个索引号,空返回NULL | 通用 |
DELETE
说明
DELETE
用于删除集合中的元素。
DELETE
有三种形式:
DELETE
:从集合中删除所有元素,适用于三种类型的集合。DELETE(n)
:删除索引为n的元素(如果该元素存在),否则不进行任何操作,不适用于VARRAY。DELETE(n, m)
:删除索引n~m的元素,不适用于VARRAY。
DELETE
删除元素不会删除该元素的占位符,可以直接赋值给被删除元素进行恢复。
示例
sql
DECLARE
TYPE e_type IS TABLE OF NUMBER;
e e_type := e_type(1, 2, 3, 4);
BEGIN
-- 删除索引2到5的元素(5不存在)
e.DELETE(2, 5);
FOR i IN e.FIRST .. e.LAST LOOP
SEND_MSG(e(i));
END LOOP;
-- 重新赋值索引2的元素
e.(2) := 22;
FOR i IN e.FIRST .. e.LAST LOOP
SEND_MSG(e(i));
END LOOP;
END;
/
-- 输出
1
-- 第二次操作输出,被DELETE删除的元素可以直接重新赋值
1
22
TRIM
说明
TRIM
用于从变长数组或嵌套表的末尾删除元素并销毁位置,不支持索引表。
TRIM
有两种形式:
TRIM
:如果集合至少有一个元素,则TRIM从集合末尾删除1个元素;反之会报错[E5210] 下标1超界
。TRIM(n)
:如果集合末尾至少有n个元素,则从集合末尾删除n个元素;反之会报错[E5210] 下标n超界
。
DELETE
删除一个元素但会保留占位符,而TRIM
处理时会认为该元素存在(占据一个位置),将被删除元素的占位符销毁。因此,TRIM
可以销毁已删除的元素。
示例
sql
DECLARE
TYPE e_type IS TABLE OF NUMBER;
e e_type := e_type(1, 2, 3, 4);
BEGIN
-- 从集合末端开始删除2个元素
e.TRIM(2);
FOR i IN e.FIRST .. e.LAST LOOP
SEND_MSG(e(i));
END LOOP;
END;
/
-- 输出
1
2
EXTEND
说明
EXTEND
用于添加元素位置到变长数组或嵌套表的末尾,并将其设置为NULL
,不适用于索引表。
EXTEND
有三种形式:
EXTEND
:新增一个NULL元素到集合尾部。EXTEND(n)
:新增n个NULL元素到集合尾部。EXTEND(n, m)
:新增n个元素到集合尾部,并且给它们赋值索引为m的值。
示例
sql
DECLARE
TYPE e_type IS VARRAY(10) OF VARCHAR(10);
e e_type;
BEGIN
-- 增加1个元素
e.EXTEND();
-- 赋值为yi
e(1):='yi';
-- 增加2个元素
e.EXTEND(2);
-- 给索引为3的元素赋值为san
e(3):='san';
-- 再增加2个元素,并且为它们赋值索引为3的值,即san
e.EXTEND(2, 3);
FOR i IN 1..e.COUNT() LOOP
SEND_MSG(e(i));
END LOOP;
END;
/
-- 输出
yi
NULL
san
san
san
EXISTS
说明
EXISTS
用于显示指定元素是否存在。
如果集合的第n个元素存在,则EXISTS(n)
返回true,否则返回false。如果n超出范围,EXISTS
将返回false。对于已删除的元素,EXISTS(n)
返回false。
示例
sql
DECLARE
TYPE e_type IS TABLE OF NUMBER;
e e_type := e_type(1, 2);
BEGIN
e.DELETE(2);
SEND_MSG(e.EXISTS(1));
SEND_MSG(e.EXISTS(2));
SEND_MSG(e.EXISTS(3));
END;
/
--输出
true
false
false
COUNT
说明
COUNT
用于返回集合中可访问的元素数量。使用EXTEND
、TRIM
、DELETE
时会影响COUNT
的结果。
示例
sql
DECLARE
TYPE e_type IS TABLE OF NUMBER;
e e_type := e_type(1, 2);
BEGIN
SEND_MSG(e.COUNT);
-- 为集合添加1个元素
e.EXTEND(1);
SEND_MSG(e.COUNT);
-- 从集合末端开始销毁2个元素
e.TRIM(2);
SEND_MSG(e.COUNT);
-- 删除第1个元素
e.DELETE(1);
SEND_MSG(e.COUNT);
END;
/
-- 输出
2
3
1
0
FIRST/LAST
说明
FIRST
和LAST
分别用于返回第一个和最后一个元素的索引。如果集合只有一个元素,则FIRST
和LAST
返回相同的索引。如果集合为空,则FIRST
和LAST
返回NULL
。
示例
sql
DECLARE
TYPE e_type IS TABLE OF NUMBER;
e e_type := e_type(1, 2, 3);
BEGIN
SEND_MSG(e.FIRST);
SEND_MSG(e.LAST);
-- 删除索引为1和2的元素
e.DELETE(1,2);
SEND_MSG(e.FIRST);
SEND_MSG(e.LAST);
-- 删除索引为3的元素
e.DELETE(3);
SEND_MSG(e.FIRST);
SEND_MSG(e.LAST);
END;
/
-- 输出
1
3
3
3
NULL
NULL
PRIOR/NEXT
说明
给定一个索引,PRIOR
返回集合中的前一个现有元素的索引(如果存在),否则,PRIOR
返回NULL
。同理,NEXT
返回集合中的后一个现有元素的索引(如果存在),否则,NEXT
返回NULL
。
给定的索引不一定存在,PRIOR和NEXT会根据索引类型的排序顺序查找前一个或后一个索引。
示例
sql
DECLARE
TYPE e_type IS TABLE OF NUMBER;
e e_type := e_type(1, 2, 3, 4);
BEGIN
SEND_MSG(e.PRIOR(1));
SEND_MSG(e.NEXT(1));
e.DELETE(2);
-- 给定的索引不一定存在
SEND_MSG(e.PRIOR(2));
SEND_MSG(e.NEXT(2));
END;
/
-- 输出
NULL
2
1
3
LIMIT
说明
LIMIT
用于返回集合的最大元素数。如果集合没有最大元素数,则LIMIT
返回NULL
。只有VARRAY
需要设定最大元素数。
示例
sql
DECLARE
TYPE e_type IS TABLE OF INT;
TYPE I_type IS TABLE OF INT INDEX BY PLS_INTEGER;
TYPE v_type IS VARRAY(10) of INT;
e e_type;
I I_type;
v v_type;
BEGIN
-- 分别输出嵌套表、索引表和VARRAY数组创建时的SIZE
SEND_MSG(e.LIMIT);
SEND_MSG(i.LIMIT);
SEND_MSG(v.LIMIT);
END;
/
-- 输出
NULL
NULL
10