SQL ステートメントを発行する COBOL アプリケーション

特定の COBOL プログラム・セクションに SQL ステートメントをコーディングできます。

コーディングできるセクションを次の表に示します。

表 1. COBOL プログラム・セクションに入れることができる SQL ステートメント
SQL ステートメント プログラム・セクション
  • BEGIN DECLARE SECTION
  • END DECLARE SECTION
WORKING-STORAGE SECTION1 または LINKAGE SECTION
  • INCLUDE SQLCA
WORKING-STORAGE SECTION1 または LINKAGE SECTION
  • INCLUDE テキスト・ファイル名
PROCEDURE DIVISION または DATA DIVISION2
  • DECLARE TABLE
  • DECLARE CURSOR
DATA DIVISION または PROCEDURE DIVISION
  • DECLARE VARIABLE
WORKING-STORAGE SECTION1
  • その他
PROCEDURE DIVISION
注:
  1. Db2 コプロセッサーを使って、WORKING -STORAGE SECTION が表にリストされている場合は、どこでも LOCAL-STORAGE SECTION を使用できます。
  2. ホスト変数宣言を組み込むときは、INCLUDE ステートメント が WORKING-STORAGE SECTION または LINKAGE SECTION 内になければなりません。

COBOL プログラムの DECLARATIVES セクションに、SQL ステートメント を入れることはできません。

COBOL プログラム内の各 SQL ステートメントは、EXEC SQL で始まり、 END-EXEC で終わらなければなりません。 Db2 プリコンパイラーを使う場合、EXEC および SQL キーワードは 1 行で指定しなければなりませんが、ステートメントの残りの部分は後続の行に表示されます。 Db2 コプロセッサーを使う場合、EXEC キーワードと SQL キーワードを異なる行にすることができます。 2 つのキーワード EXEC と SQL の間には、COBOL コメントを除いて、トークンを含めないでください (デバッグ行を含む)。 キーワード EXEC と SQL の間には、SQL コメントを含めないでください。

SQL ステートメントが 2 つの COBOL ステートメントの間にある場合、END-EXEC の後に付けるピリオドはオプションであり、適切でない場合があります。 ステートメントが IF に現れる場合 ...COBOL ステートメントの THEN セットでは、IF ステートメントが不用意に終了するのを避けるために、終了ピリオドを省略します。

例えば、COBOL プログラム内に UPDATE ステートメントを入れる場合は、 以下のようにコーディングします。
EXEC SQL
    UPDATE DSN8C10.DEPT
    SET MGRNO = :MGR-NUM
    WHERE DEPTNO = :INT-DEPT
END-EXEC.
コメント
COBOL のコメント行 (7 桁目が * の行) は、ブランクが使用できる個所ならば、SQL ステートメント内のどこにでも入れることができます。

変更の開始また、埋め込みSQLステートメントにSQLコメント( '-')を含めることができます。 コメントの開始を示す2つのハイフン(「--」)の前にスペースを挿入する必要があります。 詳細は、 SQLコメントをご覧ください。変更の終わり

制限事項: Db2 プリコンパイラを使用する場合は、次の制限に注意してください。
  • キーワード EXEC と SQL の間に COBOL コメント行を含めることはできません。 プリコンパイラーは、COBOL デバッグ行とページ替え行 (列 7 の /) をコメント行として扱います。 Db2コプロセッサーは、WITHDEBUGGINGモード設定に依存するCOBOLルールに基づいてデバッグ行を処理します。
  • 浮動コメント標識 (*>)によって識別される COBOL インライン・コメントは使用できません。 COBOL インライン・コメントは、 Db2 コプロセッサーが使用された場合にのみ正しく解釈されます。

SQL INCLUDE ステートメントの場合、 Db2 プリコンパイラーは、 END-EXECの後に続くピリオドの後のテキスト、END-EXECと同じ行にコメントとして処理します。 Db2 コプロセッサーは、このテキストを COBOL プログラム構文の一部として扱います。

デバッグ行
Db2 プリコンパイラーは、デバッグ行の 7 桁目に「D」を無視し、それを空白として扱います。 Db2コプロセッサーは、デバッグ行に関するCOBOL言語の規則に従います。
SQL ステートメントの継続
COBOL プログラムに組み込まれた SQL ステートメント内で文字ストリング定数をある行から次の行に継続するときの規則は、COBOL 内で非数値リテラルを継続するときの規則と同じになります。 しかし、継続行の B 領域の最初の非ブランク文字には、引用符と アポストロフィのいずれでも使用できます。 区切り ID の継続にも同じ規則が適用され、ストリング区切り オプションに左右されません。

SQL 標準に準拠するには、文字ストリング定数はアポストロフィで区切り、 文字ストリング定数の継続行の B 領域で最初の非ブランク文字として引用符を使用します。

Db2 プリコンパイラを使用している場合は8~72列目、 Db2 コプロセッサを使用している場合は12~72列目に、SQLステートメントの継続行を配置することができます。

区切り文字
COBOL プログラム内の SQL ステートメントは、以下のコード例に示されているように開始キーワード EXEC SQLEND-EXEC で区切ります。
EXEC SQL
  SQL-statement
