COBSQL

ここでは、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) に記述することもできます。

注:

  • cobol.dir の各行には 1 つ以上のコンパイラ指令を指定できます。
  • cobol.dir ファイルの各コンパイラ指令は 1 つの行に記述します。1 つの指令を複数行に分けて記述しないでください。
  • cobol.dir ファイルで P(cobsql) または PREPROCESS(cobsql) が検出されると、コンパイラは ENDP に達するまで、その行の残りをプリプロセッサに渡します。
  • PREPROCESS 指令と、それ以降の ENDP までの全オプションは単一のコンパイラ指令として処理されます。そのため、PREPROCESS 指令とすべてのオプションは、cobol.dir ファイルの単一行に記述する必要があります。

また、COBSQL 指令とプリコンパイラ指令を cobsql.dir ファイルに記述することもできます。このファイルは、現在のディレクトリまたは、COBDIR 環境変数で指定されたディレクトリに格納する必要があります。COBSQL は、現在のディレクトリか、または、$COBDIR で指定されたディレクトリで cobsql.dir ファイルを検索します。cobsql.dir ファイルが見つかった時点で、検索は終了します。cobsql.dir ファイルが現在のディレクトリに存在する場合には、COBDIR 環境変数で指定されたディレクトリは検索されません。

注:

  • cobsql.dir の各行には 1 つ以上の COBSQL 指令を指定できます。
  • cobsql.dir ファイルは COBOL コンパイラでは処理されないため、COBOL コンパイラ指令は指定しないでください。
  • cobsql.dir では、各 COBSQL 指令は 1 つの行に記述します。1 つの指令を複数行に分けて記述しないでください。
  • cobsql.dir ファイルで END-C、END、または END-COBSQL が検出されると、その行の残りをデータベースプリコンパイラに渡します。
  • データベースプリコンパイラに渡すオプションは、すべて cobsql.dir の単一行に記述してください。

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 指令

COBSQL 指令を次に示します。

COBSQLTYPE

使用するプリプロセッサを指定します。

構文:
COBSQLTYPE={ORACLE | ORACLE8 | SYBASE | INFORMIX-NEW}
プロパティ:
同義語: CSQLT
CSTART

COBSQL が実行時にデータベースサポートモジュールをロードします。

構文:
[NO]CSTART
プロパティ:
デフォルト: NOCSTART
同義語: CST
コメント:

この指令は、UNIX では使用できません。

CSTOP

COBSQL が、アプリケーションが異常終了したときにロールバックを実行できる実行停止モジュールをロードします。

構文:
[NO]CSTOP 
プロパティ:
デフォルト: NOCSTOP
同義語: CSP
コメント:

この指令は、UNIX では使用できません。

DEBUGFILE

デバッグファイル (.deb) を作成します。

構文:
[NO]DEBUGFILE 
プロパティ:
デフォルト: NODEBUGFILE
同義語: DEB
DISPLAY

プリコンパイラの統計を表示します。この指令は、最初に COBSQL が正しくスタンドアローンのプリプロセッサを呼び出しているかを確認するときにのみ使用します。

構文:
[NO]DISPLAY 
プロパティ:
デフォルト: NODISPLAY
同義語: DIS
END-COBSQL

COBSQL 指令の末尾を示します。残りの指令は、プリコンパイラに渡されます。

構文:
END-COBSQL
END-C
END
プロパティ:
デフォルト: 指定できません。
同義語: END-C, END
KEEPCBL

プリコンパイルされたソースファイル (.cbl) を保存します。

構文:
KEEPCBL
MAKESYN

すべての COMP ホスト変数を COMP-5 ホスト変数に変換します。MAKESYN と NOMAKESYN のどちらも設定されていない場合は (デフォルト)、COMP または COMP-4 として定義されている (ホスト変数のみではなく) すべての変数が COMP-5 に変換されます。

構文:
[NO]MAKESYN
プロパティ:
デフォルト: NOMAKESYN
SQLDEBUG

COBSQL のデバッグに使用するファイルを数多く作成します。これらのファイルには、プリコンパイラからの出力ファイル (通常は拡張子 .cbl)、プリコンパイラが作成するリストファイル (通常は拡張子 .lis)、そして 拡張子 .sdb をもつ COBSQL デバッグファイルがあります。さらに KEEPCBL と TRACE をオンにします。

構文:
SQLDEBUG
プロパティ:
デフォルト: 指定できません。
同義語: SQLDEBUG
TRACE

構文:
[NO]TRACE
プロパティ:
デフォルト: NOTRACE
同義語: トレースファイル (.trc) を作成します。
VERBOSE

プログラムの処理中にすべてのプリコンパイラメッセージを表示し、ステータスを更新します。この指令は、最初に COBSQL が正しくスタンドアローンのプリプロセッサを呼び出しているかを確認するときのみに使用します。

構文:
VERBOSE
プロパティ:
デフォルト: 指定できません。

COBOL 指令

コンパイラが COBSQL に渡す COBOL 指令を次に示します。

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

COBSQL アプリケーションのビルド方法

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 をリンクする必要があります。

CP プリプロセッサを使用したコピーファイルの展開

コピーファイルを操作するために 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.coboraca.cob、および sqlda.cob のすべてに COMP データ項目が格納されています。sqlca5.coboraca5.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 を使用しない場合は行数が不正となり、エラーが表示されないか、または、正しくない行に表示されます。

各国語サポート (NLS)

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;

トラブルシューティング

問題発生時には、次の各項目をチェックしてください。

ここまでの対処をしても問題が発生する場合は、サポート窓口にお問い合わせください。 サポート窓口で、問題の原因を突き止められるように、次の作業を行ってください。

一般的な問題点

上記の各項目を確認しても原因を特定できない場合には、さらに次の項目を確認してください。

Oracle を使用する際の考察事項

Oracle を使用する際に発生する問題をトラブルシューティングするときには、次の点に注意してください。

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 以降を使用します。

移行と開発

Pro*COBOL 1.x から 8.x 以降にプログラムを移行する場合は、次の点に注意してください。

Oracle 8 および Micro Focus COBOL

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 を使用する際に発生する問題をトラブルシューティングするときには、次の点に注意してください。

Informix を使用する際の考察事項