コレクションに少なくとも1つの要素が存在する場合、FIRST と LAST はそれぞれ最初の要素と最後の要素のインデックスを返します(削除された要素は無視されます。ただし、DELETE がその要素に対してプレースホルダーを保持している場合は例外です)。
コレクションに1つの要素しかない場合、FIRST と LAST は同じインデックスを返します。コレクションが空の場合、FIRST と LAST は NULL を返します。
適用対象
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみを提供します。
関連配列の使用方法
インデックスタイプが PLS_INTEGER の関連配列では、最初の要素と最後の要素はそれぞれ最小および最大のインデックスを持つ要素です。インデックスタイプが文字列の関連配列では、最初の要素と最後の要素はそれぞれ最小および最大のキー値を持つ要素です。
例:
obclient> DECLARE
TYPE numlist IS TABLE OF NUMBER INDEX BY VARCHAR2(5);
nl NUMLIST;
PROCEDURE print_first_and_last IS
BEGIN
DBMS_OUTPUT.PUT_LINE('FIRST = ' || nl.FIRST);
DBMS_OUTPUT.PUT_LINE('LAST = ' || nl.LAST);
END print_first_and_last;
BEGIN
nl('A') := 2;
nl('C') := 4;
nl('D') := 6;
nl('E') := 8;
nl('B') := 10;
DBMS_OUTPUT.PUT_LINE('Before deleting:');
print_first_and_last;
nl.DELETE('A');
nl.DELETE('E');
DBMS_OUTPUT.PUT_LINE('After deleting:');
print_first_and_last;
END;
/
Query OK, 0 rows affected
Before deleting:
FIRST = A
LAST = E
After deleting:
FIRST = B
LAST = D
上記の例は、インデックスタイプが文字列の関連配列の FIRST と LAST の値を表示し、次に最初と最後の要素を削除してから、再び FIRST と LAST の値を表示します。
変動配列の使用方法
空でない変動配列に対して、FIRST は常に 1 を返します。任意の変動配列に対して、LAST は常に COUNT と等しくなります。
例:
obclient> DECLARE
TYPE players IS VARRAY(5) OF VARCHAR2(20);
name PLAYERS;
PROCEDURE print_name (heading VARCHAR2) IS
BEGIN
DBMS_OUTPUT.PUT_LINE(heading);
IF name IS NULL THEN
DBMS_OUTPUT.PUT_LINE('Does not exist');
ELSIF name.FIRST IS NULL THEN
DBMS_OUTPUT.PUT_LINE('No members');
ELSE
FOR i IN name.FIRST..name.LAST LOOP
DBMS_OUTPUT.PUT_LINE(i || '. ' || name(i));
END LOOP;
END IF;
DBMS_OUTPUT.PUT_LINE('---');
END;
BEGIN
print_name('Team Members:');
name := PLAYERS(); -- チームにメンバーがいません
print_name('Team Members:');
name := players('Andrew', 'Barton');
print_name('Team Members:');
name := players('Charles', 'Carl', 'James', 'Gary','Brian');
print_name('New Team Members:');
END;
/
Query OK, 0 rows affected
Team Members:
Does not exist
---
Team Members:
No members
---
Team Members:
1. Andrew
2. Barton
---
New Team Members:
1. Charles
2. Carl
3. James
4. Gary
5. Brian
---
ネストテーブルでの使用方法
ネストテーブルにおいて、LAST は COUNT と等しくなりますが、中央から要素を削除する場合を除き、LAST は COUNT より大きくなります。
例:
obclient> DECLARE
TYPE players IS TABLE OF VARCHAR2(20);
name PLAYERS;
PROCEDURE print_name (heading VARCHAR2) IS
BEGIN
DBMS_OUTPUT.PUT_LINE(heading);
IF name IS NULL THEN
DBMS_OUTPUT.PUT_LINE('Does not exist');
ELSIF name.FIRST IS NULL THEN
DBMS_OUTPUT.PUT_LINE('No members');
ELSE
FOR i IN name.FIRST..name.LAST LOOP
DBMS_OUTPUT.PUT_LINE(i || '.');
IF name.EXISTS(i) THEN
DBMS_OUTPUT.PUT_LINE(name(i));
ELSE
DBMS_OUTPUT.PUT_LINE('TBD');
END IF;
END LOOP;
END IF;
DBMS_OUTPUT.PUT_LINE('---');
END;
BEGIN
print_name('Team Members:');
name := players(); -- サッカーチームは存在しますが、選手はいません
print_name('Team Members:');
name := players('Charles', 'Carl', 'James', 'Gary','Brian'); -- 選手を追加
print_name('Team Members:');
name.DELETE(3,4); -- 3番目と4番目の選手を削除
print_name('Current Team Members:');
END;
/
Query OK, 0 rows affected
Team Members:
Does not exist
---
Team Members:
No members
---
Team Members:
1.
Charles
2.
Carl
3.
James
4.
Gary
5.
Brian
---
Current Team Members:
1.
Charles
2.
Carl
3.
TBD
4.
TBD
5.
Brian
---
上記の例では、team.FIRST と team.LAST を持つ FOR LOOP ステートメントを使用して、ネストテーブル name を出力します。ネストテーブルは疎である可能性があるため、team.EXISTS(i) が TRUE の場合にのみ、FOR LOOP ステートメントは team(i) を出力します。