前へDB2 予約済みキーワード次へ

第 9 章 COBSQL

COBSQLは、Micro Focus COBOLといくつかのサードパーティ製データベースプリコンパイラの間の統合化インターフェイスを提供します。以下のプリコンパイラを対象とします:

COBSQL は、すでに上記のプリコンパイラを Micro Focus COBOL 製品とともに使用していて アプリケーションを Server Expressに移行する場合にのみ使用するようお奨めします。または、UNIX で実行するアプリケーションをクロス開発している場合にも使用できます。

それ以外の場合の埋め込み SQL アプリケーションの開発には、OpenESQL を使用することをお奨めします。


備考:Oracle のプリコンパイラ バージョン1.8 は入れ子のプログラムをサポートしていません。また、COBSQL はオブジェクト指向 COBOL 構文をサポートしていません。OO COBOL を使用する場合には、OpenESQL を使用してください。


9.1 概要

COBOL プログラムに埋め込み SQL 文を記述すると、Oracle や Sybase、Informix のデータベース管理システム(DBMS)の SQL 機能を利用することができます。埋め込み SQL は次の形式で記述します。

EXEC SQL
   SQL statement
END-EXEC

埋め込み SQL 文を含むプログラムは、COBOL コンパイラでコンパイルする前に Oracle (または Sybase、Informix)のプリコンパイラで処理する必要があります。この処理によって、埋め込み SQL 文が対応するデータベースサービス呼び出しに変換されます。さらに、ソースコードには COBOL ホスト変数をデータベースシステム側の SQL 変数名にバインドするコードが追加されます。

この方法では、各データベースルーチンの呼び出し形式に留意する必要がありません。ただし、プログラムのアニメーションではプリコンパイラの出力コードが表示され、埋め込み SQL 文を含む元のソースコードを見ることができません。この問題は COBSQL を使用すれば回避できます。

COBSQL はサードパーティのスタンドアローン型プリコンパイラと Micro Focus COBOL の環境を統合するインターフェイスとして機能します。EXEC SQL 文を含むプログラムを COBSQL で処理すれば、アニメーションでプリプロセッサの出力コードの代わりに変換前のソースコードを表示することが可能になります。

この章では、Oracle、Sybase または Informix プリコンパイラのいずれかと COBSQL を併用し、プログラムをコンパイルしてアニメートする方法について説明します。

9.2 準備

COBOL から DSBMS にアクセスするには、COBOL ランタイムシステムが DBMS に使用される API ルーチンを認知することが必要になります。データベースベンダによっては、次のいずれかを作成するスクリプトが提供されています。

このスクリプトには cob コマンドが含まれており、cob コマンドへのオプションを修正することによって、スクリプトの影響を制御することができます。

次の 2 つの節では、$ORACLE_HOME/precomp/lib/ins_precomp.mk に位置する Oracle 提供のメイクファイルスクリプトの使いかたの例を示しています。これらのサンプルは、他のデータベースベンダから提供されたスクリプトを使用する場合に、出発点として使用することができます。


注: これらのサンプルは、COBOL プログラムがマルチスレッドを使用しているものと想定しています。マルチスレッドを使用していない場合も、これらのサンプルを使用することができますが、その場合は、cob オプションの -t を削除し、ファイル名から _t を削除する必要があります。


9.2.1 Oracle 実行可能ランタイムシステムの作成

次の手順に従って、実行可能なランタイムシステムを作成します。

  1. メイクファイル、ins_precomp.mk を実行します。
    cd $ORACLE_HOME/precomp/lib
    make LOC_RTSORA=newrts -f ins_precomp.mk newrts

    ここで newrts は、出力される実行可能なランタイムシステムに付ける名前です。

  2. $COBDIR/bin/rts32_t のバックアップコピーを作成します。たとえば、次のように行います。
    cp $COBDIR/bin/rts32_t $COBDIR/bin/rts32_t.sav
  3. デフォルトのランタイムシステム、rts32_t を新しいランタイムシステム、newrts に置き換えます。たとえば、次のように行います。
    ln -s newrts $COBDIR/bin/rts32_t

9.2.2 Oracle DBMS ルーチンの共有ライブラリの作成

