全部產品
Search
文件中心

PolarDB:FIRST/LAST

更新時間:Jul 06, 2024

本文介紹了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