コピーブックを操作するために COBOL 内で使用されるすべての方法が、データベース プリコンパイラで利用できるわけではありません。また、COBSQL 自身はインクルードされたコピーブックを処理することはできません。この問題は、Micro Focus Copybook Preprocessor (CP) を使用することによって解決できます。
CP は、他のプリプロセッサ (例えば、COBSQL) にコピーブックを処理する機構を提供するために開発されたプリプロセッサです。CP は、COBOL コンパイラと同じ規則でコピーブックを処理するため、すべてのコピーブック関連のコンパイラ指令は自動的に取り込まれ、COBCPY 環境変数を使用してコピーブックが検索されます。CP は、次のような文を展開します。
EXEC SQL INCLUDE ... END-EXEC
Oracle では .pco および .cob の拡張子、Sybase では .pco および .cbl の拡張子、Informix では .eco、.cob、および .mf2 の拡張子を使用します。
CP でコピーブックを解決し、正しく文をインクルードするには、次の Oracle と Sybase 用の COBOL コンパイラ指令を使用します。
copyext (pco,cbl,cpy,cob) osext(pco)
copyext (eco,mf2,cbl,cpy,cob) osext(eco)
COBSQL は、データベース プリコンパイラの起動前に CP を呼び出し、コピーブックを展開します。この時点ですべてのコピー関連コマンドが変換されるため、データベース プリコンパイラでは実質的に、単一のソース ファイルのみを処理することになります。
CP には、デバッグ時にコピーブックにアクセスできるという利点もあります。
CP は INCLUDE SQLCA 文を検出する場合に、次の処理を実行します。
CP プリプロセッサの SY 指令を指定する場合は、SQLCA インクルード ファイルの CP 展開を防止できます。次に使用例を示します。
preprocess(cobsql) preprocess(cp) sy endp
Sybase のプリコンパイラは SQLCA の展開機能を備えています。したがって、同プリコンパイラ用のコードを処理する場合には、SY 指令で CP による SQLCA 展開を無効化してください。
Oracle プリコンパイラの Pro*COBOL に対して MODE=ANSI オプションが指定されている場合は、さらに CP の SY 指令を使用して、SQLCA が正しく設定されるようにする必要があります。
Oracle のプリコンパイラは 2 種類の変数 (COMP および COMP-5) のいずれかを使用してコードを生成するため、それぞれの変数に対応する 2 組のコピーブックを持っています。標準の sqlca.cob、oraca.cob、および sqlda.cob のすべてに COMP データ項目が格納されています。sqlca5.cob、oraca5.cob、および sqlda5.cob には COMP-5 データ項目がそれぞれ格納されています。Oracle の comp5=yes 指令を使用する場合には、COBSQL の MAKESYN 指令を使用して SQLCA 内の COMP 項目を COMP-5 項目に変換する必要があります。
CP によるコピーブック検索でエラーが発生した場合には、OSEXT および COPYEXT コンパイラ指令が正しく設定されているかどうかを確認してください。COPYEXT を先に設定し、最初のエントリとしてソース ファイルの拡張子 (.pco や .eco など) を指定します。
コンパイラ指令の設定に問題がなければ、コピーブックが現在のディレクトリ (または COBCPY で指定されたディレクトリ) に存在することを確認します。
COBSQL と CP を組み合わせて使用すると、インクルードされたコピーブック内の SQL エラーが正しく報告されます。CP を使用しない場合は行数が無効となり、エラーが表示されないか、または、正しくない行に表示されます。