END-EXEC.
COPY
Db2プリコンパイラーを使う場合、ホスト変数宣言内でCOBOL COPYステートメントを使用しないでください。 Db2 コプロセッサーを使う場合、COBOL COPYを使用できます。
REPLACE
Db2 プリコンパイラーを使う場合、REPLACE ステートメントは SQL ステートメントに影響を与えることはありません。 このステートメントは、プリコンパイラーによって生成 された COBOL ステートメントだけに作用します。

Db2 コプロセッサーを使う場合、 REPLACEステートメントは、 SQL ステートメントの文字列と生成された COBOLステートメント内の文字列を置き換えます。

表およびビューの宣言
COBOL プログラムには、そのプログラムがアクセスする各表およびビューについて記述する DECLARE TABLE ステートメントを入れる必要があります。 Db2 宣言生成プログラム (DCLGEN) を使って、 DECLARE TABLE ステートメントを生成できます。 DCLGEN メンバーは、DATA DIVISION に組み込まれていなければなりません。
COBOL プログラムでの動的 SQL
通常、COBOL プログラムでは動的 SQL ステートメントの処理が容易です。 COBOL プログラムが SELECT ステートメントを処理できるのは、戻されるデータ・タイプおよびフィールド数が 決まっている場合です。 変数リスト SELECT ステートメントを使用したい場合は、SQLDA を使用する必要があります。
コードの組み込み
区分データ・セットのメンバーから SQL ステートメントまたは COBOL ホスト変数宣言を組み込むには、ソース・コードのそれらのステートメントを入れたい個所に、以下の SQL ステートメントを入れてください。
EXEC SQL INCLUDE member-name END-EXEC.

Db2 プリコンパイラーを使う場合、SQL INCLUDE ステートメントをネストできません。 この場合、SQLステートメントやホスト変数宣言を含めるためにCOBOL動詞を使用しないでください。また、 CICS® プリプロセッサ関連のコードを含めるためにSQL INCLUDEステートメントを使用しないでください。 一般的に、 Db2 プリコンパイラを使用している場合は、SQL INCLUDEステートメントはSQL関連のコーディングのみに使用してください。 COBOL Db2 コプロセッサを使用している場合は、これらの制限は適用されません。

'EXEC SQL' と 'END-EXEC' のキーワード対は、SQL ステートメントのみを組み込む場合に使用します。 COPY や REPLACE などの COBOL ステートメントは、許可されていません。

