1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PL/SQLの新しいFOR LOOP構文を試す(2)(Oracle Database 21c)

Last updated at Posted at 2021-10-14

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
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?