次の手順に従って、Oracle DBMS ルーチンの共有ライブラリを作成します。

  1. $ORACLE_HOME/precomp/lib/ins_precomp.mk ファイルを編集します。RTSORA_LINKLINE ではじまる行の -xe を -ze に置き換えます。

  2. メイクファイル、ins_precomp.mk を実行します。
    cd $ORACLE_HOME/precomp/lib
    make LOC_RTSORA=dbmslib -f ins_precomp.mk dbmslib

    ここで、dbmslib は、出力される共有ライブラリにつける名前です。

  3. メインプログラムを次の指令でコンパイルします。

    INITCALL"dbmslib" プログラムの先頭行が実行される前に、DBMS がサポートする共有ライブラリがロードされるようにします。
    SERIAL アプリケーションをスレッド環境で使用できるようにします (Oracle サポートがスレッドを使用する場合)

    プログラムの実行が異常終了し、dbmslib に関するランタイムシステムエラー 173 が発生すると、ランタイムシステムは共有ライブラリを見つけることができなくなります。これは、環境変数、LIBPATH、LD_LIBRARY_PATH または SHLIB_PATH に、Oracle サポートライブラリが保存されているパスが含まれていないためです。環境変数の設定内容をチェックして、再び実行します。

9.3 使用方法

COBSQL を使用するには、プログラムのコンパイル時に PREPROCESS"COBSQL" コンパイラ指令を指定します。この指令以降のすべての指令が、コンパイラから COBSQL に渡されます。 プログラムに $SET 文を使用するか、cob コマンドラインを通じて、コンパイラ指令を指定することができます。


注: cobsql は小文字で指定する必要があります。


COBSQL への指令送信を終了するには、COBOL の ENDP 指令を使用する必要があります。 たとえば、次のように指定します。

 cob -C "preprocess(cobsql) csqltype==oracle end-c comp5==yes endp"

END-C および ENDP は、次のように影響を与えます。

9.3.1 指令の指定

COBSQL に渡す指令は、コンパイラ指令と同じように指定できます。ただし、COBSQL 指令の前には、かならず PREPROCESS PREPROCESS"cobsql" を記述する必要があります。

COBSQL 指令は、Server Express 標準の指令ファイル(cobol.dir)に記述することも可能です。


cobol.dir ファイルに関する注意点


COBSQL 指令とプリコンパイラ指令は、専用のファイル(cobsql.dir)に記述することも可能です。このファイルは、カレントディレクトリか、または $COBDIR で指定されたディレクトリに保存します。COBSQL はカレントディレクトリ、$COBDIR で指定されたディレクトリの順序で cobsql.dir ファイルを検索します。この検索はファイルが見つかった時点で終了するため、cobsql.dir ファイルをカレントディレクトリに保存した場合には、$COBDIR で指定されたディレクトリは検索されません。


cobsql.dir ファイルに関する注意点


COBSQL は、まず cobsql.dir を処理し、次に cob コマンドラインから指定された指令を処理します。

多くの指令は、直前に NO を記述すれば無効化できます。たとえば、DISPLAY を無効化するには NO DISPLAY と記述します。以下の指令一覧では、NO で無効化できる指令にはアスタリスク(*)が付けられています。なお、標準ではすべての指令が無効(NO 付きで設定した状態)です。

一部の指令は短縮名で指定することが可能です。以下の指令一覧では、該当する指令の下に短縮名が示されています。

また、COBOL コンパイラによって COBSQL に渡すことが可能な指令もあります。(以下の『COBOL 指令』参照。) この方法を使えば、使用頻度の高い指令を何度も指定する手間が省けます。COBOL コンパイラから取り込み可能な指令は、COBSQL 指令より前に処理されます。

次に例を示します。

cob -V -k testprog.pco -C"p(cobsql) csqlt==ora makesyn end-c
    xref==yes mode==ansi endp list()"

9.3.2 COBSQL 指令の一覧

以下は、COBSQL 指令のリストです。

指令
説明
COBSQLTYPE
CSQLT
使用するプリコンパイラ(ORACLE SYBASE または INFOMIX)を指定します。(指定例:COBSQLTYPE=ORACLE)
CSTOP*
CSP
COBSQL が、アプリケーションが異常終了した場合にロールバックを実行できるストップ ランモジュールをロードするようにします。
DEBUGFILE*
DEB
プリプロセッサデバッグファイル(.deb ファイル)を作成します。
DISPLAY*
DIS
プリプロセッサ統計情報を表示します。この指令は、最初に COBSQL が正しくプリプロセッサを呼び出しているかを確認するときにだけ使用します。
END-COBSQL
END-C
END
COBSQL 指令の終わりを示します。残りの指令は SQL プリコンパイラに渡されます。
KEEPCBL プリコンパイルされたソースファイル(.cbl ファイル)を保存します。
MAKESYN すべての COMP ホスト変数を COMP-5 ホスト変数に変換します。COBSQL の MAKESYN 指令セットがない場合は、デフォルト動作では、ホスト変数だけでなくすべての変数が COMP から COMP-5 に変換されます。
NOMAKESYN COBSQL による COMP ホスト変数から COMP-5 ホスト変数への変換を停止します。
SQLDEBUG Micro Focus 社が COBSQL をデバッグするためのいくつかのファイルを作成します。これらのファイルには、プリコンパイラからの出力(通常は .cbl 拡張子)、プリコンパイラが作成したリストファイル(通常は .lis 拡張子)、そして .sdb 拡張子を持つ COBSQL デバッグファイルがあります。さらに KEEPCBL と TRACE を有効にします。
TRACE* トレースファイル(.trc ファイル)を作成します。
VERBOSE プログラムの処理中にすべてのプリコンパイラメッセージを表示し、ステータス更新を示します。この指令は最初に COBSQL が正しくプリプロセッサを呼び出しているかを確認するときにだけ使用します。

