open

EGL open 文は、後で get next 文を使用して検索するために、リレーショナル・データベースから一連の行を選択します。 open 文は、カーソルまたは呼び出されたプロシージャー上で 作動できます。


open 文の構文図、SQL レコードがない場合

open 文の構文図、SQL レコードがある場合
resultSetID
open 文を、後の get nextreplacedelete、および close 文に結びつける ID。 詳細については、『resultSetID』を参照してください。
scroll
結果セット内をさまざまな方法で移動できるオプション。get next 文は常時使用できますが、scroll を使用すると、以下の文も使用できます。
  • get absolute
  • get current
  • get first
  • get last
  • get previous
  • get relative

scroll オプションを使用できるのは、Java™ で出力を生成している場合だけです。

hold
コミットが発生したときに、結果セット内の位置を維持します。hold オプションを Java プログラムに使用できるのは、JDBC ドライバーが JDBC 3.0 以上をサポートしている場合だけです。COBOL プログラムの場合はオプションが使用可能です。しかし、CICS® をターゲットにしたプログラムがセグメント化されている場合、セグメント化されたプログラム中の会話により CICS トランザクションが終了され、プログラムによるファイルまたはデータベース位置の保存が妨げられるため、hold オプションはほとんど意味を持ちません。
hold オプションは、 次の場合に適切です。
  • ストアード・プロシージャーではなく、カーソルをオープンするために EGL open 文を使用している場合。
  • 結果セット中の位置を失うことなく、定期的に変更内容をコミットする場合。
  • 使用しているデータベース管理システムが、SQL カーソル宣言で WITH HOLD オプションの使用をサポートしている場合。
例えば、コードは以下のように機能します。
  1. EGL open 文を実行し、カーソルを宣言してオープンする。
  2. EGL get next 文を実行して、1 つの行を取り出す。
  3. ループの中で以下の操作を行う。
    1. 何らかの方法でデータを処理する。
    2. EGL replace 文を実行して、行を更新する。
    3. system 関数 sysLib.commit を実行し、変更内容をコミットする。
    4. EGL get next 文を実行して、別の行を取り出す。

hold を指定しない場合は、カーソルが開いていないためにステップ 3 の d の最初の実行は失敗します。

hold を指定するカーソルはコミット時には閉じられませんが、ロールバックまたはデータベース接続ではすべてのカーソルが閉じられます。

コミットを通じてカーソル位置を保存する必要がない場合は、hold を指定しないでください。

forUpdate
データベースから検索されたデータを置換または削除するために以降の EGL 文を使用することができるオプション

結果セットを検索するためにストアード・プロシージャーを 呼び出している場合は、forUpdate を指定できません。

usingKeys ... item
暗黙の SQL 文の WHERE 文節のキー値コンポーネントを作成するために使用する キー項目のリストを識別します。暗黙の SQL 文は、 明示的な SQL 文を指定しない場合に実行時に使用されます。

usingKeys 文節を指定しない場合、 暗黙の文のキー値コンポーネントは open 文で参照される SQL レコード・パーツが基となります。

明示的な SQL 文を指定する場合、usingKeys 情報は無視されます。

with #sql{ sqlStatement }
明示的な SQL SELECT 文。SQL レコードを指定した場合はオプションです。#sql と左中括弧の間にスペースを入れないでください。
into ... item
カーソルまたはストアード・プロシージャーから値を受け取る EGL ホスト変数を識別する INTO 文節です。 #sql{ } ブロックの外側にある、このような文節では、ホスト変数名の前にセミコロンを含めないでください。
with preparedStatementID
実行時に SQL SELECT または CALL 文を準備する EGL prepare 文の ID。open 文により、SQL SELECT または CALL 文が動的に実行されます。 詳細については、『prepare』を参照してください。
using ... item
実行時に準備済み SQL SELECT または CALL 文で使用可能になる EGL ホスト変数を識別する USING 文節です。 #sql{ } ブロックの外側にある、このような文節では、ホスト変数名の前にセミコロンを含めないでください。
SQL record name
SQLRecord 型のレコードの名前。レコード名または sqlStatement に対する値のどちらかが必要です。sqlStatement が省略されると、 SQL SELECT 文は SQL レコードから引き出されます。

以下に例を示します (SQL レコードにより emp が呼び出されたと想定)。

  open empSetId forUpdate for emp;

  open x1 with
    #sql{
      select empnum, empname, empphone 
      from employee 
      where empnum >= :empnum
 			  for update of empname, empphone
    }

  open x2 with 
    #sql{
      select empname, empphone
      from employee
      where empnum = :empnum
    }
  for emp;

  open x3 with
    #sql{
      call aResultSetStoredProc(:argumentItem)
    }

デフォルトの処理

SQL レコードを指定した場合、デフォルトでの open 文の影響は、 以下のようになります。
  • open 文は、一連の行を使用可能にする。選択された行の中の各列は構造体項目に関連付けられ、読み取り専用の構造体項目に関連付けられた列を除いて、すべての列は EGL replace 文による以降の更新に使用できます。
  • SQL レコードのキー項目を 1 つのみ宣言している場合は、SQL テーブル・キー列の値が SQL レコードのキー項目の値より大きいか等しい限り、open 文はレコード固有の default select condition を満たす行をすべて選択する。
  • SQL レコードに複数のキーが宣言されている場合は、レコード固有の default select condition が唯一の検索基準となり、open 文はその基準を満たす行をすべて検索する。
  • レコード・キーもデフォルトの選択条件も指定しない場合、open 文はテーブル内のすべての行を選択する。
  • 選択された行はソートされない。
EGL open 文は、生成されたコードでは SQL SELECT または SQL SELECT FOR UPDATE 文が含まれるカーソル宣言によって表されます。デフォルトでは、以下のことが当てはまります。
  • FOR UPDATE 文節がある場合、これには読み取り専用の構造体項目が含まれない。
  • 特定のレコード用の SQL SELECT 文は、以下の文のようになります。
      SELECT column01, 
             column02, ... 
             columnNN
      INTO   :recordItem01,
             :recordItem02, ...
             :recordItemNN
      FROM   tableName 
      WHERE  keyColumn01 = :keyItem01
      FOR UPDATE OF
             column01, 
             column02, ... 
             columnNN

デフォルトをオーバーライドするには、EGL open 文内の SQL 文を指定します。

エラー条件

以下のものを含むさまざまな条件は無効です。
  • SELECT に必要な文節が欠けている SQL 文を含める。 必要な文節は SELECT、FROM、および forUpdate を指定した場合の FOR UPDATE OF です。
  • 実行時に存在しないか、関連する構造体項目との互換性がない列に関連付けられている SQL レコード
  • forUpdate オプションが指定され、 次の SQL レコードのいずれかに対して、コードによる open 文の実行が 試行される。
    • 読み取り専用の構造体項目しかない SQL レコード
    • 複数の SQL テーブルに関連付けられている SQL レコード
以下の場合でも、問題が生じます。
  1. 更新のために EGL open 文をカスタマイズしたが、 特定の SQL テーブル列が update で使用可能であることを示していない場合に、
  2. open 文に関連付けられた replace 文が列を変更しようとした。
この問題は、以下のいずれかの方法で解決できます。
  • EGL open 文をカスタマイズする際に、使用する列名を SQL SELECT 文の FOR UPDATE OF 文節に組み込む
  • EGL replace 文をカスタマイズする際に、SQL UPDATE 文の SET™ 文節内にある列への参照を除去する
  • openreplace 文の両方について、デフォルトを受け入れる
フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.