FIRST/LAST

本文介绍了first/last函数的相关说明和使用示例等内容。

firstlast都是函数。如果集合至少有一个元素,则firstlast分别返回第一个和最后一个元素的索引(忽略已删除的元素,即使delete保留了占位符)。如果集合只有一个元素,则firstlast返回相同的索引。如果集合为空,则firstlast返回NULL。由于变长数组在PolarDB的内部实现中并不是一直保持稠密,因此first并不一定一直返回1,last也不一定和count一直相等。当非首尾元素被delete时,firstlast不会出现变化。

示例

以下是一个变长数组的first/last基础使用的示例。

DECLARE
  TYPE v_type IS VARRAY(3) OF NUMBER;
  varray v_type := v_type(11, 22, 33);
  PROCEDURE print(varray v_type) IS 
    i  NUMBER;
  BEGIN
    FOR i IN varray.FIRST..varray.LAST LOOP
        DBMS_OUTPUT.PUT(i || '. ');
        IF varray.EXISTS(i) THEN
          RAISE NOTICE '%. %', i, varray(i);
        ELSE
          RAISE NOTICE '%. does not exist', i;
        END IF;
    END LOOP;
    RAISE NOTICE '---';
  END;
BEGIN
  print(varray);
  varray.DELETE(2);
  print(varray);
END;

结果显示如下:

NOTICE:  1. 11
NOTICE:  2. 22
NOTICE:  3. 33
NOTICE:  ---
NOTICE:  1. 11
NOTICE:  2. does not exist
NOTICE:  3. 33
NOTICE:  ---
DO

对于关联数组来说,第一个和最后一个的定义取决于索引的排序规则。以下是一个关联数组的first/last基础使用示例。

DECLARE
  TYPE int_type IS TABLE OF INT INDEX BY PLS_INTEGER;
  TYPE char_type IS TABLE OF INT INDEX BY VARCHAR(10);
  arr1 int_type;
  arr2 char_type;
BEGIN
  arr1(1) := 1;
  arr1(10) := 10;
  arr2('a') := 1;
  arr2('z') := 10;
  RAISE NOTICE 'arr1 first: %, last: %', arr1.first, arr1.last;
  RAISE NOTICE 'arr2 first: %, last: %', arr2.first, arr2.last;
  RAISE NOTICE '------------';
  -- 删除 arr1 的一个元素
  arr1.delete(10);
  RAISE NOTICE 'arr1 first: %, last: %', arr1.first, arr1.last;
  RAISE NOTICE '------------';
  -- 删除 arr2 的全部元素
  arr2.delete;
  RAISE NOTICE 'arr2 first: %, last: %', arr2.first, arr2.last;
END;

结果显示如下:

NOTICE:  arr1 first: 1, last: 10
NOTICE:  arr2 first: a, last: z
NOTICE:  ------------
NOTICE:  arr1 first: 1, last: 1
NOTICE:  ------------
NOTICE:  arr2 first: <NULL>, last: <NULL>
DO