delete是一个过程,用于从集合中删除元素。

delete的形式如下:

  • collection.delete():从任何类型的集合中删除所有元素,该操作会立即释放分配给已删除元素的内存。

  • collection.delete(index):删除索引为index的元素(如果该元素存在),否则,不进行任何操作。

对于变长数组和嵌套表,PL/SQL会在delete操作后保留已删除元素的占位符。因此,删除的元素包含在集合的内部大小中,您可以通过为其分配有效值来恢复删除的元素。

示例

以下是一个嵌套表删除元素后访问的示例。

DECLARE
  TYPE nt_type IS TABLE OF INT;
  nt nt_type := nt_type(1, 2);
BEGIN
  nt.delete(1);
  RAISE NOTICE '%', nt(1); -- 抛出异常, 访问已经被删除的元素
END;

结果显示如下:

ERROR:  cannot access deleted element
CONTEXT:  PL/SQL function inline_code_block line 6 at RAISE

以下是一个嵌套表删除元素后,重新赋值给该位置的示例。

DECLARE
  TYPE nt_type IS TABLE OF INT;
  nt nt_type := nt_type(1, 2);
BEGIN
  nt.delete(1);
  nt(1) := 3; -- 重新赋值
  RAISE NOTICE '%', nt(1);
END;

结果显示如下:

NOTICE:  3
DO

对于关联数组,PL/SQL会在delete操作后真正删除该元素。因此,当您试图访问一个被删除元素时,会出现不存在该元素的异常,而不是尝试访问一个被删除元素。新的相同索引位置的替换元素不与相应的已删除元素占用相同的内存。以下是一个关联数组删除元素后访问的示例。

DECLARE
  TYPE arr_type IS TABLE OF INT INDEX BY PLS_INTEGER;
  arr arr_type;
BEGIN
  arr(1) := 10;
  RAISE NOTICE '%', arr(1);
  arr.delete(1);
  RAISE NOTICE '%', arr(1); -- 抛出异常, 访问不存在的元素
END;

结果显示如下:

NOTICE:  10
ERROR:  associatvie arrays element is not exist
CONTEXT:  PL/SQL function inline_code_block line 8 at RAISE

以下是一个关联数组删除元素后,重新赋值给该位置的示例。

DECLARE
  TYPE arr_type IS TABLE OF INT INDEX BY PLS_INTEGER;
  arr arr_type;
BEGIN
  arr(1) := 10;
  RAISE NOTICE '%', arr(1);
  arr.delete(1);
  arr(1) := 20; -- 重新赋值
  RAISE NOTICE '%', arr(1);
END;

结果显示如下:

NOTICE:  10
NOTICE:  20
DO