ここでは、COBSQL 統合プロセッサの使用方法について説明します。
すでに COBSQL を Micro Focus COBOL の旧製品とともに使用しており、作成済みのアプリケーションをこのシステムに移行する場合は、COBSQL を使用してください。他の埋め込み SQL アプリケーション開発には OpenESQL をお奨めします。
COBOL プログラムに次の形式で埋め込み SQL 文を記述すると、Oracle、Sybase、または Informix のデータベース管理システム (DBMS) の SQL 機能を利用することができます。
EXEC SQL
SQL 文
END-EXEC
また、埋め込み SQL 文を含むプログラムは、COBOL コンパイラでコンパイルする前に Oracle、Sybase、または Informix のプリコンパイラで処理する必要があります。この処理によって、埋め込み SQL 文が対応するデータベースサービス呼び出しに変換されます。さらに、ソースコードには COBOL ホスト変数をデータベースシステム側の SQL 変数名にバインドするコードが追加されます。
この方法の利点は、各データベースルーチンの呼び出し形式に精通している必要がありません。また、欠点はプログラムをアニメートする場合はプリコンパイラの出力コードが表示され、埋め込み SQL 文を含む元のソースコードを見ることができません。この問題は COBSQL を使用すると回避できます。
COBSQL はサードパーティのスタンドアローンプリコンパイラと Micro Focus COBOL の環境の間を統合するインターフェイスとして機能します。COBSQL を使用すると、EXEC SQL 文を含むプログラムをアニメートでき、プリコンパイラが生成するコードではなく、元のソースコードを表示できます。
ここでは、Oracle、Sybase、または Informix プリコンパイラと COBSQL を 組み合わせて、プログラムのコンパイルとアニメートを実行する方法を説明します。
注:SOURCEFORMAT"FREE" コンパイラ指令でコンパイルされたプログラムでは COBSQL を使用できません。プログラムが自由形式の場合は、OpenESQL を使用してください。
COBSQL を使用するには、プログラムのコンパイル時に PREPROCESS(cobsql) コンパイラ指令を指定します。この指令以降のすべての指令が、コンパイラから COBSQL に渡されます。コンパイラ指令は $SET 文でプログラム内に記述できます。プロジェクトの「プロパティ」ダイアログボックスで設定することもできます。
COBSQL に渡す指令を終了するには、COBOL の ENDP 指令を使用する必要があります。これを行うには、プロジェクトのプロパティの指令末尾に、次の行を追加します。
preprocess(cobsql) csqltype=database_product end-c
comp5=yes endp;
database_product には、Oracle、Sybase、または Informix のいずれかを指定します。たとえば、Oracle の場合は、次の行を追加します。
preprocess(cobsql) csqltype=oracle end-c comp5=yes endp;
注:Visual Studioの のプロジェクトのプロパティでは、セミコロン (;) に後に続く指令はすべて無視されます。このため、ビルド設定に上記の行を追加する場合は、設定の末尾にこの行を置く必要があります。
Visual Studio の「プロジェクトのプロパティ」ダイアログボックスで指令を設定する場合には、システムによってデフォルトの COBOL 指令が追加されるため、必ず上記の行を記述する必要があります。
プロジェクト設定で設定した場合、END-C と ENDP を含む行は次のように処理されます。
cobol testprog p(cobsql) COBSQL 指令 END-C プリコンパイラオプション ENDP コンパイラ指令;
cobol testprog p(cobsql) csqlt=ora makesyn end-c xref=yes mode=ansi endp list();
· end-c で終了する COBSQL 指令は、csqlt=ora と makesyn です。
· endp で終了するプリコンパイラ指令 (この場合は、Pro*COBOL) は、xref=yes と mode=ansi です。
· コンパイラ指令は list() です。
COBSQL に渡す指令は、コンパイラ指令と同じように指定できます。ただし、COBSQL 指令の前には、必ず PREPROCESS(cobsql) を記述する必要があります。
COBSQL 指令は、指令ファイル (cobol.dir) に記述することもできます。
注:
また、COBSQL 指令とプリコンパイラ指令を cobsql.dir ファイルに記述することもできます。このファイルは、現在のディレクトリまたは、COBDIR 環境変数で指定されたディレクトリに格納する必要があります。COBSQL は、現在のディレクトリか、または、$COBDIR で指定されたディレクトリで cobsql.dir ファイルを検索します。cobsql.dir ファイルが見つかった時点で、検索は終了します。cobsql.dir ファイルが現在のディレクトリに存在する場合には、COBDIR 環境変数で指定されたディレクトリは検索されません。
注:
COBSQL は、cobsql.dir ファイルを処理し、各指令は「ビルド設定」ダイアログボックスまたはコマンド ラインで設定します。
多くの指令は、直前に NO を記述すると逆の効果になります。たとえば、DISPLAY の逆の効果は NO DISPLAY です。デフォルトでは、すべての指令が NO 付きで設定した状態です。
一部の指令は短縮名が指定できます。次の指令リストでは、該当する指令のすぐ下に短縮名が示されています。
また、COBOL コンパイラによって COBSQL に渡すことができる指令もあります (『COBOL 指令』を参照)。この方法を使用すると、使用頻度の高い指令を何度も指定する手間が省けます。COBOL コンパイラから取り込み可能な指令は、COBSQL 指令より前に処理されます。
次に例を示します。
cobol testprog p(cobsql) csqlt=ora makesyn end-c xref=yes mode=ansi endp list();
COBSQL 指令を次に示します。
使用するプリプロセッサを指定します。
COBSQLTYPE={ORACLE | ORACLE8 | SYBASE | INFORMIX-NEW}
同義語: | CSQLT |
COBSQL が実行時にデータベースサポートモジュールをロードします。
[NO]CSTART
デフォルト: | NOCSTART |
同義語: | CST |
この指令は、UNIX では使用できません。
COBSQL が、アプリケーションが異常終了したときにロールバックを実行できる実行停止モジュールをロードします。
[NO]CSTOP
デフォルト: | NOCSTOP |
同義語: | CSP |
この指令は、UNIX では使用できません。
デバッグ ファイル (.deb) を作成します。
[NO]DEBUGFILE
デフォルト: | NODEBUGFILE |
同義語: | DEB |
プリコンパイラの統計を表示します。この指令は、最初に COBSQL が正しくスタンドアローンのプリプロセッサを呼び出しているかを確認するときにのみ使用します。
[NO]DISPLAY
デフォルト: | NODISPLAY |
同義語: | DIS |
COBSQL 指令の末尾を示します。残りの指令は、プリコンパイラに渡されます。
END-COBSQL END-C END
デフォルト: | 指定できません。 |
同義語: | END-C, END |
プリコンパイルされたソースファイル (.cbl) を保存します。
KEEPCBL
すべての COMP ホスト変数を COMP-5 ホスト変数に変換します。MAKESYN と NOMAKESYN のどちらも設定されていない場合は (デフォルト)、COMP または COMP-4 として定義されている (ホスト変数のみではなく) すべての変数が COMP-5 に変換されます。
[NO]MAKESYN
デフォルト: | NOMAKESYN |
COBSQL のデバッグに使用するファイルを数多く作成します。これらのファイルには、プリコンパイラからの出力ファイル (通常は拡張子 .cbl)、プリコンパイラが作成するリストファイル (通常は拡張子 .lis)、そして 拡張子 .sdb をもつ COBSQL デバッグ ファイルがあります。さらに KEEPCBL と TRACE をオンにします。
SQLDEBUG
デフォルト: | 指定できません。 |
同義語: | SQLDEBUG |
[NO]TRACE
デフォルト: | NOTRACE |
同義語: | トレースファイル (.trc) を作成します。 |
プログラムの処理中にすべてのプリコンパイラメッセージを表示し、ステータスを更新します。この指令は、最初に COBSQL が正しくスタンドアローンのプリプロセッサを呼び出しているかを確認するときのみに使用します。
VERBOSE
デフォルト: | 指定できません。 |
コンパイラが COBSQL に渡す COBOL 指令を次に示します。
指令 | 説明 |
---|---|
[NO]BELL | エラーが発生したときにベルを鳴らすかどうかを制御します。 |
[NO]BRIEF | SQL エラー番号とともにエラーテキストを表示するかどうかを制御します。 |
[NO]CONFIRM | 受け付けられた指令、および拒否された指令を表示します。 |
[NO]LIST | プリコンパイラリストファイル (.lis) を保存します。 |
[NO]WARNING | 報告する SQL エラーの最低重大度を指定します。 |
COBSQL アプリケーションの出荷パッケージに同梱すべきデータベースサポートモジュールは、このマニュアルでは説明していません。次の説明は、必要なすべてのサポートモジュールがエンドユーザーのマシンにインストール済みで、マシンがデータベースサーバーと通信できる状態に正しく設定されていることを仮定しています。
COBSQL アプリケーションをリンクする場合は、インポートライブラリ csqlsupp.lib を使用します。これにより、COBSQL で挿入された呼び出しが COBSQL の初期化モジュールと実行停止モジュールに変換されます。呼び出しの変換には csqlsupp.dll モジュールが使用されるため、COBSQL アプリケーションにはこのモジュールを同梱する必要があります。この汎用サポートモジュールは、Oracle と Sybase アプリケーションにも必要です。
アプリケーションのリンク時に、使用するライブラリの 1 つとして csqlsupp.lib を指定します。ライブラリ csqlsupp.lib は、lib ディレクトリに格納されています。また、csqlsupp.dll モジュールは bin ディレクトリに格納されています。
アプリケーションを主プログラム (.exe ファイル) と複数の DLL ファイルとして実装する場合には、CSTART または CSTOP COBSQL 指令でコンパイルしたモジュールのみに csqlsupp.lib をリンクする必要があります。
すべてのプログラムを CSTART または CSTOP でコンパイルした場合には、すべてのモジュールに csqlsupp.lib をリンクする必要があります。csqlsupp.lib をリンクしたモジュールは、本来のサイズよりわずかに大きくなります。アプリケーションの実行時には、単一の csqlsupp.lib のみがロードされます。
主プログラムのみを CSTART と CSTOP でコンパイルした場合には、主プログラムのみに csqlsupp.lib ライブラリをリンクする必要があります。つまり、CSTART または CSTOP COBSQL 指令でコンパイルしたプログラムのモジュールには、必ず csqlsupp.lib をリンクする必要があります。
コピーファイルを操作するために COBOL 内で使用されるすべての方法が、データベースプリコンパイラで利用できるわけではありません。また、COBSQL 自体はインクルードされたコピーファイルを処理できません。この問題は、Micro Focus Copyfile Preprocessor (CP) を使用することによって解決できます。
CP は、他のプリプロセッサ (たとえば、COBSQL) にコピーファイルを処理する機構を提供するために開発されたプリプロセッサです。CP は、COBOL コンパイラと同じ規則でコピーファイルを処理するため、すべてのコピーファイル関連のコンパイラ指令は自動的に取り込まれ、COBCPY 環境変数を使用してコピーファイルが検索されます。 CP は、次のような文を展開します。
EXEC SQL INCLUDE ... END-EXEC
CP の詳細は、オンラインヘルプを参照してください (ヘルプファイルの索引で「CP」を選択します)。
Oracle では .pco および .cob の拡張子、Sybase では .pco および .cbl の拡張子、Informix では .eco、.cob、および .mf2 の拡張子を使用します。
Oracle と Sybase:
CP でコピーファイルを解決し、正しく文をインクルードするには、次の Oracle と Sybase 用の 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 インクルードファイルの CP 展開を防止できます。次に使用例を示します。
preprocess(cobsql) preprocess(cp) sy endp
Sybase のプリコンパイラは SQLCA の展開機能を備えているため、Sybase のコードを処理する場合は、必ず CP の SY 指令を使用してください。
Oracle は、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 を使用しない場合は行数が無効となり、エラーが表示されないか、または、正しくない行に表示されます。
COBSQL のエラー メッセージの表示に使用する言語は LANG 環境変数で指定します。NLS (national locale support; 各ロケール サポート) の詳細は、ヘルプファイルの索引で「NLS」を選択してください。LANG 環境変数の設定については「LANG」を選択します。
ほとんどのデータベースクライアントは、いくつかの NLS 機能を含んでいますが、LANG 環境変数の設定条件は COBOL システムの場合と異なります。そのため、環境変数のかわりに COBLANG を使用することをお奨めします。
COBLANG の設定は、COBOL システムのみに影響します。データベースクライアント側では LANG 変数を使用できます。COBLANG を正しく実行するためには、mflangnn.lbr (nn は COBLANG の設定値) が bin ディレクトリで使用可能であることが必要です。たとえば、COBLANG=05 (英国 NLS メッセージ) にすると、Bin ディレクトリに mflang05.lbr ファイルを作成します。
COBSQL のエラー メッセージ ファイル cobsql.lng は、多くの異なる言語に翻訳され、COBOL NLS メッセージ ファイルとともに保存されます。現在の LANG 設定用のエラー メッセージ ファイル cobsql.lng が存在しない場合には、デフォルトのエラー メッセージ ファイルが使用されます。
注:COBSQL は、データベースプリコンパイラのエラー メッセージを処理しません。
ここでは、COBSQL を使用してプログラムをコンパイルする際にコマンド プロンプトに入力するコマンドの例を、Oracle プリコンパイラと Sybase プリコンパイラについて説明します。
Oracle
cobol sample.pco anim nognt preprocess(cobsql) cstart cstop CSQLT=ORA end-c comp5=yes endp;
Sybase
cobol example1.pco confirm preprocess(cobsql) cstop csp cobsqltype=sybase preprocess(cp) sy endp;
問題発生時には、次の各項目をチェックしてください。
SQL 以前に、クライアントとサーバー間の通信状態をチェックします。TCP/IP ネットワークでは、ワークステーションとサーバーとの間で双方向に ping コマンドを実行します。ホスト名が動作しない場合は、IP アドレスそのものを試してみます。PC の各種プロトコルを使用しているネットワークでは、ネットワークドライブのマウントやメッセージ送信を試みてください。
SQL ネットワークソフトウェアと通常のネットワークソフトウェア間で通信が正常に実行されているかどうかをチェックします。多くの SQL ベンダは、SQL ネットワークの設定を確認する ping ユーティリティを提供しています。
SQL ネットワークに問題がない場合は、SQL 文による対話テストを行います。多くの SQL ベンダは、キーボードから SQL を入力し、その結果を表示する簡易ユーティリティを提供しています。また、SQL 対話テストに使用できるサンプルデータベースも提供しています。
スタンドアローンプリコンパイラの動作を妥当性検査します。アイコンまたはコマンド ラインでプリコンパイラを起動し、COBOL コードが正しく生成されることを確認してください。正常に動作するサンプルアプリケーションが、プリコンパイラに提供されています。
プリプロセス済みのアプリケーションが正しく動作をすることを確認します。展開後のプログラムを COBOL コンパイラで処理し、生成されたアプリケーションを実行します。
最小限の指令で COBSQL の機能をテストします。テスト用プロジェクトを作成します。サンプルプログラムと同じディレクトリに SQLCA コピーファイルを格納した後、プリコンパイラを実行して動作をチェックします。
ここまでの対処をしても問題が発生する場合は、サポート窓口にお問い合わせください。 サポート窓口で、問題の原因を突き止められるように、次の作業を行ってください。
上記の各項目を確認しても原因を特定できない場合には、さらに次の項目を確認してください。
使用するすべての製品が最新バージョンであることを確認します。
ベンダ提供のマニュアルとサンプルアプリケーションを確認します。
PATH および他の環境変数の設定と構成ファイルの内容を確認します。
デフォルトでは、COBSQL はデータベースプリコンパイラに渡すコマンド ラインを表示しません。コマンド ラインを表示するには、SQLDEBUG 指令を設定します。コマンド ラインの表示は、プリコンパイラでコマンド ライン エラーが検出されたときに必要になります。コマンド ライン エラーの原因としては、プリコンパイラに無効な指令を渡した場合やプリコンパイラコマンド ラインの長さが上限を超えている場合などが考えられます。
プリコンパイラが異常終了する場合には、COBSQL は次のエラー メッセージを表示することがあります。
* CSQL-F-021: プリコンパイラは完了しませんでした。 -- 終了します。
オペレーティング システムによるデータベースプリコンパイラの実行時に、必要なメモリ領域を確保できなかった可能性があります。
プリコンパイラの出力ファイルが見つからない場合には、COBSQL は次のエラー メッセージを表示することがあります。プリコンパイラで出力ファイルが生成されなかった可能性があります。出力ファイルが生成されなかった原因として、プリコンパイラで重大なエラーが発生したことが考えられます。
* CSQL-E-024: ファイル filename の I/O が検出されました
* CSQL-E-023: ファイルステータス 3 / 5
filename は、データベースプリコンパイラに生成された出力ファイル名です。
プリコンパイラが正常に実行され、COBSQL がエラー メッセージ「展開後のソースファイルのデータ不足」を報告する場合には、データベースプリコンパイラが生成したソースファイルと元のソースファイルとの間で、一部の行を対応付けできなかったことを示します。
このメッセージは、プログラムに SQL 文が含まれていない場合にも表示されます。一般的に、データベースプリコンパイラは、SQL 文が見つからないと出力ファイルの作成を中断するため、このメッセージが表示されます。
Oracle を使用する際に発生する問題をトラブルシューティングするときには、次の点に注意してください。
DBMS HOLD_CURSOR MAXOPENCURSORS MODE RELEASE_CURSOR
アプリケーションは通常、1 つの SQL 文で 1 行のデータを取り込みますが、配列を使用すれば複数行の取り込みが可能になります。Oracle のプリコンパイラには、配列による複数行の取り込み例を示すサンプルプログラム (通常は、sample3.pco) が付属しています。配列の詳細は、『ORACLE プリコンパイラガイド Pro*Cobol サプリメント』マニュアルを参照してください。
Pro*Cobol が生成する全情報を取り込むには、xref=yes 指令を使用します。この指令を Pro*Cobol 構成ファイル $ORACLE_HOME¥PROxx¥pcbcfg.cfg に追加できます。 詳細は、次のとおりです。
xx | Pro*Cobol のバージョン (たとえば、Oracle 8.0 の場合は PRO80) |
$ORACLE_HOME | マシン上の Oracle インストール時のルートディレクトリ |
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 が設定されている場合 (デフォルト) は、COMP、BINARY、または COMP-4 のすべてのデータ項目が COMP-5 に変換されます。
宣言節への項目の変換を制限するには、次のどちらかを設定します。
これらのデータ項目は、COMP-3 データ項目と同じ方法で扱われます。
この形式は、以前は Oracle の DISPLAY データ型としてサポートされていました。
Pro*COBOL 8.x 以降では、次に示す Micro Focus COBOL の言語の拡張機能、データ定義および節見出しが拒否されます。
この問題を解決するためには、これらの項目を、Pro*COBOL によって開かれないコピーブックに配置する必要があります。ただし、Pro*COBOL の起動前にコピーブックを展開する CP を使用している場合には、動作しません。CP を呼び出してコピーブックを展開する htmlpp を使用する場合に、問題が発生する可能性があります。そのため、COBSQL の前に htmlpp を起動する必要があります。
たとえば、次のコンパイル行は動作します。
COBOL -k PROG P(HTMLPP) PREPROCESS(cobsql) CSQLT=ORACLE8
一方、次の行は動作しません。
COBOL -k PROG PREPROCESS(cobsql) CSQLT=ORACLE8 P(HTMLPP)
生成された .cbl ファイルに変数を追加するために、Pro*COBOL の作業場所節に変数を 1 つ以上定義する必要があります。
Sybase を使用する前に、次のようにシステムを変更する必要があります。
Sybase を使用する際に発生する問題をトラブルシューティングするときには、次の点に注意してください。
クライアントのオペレーティング システムがデフォルト設定で構成されていて、Sybase で各ロケール サポートエラーが報告される場合は、LANG 環境変数を使用して、locales.dat ファイルの設定を上書きしてください。
たとえば、Windows NT クライアントで問題が発生し、locales.dat ファイルで次のような Windows NT の設定が行われている場合の例を説明します。
[NT] locale = default, us_english, iso_1 locale = enu, us_english, iso_1 locale = fra, french, iso_1 locale = deu, german, iso_1
この場合に、英語用に LANG を設定するには、次のようにします。
LANG=enu
SYB-severity-number-text
パラメーターの内容は、次のとおりです。
SYB | 変更された Sybase エラー メッセージであることを COBSQL に示す文字列。 |
severity | エラーの重大度を示します。Sybase メッセージには、一般的エラーや致命的エラーではなく、警告のみのエラーもあります。 |
number | Sybase エラーに割り当てられる 4 桁の一意のエラー番号。 |
text | Sybase のエラー メッセージ。 |
たとえば、esql.loc ファイルの一般的なエントリは、次のようになります。
9 = M_PRECLINE, "警告 %1 行目のクエリの確認中に誤りを検出しました。"
これは、次のように変更されます。
9 = M_PRECLINE, "SYB-警告-2009-%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)