アプリケーション中に埋め込んで使用するSQL文には、実行文と非実行文があります。実行文は、データベースをアクセスしたり、トランザクションの制御を行うために使用します。非実行文は、実行文で利用するカーソルの宣言やホスト変数の宣言、例外条件発生時の動作を定義します。非実行文は、アプリケーションの実行対象にはなりません。したがって、アプリケーション中のGOTO文などによる制御の影響を受けません。
なお、SQL文の使用範囲については、“付録D SQL文の使用範囲”を参照してください。
分類 | SQL文 | 備考 |
---|---|---|
非カーソル系データ操作 | 単一行SELECT文 | 実行文 |
UPDATE文:探索 | ||
INSERT文 | ||
DELETE文:探索 | ||
カーソル系データ操作 | カーソル宣言(DECLARE CURSOR) | 非実行文 |
OPEN文 | 実行文 | |
CLOSE文 | ||
FETCH文 | ||
UPDATE文:位置づけ | ||
DELETE文:位置づけ | ||
動的SQL文 | ALLOCATE DESCRIPTOR文 | 実行文 |
DEALLOCATE DESCRIPTOR文 | ||
DESCRIPTOR取得文 | ||
DESCRIPTOR設定文 | ||
PREPARE文 | ||
DEALLOCATE PREPARE文 | ||
DESCRIBE文 | ||
EXECUTE文 | ||
EXECUTE IMMEDIATE文 | ||
動的カーソル宣言 | 非実行文 | |
動的OPEN文 | 実行文 | |
動的FETCH文 | ||
動的CLOSE文 | ||
動的DELETE文:位置づけ | ||
動的UPDATE文:位置づけ | ||
ストアドプロシジャ | CALL文 | 実行文 |
トランザクション制御文 | COMMIT文 | 実行文 |
ROLLBACK文 | ||
SET TRANSACTION文 | ||
コネクション管理文 | CONNECT文 | 実行文 |
SET CONNECTION文 | ||
DISCONNECT文 | ||
セション管理文 | SET CATALOG文 | 実行文 |
SET SCHEMA文 | ||
SET SESSION AUTHORIZATION文 | ||
表宣言 | 表宣言 | 非実行文 |
埋込み例外宣言 | WHENEVER文 | 非実行文 |
埋込みSQL宣言節 | BEGIN DECLARE SECTION | 非実行文 |
END DECLARE SECTION | ||
資源操作文 | RELEASE TABLE文 | 実行文 |
利用者制御文 | SET USER PASSWORD文 | 実行文 |
アクセス制御文 | SET ROLE文 | 実行文 |
SQL埋込みCOBOLプログラムでの、SQL文の指定位置について説明します。
埋込みSQL宣言節は、ホスト変数を定義するためのものです。埋込みSQL宣言節は、DATA DIVISIONの作業場所節(WORKING-STORAGE SECTION)またはLINKAGE SECTIONに記述します。また、ホスト変数の変数名は、COBOLプログラムソース上で、“SQL”以外で始まる名前で命令し、一意にする必要があります。
ホスト変数は、アプリケーションとデータベースの間でデータの受渡しをするのに使用する変数です。すなわち、アプリケーションで参照するデータをデータベースから取り出すため、または逆に、アプリケーションで設定したデータをデータベースに格納するために、SQL文に指定する変数です。
ホスト変数の宣言は、埋込みSQL宣言節で行います。宣言の記述方法そのものは、COBOLでの変数の宣言と同じです。ホスト変数の宣言の例を以下に示します。
図3.5 ホスト変数宣言の例(SQL埋込みCOBOLプログラム)
状態変数は、処理結果の状態をアプリケーションに伝えるための変数です。状態変数には状態コードが設定されます。状態コードは、処理が正常に完了した、または処理中になんらかの例外条件が発生したという状態を表します。状態変数の変数名は“SQLSTATE”です。
SQLSTATEは長さ5桁の文字列型(01 SQLSTATE PIC X(5))の変数であり、埋込みSQL宣言節で宣言します。埋込みSQLを使用するアプリケーション中では、状態変数を必ず宣言します。
メッセージ変数は、処理結果をメッセージとしてアプリケーションに伝えるための変数です。メッセージ変数の変数名は“SQLMSG”です。
SQLMSGは固定長文字列型の変数であり、埋込みSQL宣言節で宣言します。メッセージ変数の宣言のしかたを以下に示します。
01 SQLMSG PIC X(n)
n:メッセージ変数の長さ(バイト数)です。
1以上32692以下の値を指定します。
1以上32000以下の値を指定します。
メッセージ変数にメッセージが設定される際の規則を以下に示します。
設定されるメッセージは1つだけです。
メッセージの長さがメッセージ変数の長さ(n)を超える場合、メッセージの先頭からn文字分設定されます。
メッセージ変数のメッセージのうしろの領域は空白パディングされます。
カーソル宣言は、PROCEDURE DIVISION節内に記述します。ただし、宣言したカーソル名を参照するカーソル系のSQL文よりソースファイル上で先行して記述します。なお、カーソル名は、COBOLプログラムソース上で一意にすることが必要です。
埋込み例外宣言は、PROCEDURE DIVISIONに記述します。埋込み例外宣言の意味と有効範囲については、“3.2.4 SQL文の処理結果の確認”で説明します。
アプリケーション中にINCLUDE文を指定することができます。インクルードファイルには、SQL文およびCOBOLの言語テキストを記述できます。インクルードファイルに、ホスト変数および状態変数の宣言を格納しておくことにより、複数のアプリケーションで共通に使用する変数をまとめて宣言することができます。
INCLUDE文には、以下のファイル名を指定してください。
インクルードファイル名から拡張子“.COBOL”を除いたファイル名
インクルードファイル名
INCLUDE文が指定された場合、インクルードファイルは、以下の順番に検索されます。
指定されたファイル名に、拡張子“.COBOL”を付加したファイル名
指定されたファイル名
表宣言は、スキーマ名の修飾をしない表名を定義する宣言文です。表宣言で定義した表名を、それ以降のSQL文で記述する場合、スキーマ名を省略することができます。INCLUDE文と表宣言の例を以下に示します。
[インクルードファイル“HOSTVAR”]
01 SQLSTATE PIC X(5). 01 STOCK PIC S9(9) BINARY.
[SQL埋込みCOBOLプログラム]
EXEC SQL BEGIN DECLARE SECTION END-EXEC. EXEC SQL INCLUDE HOSTVAR END-EXEC.
EXEC SQL END DECLARE SECTION END-EXEC. PROCEDURE DIVISION. EXEC SQL DECLARE 在庫表 TABLE ON SCH1 END-EXEC.
EXEC SQL SELECT 在庫数量 INTO :STOCK FROM 在庫表 WHERE 製品番号 = 240 END-EXEC. ↑ スキーマ名修飾省略 DISPLAY "在庫数量 = " STOCK. STOP RUN.