Oracle Database 21c に追加された FOR LOOP 構文の新機能のうち、コレクション型に対する構文を試します。
配列の初期化
従来は数値をインデックスに使った連想配列の初期化は以下のように記載する必要がありました。
DECLARE
TYPE tlist1 IS TABLE OF INTEGER INDEX BY PLS_INTEGER;
lst1 tlist1;
ind PLS_INTEGER;
BEGIN
lst1 := tlist1(1=>10, 3=>30, 5=>50, 7=>70, 9=>90);
...
Oracle Database 21c では FOR 文を使って以下のように記載できます。
DECLARE
TYPE tlist1 IS TABLE OF INTEGER INDEX BY PLS_INTEGER;
lst1 tlist1;
BEGIN
lst1 := tlist1(FOR i IN 1 .. 9 BY 2 => i*10);
VALUES OF 句
Oracle Database 21c では連想配列についても FOR 文で記述できるようになりました。
従来のバージョンでは以下のように記述が必要でした。
BEFORE_Oracle19c
DECLARE
TYPE tlist1 IS TABLE OF INTEGER INDEX BY PLS_INTEGER;
lst1 tlist1;
ind PLS_INTEGER;
BEGIN
lst1 := tlist1(1=>10, 3=>30, 5=>50, 7=>70, 9=>90);
ind := lst1.FIRST;
LOOP
IF ind IS NOT NULL THEN
DBMS_OUTPUT.PUT_LINE(ind || ' = ' || lst1(ind));
ELSE
EXIT;
END IF;
ind := lst1.NEXT(ind);
END LOOP;
END;
/
Oracle Database 21c の FOR 文では、コレクションの値を取得するために FOR 文に VALUES OF 句を指定します。
VALUES_OF
DECLARE
TYPE tlist1 IS TABLE OF INTEGER INDEX BY PLS_INTEGER;
lst1 tlist1;
BEGIN
lst1 := tlist1(FOR i IN 1 .. 9 BY 2 => i*10);
FOR val IN VALUES OF lst1 LOOP
DBMS_OUTPUT.PUT_LINE(val);
END LOOP;
END;
/
10
30
50
70
90
INDICES OF 句
コレクションの添え字を FOR 文で取得する場合には INDICES OF 句を指定します。
INDICES_OF
DECLARE
TYPE tlist1 IS TABLE OF INTEGER INDEX BY PLS_INTEGER;
lst1 tlist1;
BEGIN
lst1 := tlist1(FOR i IN 1 .. 9 BY 2 => i*10);
FOR ind IN INDICES OF lst1 LOOP
DBMS_OUTPUT.PUT_LINE(ind || ' = ' || lst1(ind));
END LOOP;
END;
/
1 = 10
3 = 30
5 = 50
7 = 70
9 = 90
PAIRS OF 句
コレクションの添え字と値の両方を FOR 文のイテレータとして取得する場合は PAIRS OF 句を指定します。
PAIRS_OF
DECLARE
TYPE tlist1 IS TABLE OF VARCHAR2(100) INDEX BY VARCHAR2(100);
lst1 tlist1;
BEGIN
lst1 := tlist1('key1'=>'val1', 'key2'=>'val2', 'key3'=>'val3');
FOR ind1, ind2 IN PAIRS OF lst1 LOOP
DBMS_OUTPUT.PUT_LINE(ind1 || ' = ' || ind2);
END LOOP;
END;
/
key1 = val1
key2 = val2
key3 = val3