SQLJ アプリケーションでの名前指定イテレーターの使用

名前指定イテレーターを使用して、結果表の各列を名前で参照できます。

プロシージャー

名前指定イテレーターを使用するための手順は、以下のとおりです。

  1. イテレーターを宣言します。
    結果セット・イテレーターを宣言するには、イテレーター宣言節 を使用します。 そうすると、イテレーターと同じ名前のイテレーター・クラスが作成されます。 名前指定イテレーターの場合は、イテレーター宣言節で以下の情報を指定します。
    • イテレーターの名前
    • カラム名とJavaデータ型の一覧
    • Java クラス宣言に関する情報、例えば、イテレータが public であるか、または static
    • 一連の属性 (イテレーターが保持可能かどうか、各列が更新可能かどうか、など)

    照会の名前指定イテレーターを宣言するときには、イテレーターの各列の名前を指定します。 指定する名前は、照会の結果表の各列の名前と一致している必要があります。 イテレーターの列名と結果表の列名の大/小文字だけが違っている場合は、一致する名前と見なされます。 イテレーター宣言節から生成される名前指定イテレーター・クラスには、accessor メソッド が含まれています。 イテレーターの各列ごとに 1 つの accessor メソッドが存在します。 各 accessor メソッドの名前は、対応するイテレーター列名と同じです。 その accessor メソッドを使用して、結果表の各列のデータを取得します。

    対応するカラムのデータ型にできるだけ一致するイテレータで、Javaデータ型を指定する必要があります。 Javaデータ型とテーブルのカラムのデータ型間の最適なマッピングの一覧については、「Java、 JDBC、SQLデータ型」を参照してください。

    イテレーターを宣言するには、いくつかの方法があります。 しかし、各イテレータの基盤となるのはJavaクラスであるため、イテレータを宣言する際には、その基盤となるクラスがJavaのルールに従っていることを確認する必要があります。 例えば、with 節 が含まれているイテレーターは、public として宣言しなければなりません。 したがって、public にしなければならないイテレーターは、public クラスを使用できる場所でのみ宣言できる、ということになります。 イテレーターを宣言するためのいくつかの代替方法を以下のリストにまとめます。

    • publicとして、ソース・ファイル内に単独で宣言する方法

      この方法の場合は、他のコード・モジュールの中でもイテレーター宣言を使用できるので、すべての SQLJ アプリケーションで有効なイテレーターを用意できます。 また、同じソース・ファイル内に他の最上位クラスまたはpublic・クラスがあっても問題ありません。

    • ソース・ファイルの中で他の最上位クラス定義と一緒に最上位クラスとして宣言する方法

      Javaでは、コードモジュールに1つのパブリックなトップレベルクラスしか作成できません。 したがって、イテレーターを public として宣言しなければならない場合 (イテレーターに with 節を組み込む場合など) は、コード・モジュール内の他のクラスを public として宣言することはできません。

    • 別のクラスの中にネストした static クラスとして宣言する方法

      この代替方法の場合は、イテレーター宣言と他のクラス宣言を同じソース・ファイルの中で組み合わせ、イテレーターと他のクラスを public として宣言し、イテレーター・クラスを他のコード・モジュールやパッケージから参照できるようにすることが可能になります。 ただし、ネスト元のクラスの外からイテレーターを参照する場合は、ネスト元のクラスの名前を付けた完全修飾イテレーター名を指定する必要があります。

    • 別のクラスの inner クラスとして宣言する方法

      この方法でイテレーターを宣言する場合は、ネスト元のクラスのインスタンスの中でしかイテレーターのインスタンスを生成できません。 ただし、ファイルの中でイテレーターと他のクラスを public として宣言することは可能です。

      イテレーターを inner クラスとして宣言した場合は、JDBC の ResultSet をイテレーターにキャストできません。 この制限は、static のネスト・クラスとして宣言したイテレーターには当てはまりません。 ResultSet をイテレーターにキャストする方法の詳細については、『同じアプリケーションでの SQLJ と JDBC の使用』を参照してください。

  2. イテレーター・クラスのインスタンスを作成します。

    結果表から行を取得するための名前指定イテレーター・クラスのオブジェクトを宣言します。

  3. SELECT の結果表をイテレーターのインスタンスに割り当てます。
    SELECT の結果表をイテレーターに割り当てるには、SQLJ の 代入節 を使用します。 名前指定イテレーターの代入節の形式は、以下のとおりです。
    #sql context-clause iterator-object={select-statement};

    詳細については、『SQLJ 代入節』と『SQLJ コンテキスト節』を参照してください。

  4. 行を取得します。

    そのためには、ループの中で accessor メソッドを呼び出します。 accessor メソッドの名前は、対応するイテレーターの列の名前と同じです。accessor メソッドにパラメーターはありません。 accessor メソッドからは、結果表の現在行の対応する列の値が返されます。 結果表の中でカーソルを前方へ移動するには、NamedIterator.next() メソッドを使用します。

    すべての行を取得できたかどうかをテストするには、next メソッドを呼び出したときに返される値をチェックします。 次の行がない場合は、next から false の値の boolean が返されます。

  5. イテレーターを閉じます。

    そのためには、NamedIterator.close メソッドを使用します。

名前指定イテレーターを宣言して使用するためのコードを以下に示します。 選択されたステートメントの右にある番号は、前述のステップに対応しています。
図1: 名前指定イテレーターの使用例
#sql  iterator ByName(String LastName, Date HireDate);                    1 
                                // Declare named iterator ByName
{
  …
  ByName nameiter;              // Declare object of ByName class         2 
  #sql [ctxt]
 nameiter={SELECT LASTNAME, HIREDATE FROM EMPLOYEE};                      3 
                                // Assign the result table of the SELECT
                                // to iterator object nameiter
  while (nameiter.next())       // Move the iterator through the result   4 
                                // table and test whether all rows retrieved
  {
    System.out.println( nameiter.LastName() + " was hired on " 
      + nameiter.HireDate());   // Use accessor methods LastName and
                                // HireDate to retrieve column values
  }
  nameiter.close();             // Close the iterator                     5 
}