9.3.3 COBOL 指令の一覧

以下は、COBOL 指令のリストです。

指令
説明
BELL* エラーが発生したときにベルを鳴らすかどうかを制御します。
BRIEF* SQL エラー番号とともにエラーテキストを表示するかどうかを制御します。
CONFIRM* 受け付けられた指令、および拒否された指令を表示します。
LIST* プリコンパイラリストファイル(.lis ファイル)を保存します。
WARNING* 報告する SQL エラーの最低重大度を指定します。

9.4 Copyfile Preprocessor によるコピーファイルの展開

コピーファイルを操作するために COBOL 内で使用されるすべての方法が、データベースプリコンパイラで利用できるわけではありません。いくつかのプリコンパイラはインクルードされたコピーファイルを開いたり、展開できますが、コピーや置換を実行したり、panvalet コマンドを理解できるプリコンパイラはありません。この問題は、Micro Focus Copyfile Preprocessor(CP)を使用することによって解決できます。

CPは、他のプリプロセッサ(例:COBSQL)にコピーファイルを取り扱うためのメカニズムを提供するために開発されたプリプロセッサです。CPは、COBOL と同じルールでコピーファイルを取り扱いますので、すべての COPY 文関連の指令が自動的に取り入れられ、COBCPY 環境変数を使用して、コピーファイルが検索されます。また、CP は以下の SQL 文も展開します。

EXEC SQL
   INCLUDE ...
END-EXEC

Oracle は .pco および .cob 拡張子を、Sybase は .pco および .cbl 拡張子を、Informix は .eco.cob および .mf2 拡張子を使用します。

Oracle Sybase
Sybase と Oracle の場合に、CP でコピーファイルを決定し、文を正しく取り込むには、次の COBOL コンパイラ指令を使用します。

copyext (pco,cbl,cpy,cob) osext(pco)

Informix
Informix の場合は、次の指令を使用します。

copyext (eco,mf2,cbl,cpy,cob) osext(eco)

COBSQL は、データベースプリコンパイラの起動前に CP を呼び出し、コピーファイルを展開します。この時点ですべてのコピー関連コマンドが変換されるため、データベースプリコンパイラでは実質的に、単一のソース ファイルのみを処理することになります。

CP には、アニメーションの実行中にコピーファイルにアクセスできるという利点もあります。

CP は INCLUDE SQLCA 文を検出すると、次の処理を実行します。


注: プログラム実行中に、sqlca.cpy ファイルを使用すると、エラーになります。


CP の SY 指令を使用すれば、SQLCA インクルード ファイルの展開を無効化できます。次に使用例を示します。

preprocess"cobsql" preprocess"cp" sy endp

Sybase のプリコンパイラは SQLCA の展開機能を備えています。したがって、同プリコンパイラ用のコードを処理する場合には、SY 指令で CP による SQLCA 展開を無効化してください。

Oracle のプリコンパイラは 2 種類の変数(COMP および COMP-5)のいずれかを使用してコードを生成するため、それぞれの変数に対応する 2 組のコピーファイルを持っています。標準のコピーファイル セット(sqlca.coboraca.cobsqlda5.cob)には COMP データ項目、もう 1 つのコピーファイル セット(sqlca.coboraca.cob、および sqlda5.cob)には COMP-5 データ項目がそれぞれ格納されています。Oracle の comp5=yes 指令を使用する場合には、COBSQL の MAKESYN 指令を使用して SQLCA 内の COMP 項目を COMP-5 項目に変換する必要があります。

CP によるコピーファイル検索でエラーが発生した場合には、OSEXT および COPYEXT コンパイラ指令が正しく設定されているかどうかを確認してください。COPYEXT を先に設定し、最初のエントリとしてソース ファイルの拡張子(.pco.eco など)を指定します。

コンパイラ指令の設定に問題がなければ、コピーファイルがカレントディレクトリ(または COBCPY で指定されたディレクトリ)に存在することを確認します。

