trim是一个过程,用于从变长数组或嵌套表的末尾删除元素并销毁位置(以下简称为销毁元素)。

trim的形式如下:

  • collection.trim():如果集合至少有一个元素,则TRIM从集合末尾销毁元素;否则,会引发预定义的异常SUBSCRIPT_BEYOND_COUNT

  • collection.trim(index):如果集合末尾至少有n个元素,则从集合末尾销毁n个元素;否则,会引发预定义的异常SUBSCRIPT_BEYOND_COUNT

trim对集合的内部大小进行操作。如果delete删除一个元素但为其保留占位符,则trim认为该元素存在(因为它依然占据一个位置)。因此,trim可以销毁已删除的元素。PL/SQL不保留被销毁元素的占位符,因此,被销毁的元素不包含在集合的内部大小中,并且您无法通过为其分配有效值来恢复被销毁的元素。

说明

请不要依赖trimdelete之间的交互。将嵌套表视为固定大小的数组(仅使用delete)或堆栈(仅使用trimextend)。

示例

以下是一个销毁元素后访问的示例。

DECLARE
  TYPE nt_type IS TABLE OF INT;
  nt nt_type := nt_type(1);
BEGIN
  RAISE NOTICE '%', nt(1);
  nt.trim(); -- 销毁最后一个元素
  RAISE NOTICE '%', nt(1); -- 访问越界
END;

结果显示如下:

NOTICE:  1
ERROR:  subscript beyond count
CONTEXT:  PL/SQL function inline_code_block line 7 at RAISE

以下是一个销毁过多的元素的示例。

DECLARE
  TYPE nt_type IS TABLE OF INT;
  nt nt_type := nt_type(1);
BEGIN
  nt.trim(2); -- 销毁最后两个元素(超过集合内的元素个数)
END;

结果显示如下:

ERROR:  subscript beyond count
CONTEXT:  SQL statement "CALL nt.trim(2)"
PL/SQL function inline_code_block line 5 at CALL