e-learning、オラクル研修、LMS(学習管理システム)のiStudy

e-learning、オラクル研修、LMS(学習管理システム)のiStudy

第14回 「結合配列をキー値の順番にソートする方法」

2012.03.26

今回はコレクションの結合配列(PL/SQL表、索引付表)の属性について解説します。
それらの属性を使って、キー値の順番にソートして値を取り出す方法を紹介します。
よくあるニーズです。

では、早速、以下のプログラムをご覧ください。

SQL> SET SERVEROUTPUT ON
SQL> L
  1  DECLARE
  2    TYPE A_TYPE IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER;
  3    A    A_TYPE;
  4    I    BINARY_INTEGER;
  5  BEGIN
  6    A(5) := 'ファイブ';
  7    A(-3) := 'マイナススリー';
  8    A(0) := 'ゼロ';
  9    A(7) := 'セブン';
10    A(-9) := 'マイナスナイン';
11    I := A.FIRST;
12    LOOP
13      DBMS_OUTPUT.PUT_LINE(A(I));
14      EXIT WHEN I = A.LAST;
15      I := A.NEXT(I);
16    END LOOP;
17* END;
SQL> /
マイナスナイン
マイナススリー
ゼロ
ファイブ
セブン

PL/SQLプロシージャが正常に完了しました。
まず、結合配列の宣言は、2-3行目です。
VARCHAR2(20)の型の結合配列であり、キーは整数(BINARY_INTEGER型)です。
変数名Aで宣言してます。
6-11行目で結合配列Aに、さまざまなキーで値を代入してます。
11-16行目でキーの昇順に結合配列から値を取り出して、画面表示してます。
この11-16行目の間に結合配列のいくつかのメソッドが使用され、キーの昇順の処理を可能にしています。

まず、キーの値を操作しますので変数が必要です。
4行目で、キーの変数 I を宣言しています。
次にこの変数に最初のキー値(一番小さいキー値)をセットする必要があります。
その部分が11行目の記述です。

   11行目   I := A.FIRST;

この「.FIRST」という記述が結合配列の一番小さなキー値を返します。
すなわち上記のプログラムでは、そのキーの値は「-7」です。
そのキー値でまずLOOP処理の中の13行目で画面出力をしています。
その値は「マイナスセブン」です。これで最初のキーでの処理が終わりました。
次に、次に大きいキー値が必要です。その部分が15行目の記述です。

   15行目   I := A.NEXT(I);

この記述で「.NEXT(I)」の意味は、キー値「I」の次に大きなキー値を返すということです。
ここでは、括弧()の中のIは「-7」なので、次に大きいキー「-3」が左辺のIに代入されます。
その状態でLOOPにより同じ処理を繰り返すので結果としてキーの昇順に画面出力を行います。
注意点としては無限ループにならないように適当なタイミングでループから抜ける必要がありますが、その処理が14行目です。

   14行目   EXIT WHEN  I = A.LAST;

ここで、「.LAST」は、「.FIRST」と逆に一番大きなキー値を返すメソッドです。
従って、13行目でその時点でのキーが一番大きなキーであるときに、ループから抜ける(EXIT)わけです。
これにより無限ループにならずに最後のキー値で繰り返しを終了することができます。

いかがですか?難しく感じる点はありましたか?

なお、以下のようにメソッドを書き換えればキーによる昇順ではなく、「降順処理」が可能です。
   FIRSTをLASTにする
   LASTをFIRSTにする
   NEXTをPRIORにする 
(※ PRIORはNEXTの逆で、一つ前の小さいキー値を返します)

まとめると、今回紹介した結合配列のメソッドは以下の通りです。
これらを使って、キー値の昇順、あるいは降順処理が可能になるわけです。

   結合配列.FIRST    ⇒ 一番小さなキー値を返す
   結合配列.LAST     ⇒ 一番大きなキー値を返す
   結合配列.NEXT(キー値)  ⇒ 指定されたキー値からみて次に大きいキー値を返す
   結合配列.PRIOR(キー値)  ⇒ 指定されたキー値からみて一つ前の小さいキー値を返す

それでは今回はここまでです。また次回、ご期待ください。

先頭へ戻る