Skip to content

集合方法

概述

集合方法是一系列返回有关集合的信息的函数或对集合进行操作的过程,详细信息如下表所示。

集合方法描述使用限制
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数组创建时指定的SIZEVARRAY
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用于返回集合中可访问的元素数量。使用EXTENDTRIMDELETE时会影响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

说明

FIRSTLAST分别用于返回第一个和最后一个元素的索引。如果集合只有一个元素,则FIRSTLAST返回相同的索引。如果集合为空,则FIRSTLAST返回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