23.1.1 埋め込みSQL文を使ったCOBOLプログラムの作成
埋め込みSQL文によるデータベースアクセスの方法は,SQLをCOBOLプログラム中に埋め込んで実行する方法(静的に行う方法)と,SQLを実行時に生成し,SQL文の埋め込み変数に設定して実行する方法(動的に行う方法)があります。
埋め込みSQL文のSELECT文は,表から1行分の値を取り出す文(SELECT文:単一行)です。複数行の値を取り出す場合は,カーソルを使用します。カーソルの使用には,静的に行う方法と動的に行う方法があります。また,ストアドプロシージャを呼び出して,一連の手続きを行う方法もあります。
- 〈この項の構成〉
(1) COBOLプログラムで使用できるSQL文
COBOLプログラムで使用できる埋め込みSQL文を次に示します。
種類 |
分類 |
内容 |
|
---|---|---|---|
宣言系 |
埋め込みSQL宣言節 |
埋め込みSQL開始宣言 |
|
埋め込みSQL終了宣言 |
|||
埋め込み例外宣言 |
埋め込み例外宣言 |
||
カーソル |
カーソル宣言 |
||
制御系 |
コネクション |
コネクションを確立する |
|
コネクションを解除する |
|||
現行コネクションを変更する |
|||
トランザクション |
コミットでトランザクションを終了させる |
||
ロールバックでトランザクションを終了させる |
|||
操作系 |
静的 |
表の指定された行から値を取り出す |
|
表に新しい行を作成する |
|||
表から行を削除する |
|||
表の行を更新する |
|||
カーソル |
カーソルを開く |
||
カーソルを表の次の行に位置づけ,その行を取り出す |
|||
カーソルを閉じる |
|||
ストアドプロシージャ |
ストアドプロシージャを呼び出す |
||
動的 |
|||
動的SQLを準備する |
|||
準備した動的SQLを解放する |
|||
動的SQLを実行する |
(2) 埋め込みSQL宣言節
埋め込みSQL開始宣言から埋め込みSQL終了宣言までを,埋め込みSQL宣言節といいます。埋め込みSQL宣言節は,データ部に定義します。
埋め込みSQL宣言節には,SQLCODE変数,埋め込み変数,および標識変数を定義します。
(5) 識別子
カーソル名,表名,列名,プロシージャ名などを表す識別子は,データベースによっても規定されます。したがって,正常にコンパイルされたプログラムでも,SQL文の実行が失敗することがあります。このような場合は,DBMSのマニュアルなどを参照してください。また,-EquivRuleコンパイラオプションの指定がない場合,等価規則が適用されます。等価規則については,マニュアル「COBOL2002 言語 標準仕様編」 「4.1.2 COBOL文字集合」を参照してください。
使用するデータベースを意識しないで運用したい場合は,カーソル名を英字で始まる18文字以内の文字列で定義することを推奨します。
(6) トランザクション
トランザクションは,コネクションを確立したとき,または明示的にコミットやロールバックしたときから開始され,明示的,または暗黙的にコミット,ロールバックしたときに終了されます。トランザクションは,コネクションごとに管理されます。
一つのデータベースに対して複数のプログラム(コネクション)からアクセスする場合,デッドロックが発生する可能性があります。デッドロックが発生する可能性を低くするために,プログラム作成時には次のことに注意してください。
-
同時にアクセスするすべてのプログラムのデータベースへのアクセス順序を同じにすると,デッドロックの発生する可能性は低くなります。例えば,データベースへの更新アクセスをストアドプロシージャで登録し,これを使用することでアクセス順序を規定できます。
-
応答処理を含むプログラムの場合,応答処理がトランザクション内に存在すると,応答時間分,ほかのトランザクションによるアクセスがブロックされることがあります。このようなトランザクション内での応答処理をしないようにプログラムを作成することで,ブロックする時間を最小にできます。
-
デッドロックは,主に,同じデータベースに対するアクセスで長時間動作する複数のトランザクションが同時に実行されている場合に起こります。トランザクションが長くなれば,排他ロックまたは更新ロックが長時間になり,ほかの処理をブロックしてしまうので,デッドロックが発生する可能性が高くなります。このことから,トランザクションを最小単位で行うことで,デッドロックが発生する可能性を低くできます。