MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

SQL以外の変更を加えたCOBOL-DB2プログラムをBINDせずに実行するとどうなるか?

問題

COBOL-DB2プログラムにおいて、変数の長さをPIC X(5)からPIC X(8)へ拡張する変更を行ったとします。ただし、プログラム内のSQLには一切変更がありません。このような変更に対して、プログラムのPLAN/パッケージをBINDしなかった場合、実行結果はどうなるのでしょうか?

解決策

PIC X(5)からPIC X(8)への変数長の変更はDB2に関わる変更ではなく、プログラム内のSQL文に修正を加える必要もありません。しかし、それでもPLAN/パッケージのBINDは必須です。BINDを実行しないまま実行すると、SQLエラーコード-818が発生します。このエラーは「ロードモジュール内のプリコンパイラ生成タイムスタンプxが、DBRM zから作成されたBINDタイムスタンプyと一致していません(THE PRECOMPILER-GENERATED TIMESTAMP x IN THE LOAD MODULE IS DIFFERENT FROM THE BIND TIMESTAMP y BUILT FROM THE DBRM z)」という内容を示すものです。

このエラーが発生する仕組みは以下の通りです。COBOL-DB2プログラムは実行されるたびに、ロードモジュールのタイムスタンプとパッケージ/DBRMのタイムスタンプが照合されます。変数の長さだけを変更して(SQLには手を加えずに)プログラムを再コンパイルすると、ロードモジュールには新しく生成されたタイムスタンプが付与されます。一方、BINDを実行していなければ、パッケージ/DBRM側には古いタイムスタンプが残ったままになります。両者のタイムスタンプが不一致となるため、この状態でプログラムを実行すると、それを呼び出すJCLステップはSQLエラーコード-818で異常終了します。

つまり、SQLに変更がなくてもホスト変数などに変更を加えて再コンパイルした場合は、必ず再BINDが必要である点に注意してください。

LEVELオプションによる回避方法

将来にわたってSQL文が一切変更される予定のないCOBOL-DB2プログラムについては、プリコンパイル時にLEVELオプションを指定する方法があります。LEVELオプションを指定してプリコンパイルすると、DBRMにタイムスタンプが埋め込まれなくなるため、SQL以外の変更による再コンパイルの際に再BINDが不要となり、-818エラーを回避できます。以下はLEVELオプションを使用したBINDステップのサンプルです。

//BIND EXEC PGM=IKJEFT01
//STEPLIB DD DSN=DIS.TEST.LOADLIB,DISP=SHR
//SYSOUT DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(TB3)
BIND PLAN(PLANA) -
PKLIST(PACKA) -
LEVEL -
ACQUIRE(ALLOCATE) -
ISOLATION (RS)
/*
  1. C言語のトークンとは?6つの種類とサンプルコードでわかりやすく解説

    トークンとはトークン(token)とは、コンパイラにとって意味を持つ、プログラムを構成する最小単位のことです。コンパイラはソースコードをこの最小単位へと分割し、生成されたトークンを基にコンパイルの各段階へと処理を進めていきます。トークンの種類C言語のトークンは、主に以下の6種類に分類されます。キーワード(予約語):int、return など、言語仕様によって意味が定められた語識別子:変数名や関数名など、開発者が自由に命名できる名前定数:10、3.14 など、プログラム中で値が変わらない固定値文字列:ダブルクォート( )で囲まれた文字の並び特殊記号:{ }、( )、; など、構文を区切るための記

  2. Cプログラムを機械語に変換する4つのステップを徹底解説

    プログラムの作成と実行の流れプログラムとは、プログラミング言語で記述された一連の命令の集まりです。プログラマーの仕事は、プログラムを作成し、その動作を確認することです。Cプログラムを機械語に変換して実行可能な形にするまでには、次の4つのステップが必要です。プログラムの作成と編集プログラムのコンパイルプログラムのリンクプログラムの実行1. プログラムの作成と編集プログラムの作成には「テキストエディタ」を使用します。テキストエディタを使えば、文字データの入力・修正・保存が自由に行えます。多くの場合、コンパイラには専用のテキストエディタが付属しています。プログラムを書き終えたら、ファイルとしてディス