OPEN ステートメントは、カーソルをオープンして、 そのカーソルを結果表からの行の取り出しに使用できるようにします。
呼び出し
対話式 SQL 機能には外見上対話式の実行に見えるインターフェースが用意されている場合がありますが、 このステートメントはアプリケーション・プログラムに組み込むことだけが可能です。 これは、動的に作成できない実行可能ステートメントです。
許可
カーソルの使用に必要な許可については、 DECLARE CURSOR を参照してください。
構文
>>-OPEN--cursor-name----+------------------------------------+->< | .-,----------------. | | V | | +-USING-----host-variable---+--------+ '-USING DESCRIPTOR--descriptor-name--'
説明
該当の DECLARE CURSOR ステートメントは、次のいずれかの方法により、 SELECT ステートメントを指定していなければなりません。
該当のカーソルの結果表は、その SELECT ステートメントに指定されているホスト変数の現行値、 またはこの OPEN ステートメントの USING 文節に指定されたホスト変数の現行値を使用して、 その SELECT ステートメントを評価することによって求められます。 結果表の行は、OPEN ステートメントの実行の過程で求められ、 それらを入れる一時表が作成されるか、または後続の FETCH ステートメントの実行によって求められます。 いずれの場合でも、カーソルはオープン状態になり、その位置はその結果表の最初の行の前になります。 表が空の場合、カーソルの状態は "最終行の後" になります。
OPEN ステートメントが処理される前に、 ユーザーは次に示す SQLDA 内のフィールドを設定する必要があります。
SQLDA には、すべての SQLVAR オカレンスが入るだけの十分な記憶域がなければなりません。 したがって、SQLDABC の値は 16 + SQLN*(N) 以上でなければなりません (N は 1 つの SQLVAR オカレンスの長さ)。
LOB の結果列を入れるには、 各選択リスト項目 (または結果表の列) ごとに 2 つの SQLVAR 項目が必要です。 SQLDOUBLED と LOB の列については、SQLDA に対する DESCRIBE の効果 を参照してください。
SQLD に設定する値は、ゼロ以上で SQLN 以下でなければなりません。 詳しくは、付録 C, SQL 記述子域 (SQLDA)を参照してください。
カーソルの SELECT ステートメントが評価されると、 P の代わりに使用される値は P のターゲット変数になります。 たとえば、V が CHAR(6) でターゲットが CHAR(8) の場合、 P の代わりに使用される値は V の値にブランクを 2 個付加したものになります。
注
WITH HOLD として宣言されたオープン・カーソル以外のすべてのカーソルは、 プログラムが COMMIT ステートメントを発行する際にクローズ状態になります。
また、カーソルは、CLOSE ステートメントを実行した場合、 またはカーソル位置が予期できなくなるようなエラーが検出された場合にも、クローズ状態になることがあります。
また、一時表方式が使用される場合もあります。 この方式では、結果表全体が OPEN ステートメントの実行中に一時表に転送されます。 一時表が使用される場合、プログラムの結果は、以下の 2 つの点で異なる可能性があります。
逆に、一時表を使用しない場合、カーソルがオープン状態の間に実行される INSERT、UPDATE、 および DELETE ステートメントが、 同じ作業単位から発行される場合には結果表に影響を与えることがあります。 アプリケーション開発の手引き は、並行する作業単位によって実行される INSERT、 UPDATE、および DELETE の操作の影響を制御するロックの使用方法について説明しています。 結果表は、自分自身の作業単位で実行される操作による影響を受けることがあり、 そのような操作の影響は、必ずしも予測可能であるとは限りません。 たとえば、カーソル C の位置が SELECT * FROM T と定義された結果表の 1 つの行である場合に、 T に新しい行を挿入すると、行の順序が整っていないために、 その挿入が結果表に与える影響は予測できません。 したがって、後続する FETCH C で T の新しい行が取り出される場合もあれば、取り出されない場合もあります。
例
例 1: COBOL プログラムで、以下を行う組み込みステートメントを作成します。
EXEC SQL DECLARE C1 CURSOR FOR SELECT DEPTNO, DEPTNAME, MGRNO FROM DEPARTMENT WHERE ADMRDEPT = 'A00' END-EXEC. EXEC SQL OPEN C1 END-EXEC.
例 2: C プログラムで動的に定義される選択ステートメントに カーソル DYN_CURSOR を関連付ける OPEN ステートメントをコーディングします。 選択ステートメントの述部には 2 つのパラメーター・マーカーが使用されており、 2 つのホスト参照変数をその OPEN ステートメントに指定して、 アプリケーションとデータベースとの間で整数と VARCHAR(64) の値を渡すのに使用します。 (関連するホスト変数の定義、PREPARE ステートメント、 および DECLARE CURSOR ステートメントも以下の例に示しています。)
EXEC SQL BEGIN DECLARE SECTION; static short hv_int; char hv_vchar64[64]; char stmt1_str[200]; EXEC SQL END DECLARE SECTION; EXEC SQL PREPARE STMT1_NAME FROM :stmt1_str; EXEC SQL DECLARE DYN_CURSOR CURSOR FOR STMT1_NAME; EXEC SQL OPEN DYN_CURSOR USING :hv_int, :hv_vchar64;
例 3: 例 2 と同様に OPEN ステートメントをコーディングしますが、 この例では WHERE 文節のパラメーター・マーカーの数とデータ・タイプは未知です。
EXEC SQL BEGIN DECLARE SECTION; char stmt1_str[200]; EXEC SQL END DECLARE SECTION; EXEC SQL INCLUDE SQLDA; EXEC SQL PREPARE STMT1_NAME FROM :stmt1_str; EXEC SQL DECLARE DYN_CURSOR CURSOR FOR STMT1_NAME; EXEC SQL OPEN DYN_CURSOR USING DESCRIPTOR :sqlda;