マージン
EXEC SQLで始まるSQLステートメントは、12~72列にコード化する必要があります。 それ以外の場合、Db2 プリコンパイラーはSQL ステートメントを認識しません。
名称
ホスト変数には、COBOL で有効な名前であれば、どの名前でも使用できます。 「DSN」で始まる外部入り口名またはアクセス・プラン名、および「SQL」で始まるホスト変数名は使用しないでください。 これらの名前はDb2のために予約されています。
シーケンス番号
Db2 プリコンパイラーに生成されるソース・ステートメントには、シーケンス番号は含まれません。
ステートメント・ラベル
PROCEDURE DIVISION 内の実行可能 SQL ステートメントの前に、段落名を付けることができます。
WHENEVER ステートメント
SQL WHENEVER ステートメントの GOTO 文節のターゲットは、PROCEDURE DIVISION にあるセクション名または非修飾の段落名でなければなりません。
COBOL に関する特殊な考慮事項
以下の考慮事項が、COBOL で作成されるプログラムに適用されます。
  • マルチレベル・ストラクチャー内のエレメントをホスト変数名として使われるCOBOLプログラムでは、Db2プリコンパイラーは最下位の2レベル名を生成します。
  • COBOL コンパイラー・オプション DYNAM および NODYNAM を使用するかどうかは、操作環境により異なります。
    TSOと IMS :以下のガイドラインに従ってCOBOLプログラムをコンパイルする場合は、オプションDYNAMを指定することができます。 IMS Db2 は、言語インターフェースモジュールに共通のエイリアス名DSNHLIを共有しています。 ライブラリーを連結する場合には、以下のようにしなければなりません。
    • IMS をCOBOLオプションDYNAMで使用する場合は、 IMS ライブラリを最初に連結してください。
    • アプリケーションプログラムを Db2 ライブラリのみで実行する場合は、必ず最初に ライブラリを連結してください。

    CICS CAF、および RRSAF : CICS ステートメントを含むか、または個別の CICS トランスレータまたは統合された CICS トランスレータによって翻訳される COBOL プログラムをコンパイルする際には、NODYNAM オプションを指定する必要があります。 この場合には、DYNAM オプションは指定できません。 CICS プログラムに、個別の CICS トランスレータまたは統合された CICS トランスレータによって翻訳されていないサブルーチンが含まれており、かつ、SQLステートメントが含まれている場合、DYNAMオプションを指定することができます。 ただし、この場合、 Db2 ライブラリより前に CICS ライブラリを連結する必要があります。

    COBOL ストアード・プロシージャーは、DYNAM オプションまたは NODYNAM オプションを指定してコンパイルできます。 DYNAMを使用する場合は、次のいずれかのアクションを実行して、正しいDb2言語インターフェイスモジュールが動的にロードされるように確保してください。

    • ATTACH(RRSAF) プリコンパイラー・オプションを使用します。
    • DSNRLIモジュールを、Db2ライブラリーの前に連結されているロード・ライブラリーにコピーします。 メンバー名 DSNHLI を使用します。
  • 数値の切り捨てを防ぐには、 次のいずれかの方法を使用してください。
    • 2 進整数のホスト変数には、COMP-5 データ・タイプを使用します。
    • 以下の COBOL コンパイラー・オプションを指定します。
      • 変更の開始アプリケーションによって各バイナリ変数に移動されるデータが、バイナリ変数のPICTURE句で定義されているよりも大きな精度を持たないことが確実である場合は、TRUNC(OPT)またはTRUNC(STD)を使用します。変更の終わり
      • TRUNC(BIN) - 各 2 進変数へ移送しているデータの精度 が PICTURE 文節の値を超える可能性がある場合に指定します。

    Db2COBOLコンパイラオプションTRUNC(BIN)を指定したか、COMP-5データ型を使用したかのように、2進整数ホスト変数に値を割り当てます。

  • Db2プリコンパイラを使用していて、COBOLプログラムに複数のエントリポイントが含まれている、または複数回呼び出される場合、最初のSQLステートメントが実行される前にエントリステートメントのUSING節には、SQLCAと、SQLステートメントが使用するすべてのリンケージセクションエントリを、含めなければなりません。
  • Db2 プリコンパイラーを使う場合、PROCEDURE DIVISION と DECLARATIVES ステートメントの間にコンパイラー指示は表示されません。
  • COBOL 表意定数 (ZERO や SPACE など)、記号文字、参照修正、および 添え字は、SQL ステートメント内では使用できません。
  • SQLの識別子命名規則については、「SQLにおける識別子」 を参照してください。 ただし、COBOL のみについては、SQL 識別子の名前は、 COBOL 単一バイト文字(COBOL) で説明されているように、COBOL ワードの命名規則に従うことができます。 ただし、この名前は、Db2 オブジェクトで許容される長さを超えてはなりません。
  • 減算の演算子としてハイフンを使用する場合には、前後にスペースを入れて ください。 Db2 通常、ハイフンの前後がスペースなしの場合は、ホスト変数名の一部として解釈します。
  • SQL ステートメントを COBOL PERFORM … THRU段落に組み込み、SQL ステートメントWHENEVER … GOも指定すると、COBOL コンパイラーは警告メッセージ IGYOP3094 を返します。 このメッセージは、問題を指摘している可能性があります。 この使用法は推奨されません。
  • Db2 プリコンパイラーを使う場合、ネストされたプログラムまたはバッチ・コンパイルを使用するときには、参照するすべての SQL ステートメントおよびホスト変数が最初のプログラム内になければなりません。
  • Db2 プリコンパイラーを使う場合、 COBOLプログラムはDATA DIVISIONとPROCEDURE DIVISIONを持たなければなりません。 SQL ステートメントを含むプログラムには、この両 DIVISION および WORKING-STORAGE セクションが存在する必要があります。 ただし、 COBOL プログラムが LOCAL-STORAGE SECTION を必要とする場合は、 Db2 プリコンパイラーの代わりに Db2 コプロセッサーを使わなければなりません。
  • 変更の開始 Db2 プリコンパイラは、このCOBOL変数を生成します
    DSN-TMP2 PIC S9(18) COMP-3
    Db2 コプロセッサーは、次の COBOL 変数を生成します。
    SQL---SCRVALD DS 10P PIC S9(18) COMP-3
    それらの変数には偶数のパック 10 進数があるため、COBOL オプション RULES(NOEVENPACK) を指定すると、COBOL コンパイラーは警告 IGYDS1348-W を生成します。変更の終わり

プログラム固有のプログラミングインターフェース情報の開始。プログラムが Db2プリコンパイラーを使用し、LINKAGE SECTIONで Db2ホスト変数として定義されているパラメーターを使用し、その後のプログラムの呼び出しで入力パラメーターのアドレスが変更される可能性がある場合、プログラムは変数SQL-INIT-FLAGをリセットしなければなりません。 このフラグは、 Db2 プリコンパイラーに生成されます。 このフラグをリセットすることは、次の SQL ステートメントが 実行されるときに、ストレージを初期化しなければならないことを意味します。 フラグをリセットするには、ステートメント MOVE ZERO TO SQL-INIT-FLAG を、 呼び出されるプログラムの PROCEDURE DIVISION 内で、ホスト変数を使用する実行可能 SQL ステートメントの前に挿入します。 COBOL Db2 コプロセッサーを使う場合、呼び出し先プログラムは、 SQL-INIT-FLAGを初期化しなければなりません。プログラム固有のプログラミングインターフェース情報を終了します。

SQL エラー・コードの処理
Cobolアプリケーションは、Db2からSQLエラーに関する詳細情報を請求できます。 詳細については、「CobolアプリケーションにおけるSQLエラーコードの処理 」を参照してください。