COBSQL と CP を組み合わせて使用すれば、コピーファイルの正しいレポートを生成できます。COBSQL のみを使用すると行番号が正しくカウントされず、検出されたエラーは表示されないか、または不正な行に表示されてしまいます。

9.5 各国語対応(NLS)

COBSQL のエラーメッセージ表示に使用する言語は LANG 環境変数で指定します。 NLS の詳細と LANG 環境変数の設定方法については、『プログラマーズガイド - アプリケーション作成』『各国語対応』の章を参照してください。 LANG 環境変数の詳細については、『Server Express ユーザガイド』の付録『環境変数』を参照してください。

COBSQL エラーメッセージ、cobsql.lng は、多数の異なる言語に翻訳されており、COBOL NLS メッセージファイルで見ることができます。現在の LANG の設定に cobsql.lng エラーメッセージがない場合は、デフォルトのエラーメッセージファイルが使用されます。


注: COBSQL では、データベースのプリコンパイラによって生成されたエラーメッセージは翻訳されません。


9.6 例

ここでは、Oracle または Sybase、Informix のプリコンパイラを使用する場合に、COBSQL を使用してプログラムをコンパイルするために Server Express のコマンドラインに入力するコマンドの例を紹介します。

Oracle

cob -a -v -k sample.pco -C "p(cobsql) cstop 
    cobsqltype==ORACLE endp"

Sybase

cob -a -v -P -k example1.pco -C"p(cobsql) csp CSQLT==syb endp"

Informix

cob -a -k demo1.eco -C "p(cobsql) cobsqltype==informix-new endp"

9.7 トラブルシューティング

COBSQL を使用して問題が発生したら、まず次のことをチェックします。

依然として問題が発生する場合は、Micro Focus アンサーラインにお問い合わせください。アンサーラインが問題の原因を突き止められるように、次のことを行ってください。

9.7.1 おもなチェック ポイント

上記の各項目をチェックしても原因を特定できない場合には、さらに以下をチェックしてください。

9.7.2 Oracle で考慮すべき事柄

ユーザは Oracle Pro*COBOL 1.8 または Oracle Pro*COBOL 8.x を使用することができます。次の節では、これらの各バージョンで考慮すべき項目について説明します。

9.7.2.1 Oracle Pro*COBOL 1.8 で考慮すべき事柄

9.7.2.2 Oracle Pro*COBOL 8.x で考慮すべき事柄

Pro*COBOL 8.0 のサポートは、現在 Pro*COBOL 8.0 4.0 プリコンパイラで正しく動作している COBSQL に追加されました。

9.7.2.2.1 COBSQL のための Oracle 8 指令

Oracle 8 とともに COBSQL を使用するには、次の指令を使用する必要があります。

指令
説明
CBL2ORA8
C28
Oracle 8 の特定サポートモジュール ora8prot および ora8lib に呼び出しを行います。これらのモジュールはいずれも csqlsupp.dll に構築されます。
COBSQLTYPE
CSQLT
EXEC SQL プリプロセッサ。ORACLE8 および ORA8 オプションを使用して、COBSQL とともに Pro*COBOL 8.x を使用します。
9.7.2.2.2 Oracle バージョンの移行

Pro*COBOL 1.x から 8.x にプログラムを移行する場合は、次のことに留意する必要があります。

9.7.2.2.3 Oracle 8 と Micro Focus

Pro*COBOL 8.x は、次に示すいくつかの Micro Focus COBOL 言語の拡張機能、データ定義およびセクションヘッダーを拒否します。

打開策としては、これらの項目を Pro*COBOL によって開かれないコピーファイルに配置する必要があります。しかし、Pro*COBOL を実行する前に、コピーファイルを拡張する CP を使用すると、動作しません。CP を呼び出してコピーファイルを拡張する htmlpp を使用すると、問題を引き起こします。したがって、COBSQL の前に htmlpp を実行する必要があります。

たとえば、次のコンパイル行は動作します。

cob PROG -C "p(htmlpp) preprocess(cobsql) csqlt==oracle8 endp"

一方、次の行は動作しません。

cob PROG -c "preprocess(cobsql) csqlt==oracle8 p(htmlpp) endp"

Pro*COBOL 8.0.4 の Working-Storage Section (作業域) に少なくとも 1 つの変数を定義して、生成された .cbl ファイルにその変数を追加する必要があります。

9.7.3 Sybase で考慮すべき事柄

9.7.4 Informix で考慮すべき事柄


Copyright © 2002 Micro Focus International Limited. All rights reserved.
本書ならびに使用されている固有の商標と商品名は国際法で保護されています。

前へDB2 予約済みキーワード次へ