![]() | DB2 | 予約済みキーワード | ![]() |
COBSQLは、Micro Focus COBOLといくつかのサードパーティ製データベースプリコンパイラの間の統合化インターフェイスを提供します。以下のプリコンパイラを対象とします:
COBSQL は、すでに上記のプリコンパイラを Micro Focus COBOL 製品とともに使用していて アプリケーションを Server Expressに移行する場合にのみ使用するようお奨めします。または、UNIX で実行するアプリケーションをクロス開発している場合にも使用できます。
それ以外の場合の埋め込み SQL アプリケーションの開発には、OpenESQL を使用することをお奨めします。
備考:Oracle のプリコンパイラ バージョン1.8 は入れ子のプログラムをサポートしていません。また、COBSQL はオブジェクト指向 COBOL 構文をサポートしていません。OO COBOL を使用する場合には、OpenESQL を使用してください。
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 を併用し、プログラムをコンパイルしてアニメートする方法について説明します。
COBOL から DSBMS にアクセスするには、COBOL ランタイムシステムが DBMS に使用される API ルーチンを認知することが必要になります。データベースベンダによっては、次のいずれかを作成するスクリプトが提供されています。
このスクリプトには cob コマンドが含まれており、cob コマンドへのオプションを修正することによって、スクリプトの影響を制御することができます。
次の 2 つの節では、$ORACLE_HOME/precomp/lib/ins_precomp.mk に位置する Oracle 提供のメイクファイルスクリプトの使いかたの例を示しています。これらのサンプルは、他のデータベースベンダから提供されたスクリプトを使用する場合に、出発点として使用することができます。
注: これらのサンプルは、COBOL プログラムがマルチスレッドを使用しているものと想定しています。マルチスレッドを使用していない場合も、これらのサンプルを使用することができますが、その場合は、cob オプションの -t を削除し、ファイル名から _t を削除する必要があります。
次の手順に従って、実行可能なランタイムシステムを作成します。
cd $ORACLE_HOME/precomp/lib make LOC_RTSORA=newrts -f ins_precomp.mk newrts
ここで newrts は、出力される実行可能なランタイムシステムに付ける名前です。
cp $COBDIR/bin/rts32_t $COBDIR/bin/rts32_t.sav
ln -s newrts $COBDIR/bin/rts32_t
次の手順に従って、Oracle DBMS ルーチンの共有ライブラリを作成します。
cd $ORACLE_HOME/precomp/lib make LOC_RTSORA=dbmslib -f ins_precomp.mk dbmslib
ここで、dbmslib は、出力される共有ライブラリにつける名前です。
| INITCALL"dbmslib" | プログラムの先頭行が実行される前に、DBMS がサポートする共有ライブラリがロードされるようにします。 |
| SERIAL | アプリケーションをスレッド環境で使用できるようにします (Oracle サポートがスレッドを使用する場合) |
プログラムの実行が異常終了し、dbmslib に関するランタイムシステムエラー 173 が発生すると、ランタイムシステムは共有ライブラリを見つけることができなくなります。これは、環境変数、LIBPATH、LD_LIBRARY_PATH または SHLIB_PATH に、Oracle サポートライブラリが保存されているパスが含まれていないためです。環境変数の設定内容をチェックして、再び実行します。
COBSQL を使用するには、プログラムのコンパイル時に PREPROCESS"COBSQL" コンパイラ指令を指定します。この指令以降のすべての指令が、コンパイラから COBSQL に渡されます。 プログラムに $SET 文を使用するか、cob コマンドラインを通じて、コンパイラ指令を指定することができます。
注: cobsql は小文字で指定する必要があります。
COBSQL への指令送信を終了するには、COBOL の ENDP 指令を使用する必要があります。 たとえば、次のように指定します。
cob -C "preprocess(cobsql) csqltype==oracle end-c comp5==yes endp"
END-C および ENDP は、次のように影響を与えます。
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()"
end-c までに 2 つの COBSQL 指令(csqlt=ora および makesyn)が指定されています。
endp までに 2 つのプリコンパイラ指令(xref=yes および mode=ansi)が指定されています。(この場合、プリコンパイラは Pro*COBOL です。)
list() です。
以下は、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 が正しくプリプロセッサを呼び出しているかを確認するときにだけ使用します。 |
以下は、COBOL 指令のリストです。
| 指令 |
説明 |
|---|---|
| BELL* | エラーが発生したときにベルを鳴らすかどうかを制御します。 |
| BRIEF* | SQL エラー番号とともにエラーテキストを表示するかどうかを制御します。 |
| CONFIRM* | 受け付けられた指令、および拒否された指令を表示します。 |
| LIST* | プリコンパイラリストファイル(.lis ファイル)を保存します。 |
| WARNING* | 報告する SQL エラーの最低重大度を指定します。 |
コピーファイルを操作するために 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.cob、oraca.cob、sqlda5.cob)には COMP データ項目、もう 1 つのコピーファイル セット(sqlca.cob、oraca.cob、および sqlda5.cob)には COMP-5 データ項目がそれぞれ格納されています。Oracle の comp5=yes 指令を使用する場合には、COBSQL の MAKESYN 指令を使用して SQLCA 内の COMP 項目を COMP-5 項目に変換する必要があります。
CP によるコピーファイル検索でエラーが発生した場合には、OSEXT および COPYEXT コンパイラ指令が正しく設定されているかどうかを確認してください。COPYEXT を先に設定し、最初のエントリとしてソース ファイルの拡張子(.pco や .eco など)を指定します。
コンパイラ指令の設定に問題がなければ、コピーファイルがカレントディレクトリ(または COBCPY で指定されたディレクトリ)に存在することを確認します。
COBSQL と CP を組み合わせて使用すれば、コピーファイルの正しいレポートを生成できます。COBSQL のみを使用すると行番号が正しくカウントされず、検出されたエラーは表示されないか、または不正な行に表示されてしまいます。
COBSQL のエラーメッセージ表示に使用する言語は LANG 環境変数で指定します。 NLS の詳細と LANG 環境変数の設定方法については、『プログラマーズガイド - アプリケーション作成』の『各国語対応』の章を参照してください。 LANG 環境変数の詳細については、『Server Express ユーザガイド』の付録『環境変数』を参照してください。
COBSQL エラーメッセージ、cobsql.lng は、多数の異なる言語に翻訳されており、COBOL NLS メッセージファイルで見ることができます。現在の LANG の設定に cobsql.lng エラーメッセージがない場合は、デフォルトのエラーメッセージファイルが使用されます。
注: COBSQL では、データベースのプリコンパイラによって生成されたエラーメッセージは翻訳されません。
ここでは、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"
COBSQL を使用して問題が発生したら、まず次のことをチェックします。
SQL 以前に、クライアントとサーバ間の通信状態をチェックします。TCP/IP ネットワークでは、ワークステーションとサーバとの間で双方向に ping コマンドを実行します。ホスト名が動作しない場合は、IP アドレスそのもので試してみます。
SQL ネットワークソフトウェアと通常のネットワークソフトウェア間で通信が正常に実行されているかどうかをチェックします。ほとんどの SQL 製品には、SQL ネットワークの設定を確認するための ping ユーティリティが付属しています。
SQL ネットワークに問題がなければ、SQL 文による対話テストを行います。SQL 製品には通常、SQL 文をキー入力して結果を確認するための単純なユーティリティと、SQL 対話テストに使用できるサンプルデータベースが付属しています。
スタンドアローンプリコンパイラの動作をチェックします。アイコンまたはコマンドラインでプリコンパイラを起動し、COBOL コードが正しく生成されることを確認してください。通常、SQL 製品には、プリコンパイラ付きのサンプルアプリケーションが付属しています。
プリプロセス済みのアプリケーションが正しく動作をすることを確認します。展開後のプログラムを COBOL コンパイラで処理し、生成されたアプリケーションを実行します。
最小限の指令で COBSQL の機能をテストします。Server Express でテスト用プロジェクトを作成し、サンプルプログラムと同じディレクトリに SQLCA コピーファイルを格納した後、プリコンパイラを実行して動作をチェックします。
依然として問題が発生する場合は、Micro Focus アンサーラインにお問い合わせください。アンサーラインが問題の原因を突き止められるように、次のことを行ってください。
上記の各項目をチェックしても原因を特定できない場合には、さらに以下をチェックしてください。
使用するすべての製品が最新バージョンであることを確認します。
ベンダー提供のドキュメントとサンプルアプリケーションをチェックします。
PATH およびその他の環境変数の設定と設定ファイルの内容をチェックします。
通常、COBSQL はデータベースプリコンパイラに渡すコマンドラインを表示しません。コマンドラインを表示するには、SQLDEBUG 指令を設定します。コマンドラインの表示は、プリコンパイラでコマンドラインエラーが検出された場合に必要になります。コマンドラインエラーの原因としては、プリコンパイラに不正な指令を渡した場合やプリコンパイラコマンドラインの長さが上限を超えている場合などが考えられます。
プリコンパイラが異常終了すると、COBSQL は次のエラーメッセージを表示します。
* CSQL-F-021: プリコンパイラは完了しませんでした -- 終了します
オペレーティングシステムによるデータベースプリコンパイラの実行時に、必要なメモリ領域を確保できなかった可能性があります。
プリコンパイラの出力ファイルが見つからないと、COBSQL は次のエラーメッセージを表示します。プリコンパイラで重大なエラーが発生したため、出力ファイルを生成できなかった可能性があります。
* CSQL-E-024: ファイル filename の I/O が検出されました * CSQL-E-023: ファイルステータス 3 / 5
filename は、データベースプリコンパイラが生成すべき出力ファイルの名前を示します。
プリコンパイラが正常に実行されるにもかかわらず、COBSQL が展開後のソースファイルのデータ不足を知らせるエラーメッセージ(展開されたソースの早期終了)を表示する場合には、データベースプリコンパイラが生成したソースファイルとオリジナルのソースファイルとの間に一致しない行があったことを示します。
上記のメッセージは、プログラムに SQL 文が含まれていない場合にも表示されます。ほとんどのデータベースプリコンパイラは、SQL 文が見つからないと出力ファイルの生成を中断し、このエラーを表示するためです。
ユーザは Oracle Pro*COBOL 1.8 または Oracle Pro*COBOL 8.x を使用することができます。次の節では、これらの各バージョンで考慮すべき項目について説明します。
DBMS HOLD_CURSOR MAXOPENCURSORS MODE RELEASE_CURSOR
アプリケーションは通常、1 つの SQL 文で 1 行のデータを取り込みますが、配列を使用すれば複数行の取り込みが可能になります。Oracle のプリコンパイラには、配列による複数行の取り込み例を示す sample3.pco というサンプルプログラムが付属しています。(ファイル名が異なる場合もあります。)配列の詳細については、『Pro*Cobol Supplement to the ORACLE Precompilers Guide』の説明をご覧ください。
Pro*Cobol が生成する情報をできるだけ多く取り込むには、xref=yes 指令を使用します。 この指令を Pro*Cobol 設定ファイル $ORACLE_HOME\PROxx\pcbcfg.cfg に追加することができます。このファイルの説明は次のとおりです。
| xx | Pro*COBOL のバージョン (Oracle 8.0 の場合は PRO80) 。 |
| $ORACLE_HOME | マシン上の Oracle インストール時のルートディレクトリ。 |
Pro*COBOL 8.0 のサポートは、現在 Pro*COBOL 8.0 4.0 プリコンパイラで正しく動作している COBSQL に追加されました。
Oracle 8 とともに COBSQL を使用するには、次の指令を使用する必要があります。
| 指令 |
説明 |
|---|---|
| CBL2ORA8 C28 |
Oracle 8 の特定サポートモジュール ora8prot および ora8lib に呼び出しを行います。これらのモジュールはいずれも csqlsupp.dll に構築されます。 |
| COBSQLTYPE CSQLT |
EXEC SQL プリプロセッサ。ORACLE8 および ORA8 オプションを使用して、COBSQL とともに Pro*COBOL 8.x を使用します。 |
Pro*COBOL 1.x から 8.x にプログラムを移行する場合は、次のことに留意する必要があります。
挿入されたあらゆる変数を GLOBAL として定義します。EBCDIC から ASCII への変換をサポートする COBSQL によって挿入されたデータ項目を含まれます。
Oracle 指令 DECLARE_SECTION=NO が設定されている場合 (デフォルト) は、Oracle はすべての COMP、BINARY または COMP-4 データ項目を COMP-5 に変換します。
Declare Section への項目の変換を制限するには、 次のいずれかを設定します。
PACKED-DECIMAL
これらのデータ項目は、COMP-3 データ項目と同じ方法で扱われます。
COMP-4
PIC 9(4) COMP / COMP-4 / BINARY / COMP-5
PIC 9(4) USAGE DISPLAY
PIC s9(4) USAGE DISPLAY SIGN TRAILING
PIC s9(4) USAGE DISPLAY SIGN TRAILING SEPARATE
PIC s9(4) USAGE DISPLAY SIGN LEADING
PIC s9(4) USAGE DISPLAY SIGN LEADING SEPARATE
この型は、以前は Oracle の DISPLAY データ型としてサポートされていました。
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 ファイルにその変数を追加する必要があります。
クライアントのオペレーティングシステムがデフォルトで設定されていても、Sybase が各国語のサポートでエラーをレポートする場合は、LANG 環境変数を使用して、locales.dat ファイルの設定を無効にします。
たとえば、AIX クライアントに問題が発生し、locales.dat ファイルに次のような AIX の設定が行われている場合の例を説明します。
[aix] locale = C, us_english, iso_1 locale = En_US, us_english, iso_1 locale = en_US, us_english, iso_1 locale = default, us_english, iso_1
この場合に、US English で行うことができる LANG 設定は、次のようになります。
LANG=en_US
SYB-severity-number-text
パラメータの説明は次のとおりです。
| SYB | 修正された Sybase のエラーメッセージであることを COBSQL に示す文字列。 |
| severity | エラーの重大度を示します。Sybase のメッセージには、一般的なエラーや致命的なエラーではなく、警告にすぎないものがあります。 |
| number | Sybase のエラーに割り当てられた、ユニークな 4 桁のエラー番号。 |
| text | Sybase の本来のエラーメッセージ。 |
たとえば、esql.loc ファイルの典型的なエントリは、次のようになります。
9 = M_PRECLINE, "Warning(s) during check of query on line %1!."
これは、読み取りのために、次のように変更されます。
9 = M_PRECLINE, "SYB-W-2009 Warning(s) during check of query on line %1!."
変更する前に、esql.loc のコピーを作成することをお奨めします。修正バージョンを使用すると、COBSQL であらゆる Sybase エラーメッセージを検出することができます。
esql.loc の位置は、使用する言語とコードページによって決まります。これは locales.dat ファイルに定義されます。AIX プラットフォームのデフォルト言語の定義が、次のように行われている場合の例を説明します。
[aix] locale = C, us_english, iso_1 locale = En_US, us_english, iso_1 locale = en_US, us_english, iso_1 locale = default, us_english, iso_1
この場合のデフォルトの言語は、iso_1 コードページを使用した us_english であり、使用する esql.loc のコピーは、次のようになります。
/sybase home/locales/messages/us_english/iso_1/esql.loc
上記の sybase home は Sybase クライアントがインストールされているディレクトリです。
Sybase でさまざまなエラーメッセージファイルを使用して検索する方法については、Sybase の『Client Reference Manual』を参照してください。
copyext(eco,mf2,cob,cpy,cbl) osext(eco)
Copyright © 2002 Micro Focus International Limited. All rights reserved.
本書ならびに使用されている固有の商標と商品名は国際法で保護されています。
![]() | DB2 | 予約済みキーワード | ![]() |