COBOL アプリケーションの SQL アクセス
 
このページをシェアする                  
COBOL アプリケーションの SQL アクセス
COBOL アプリケーションの SQL アクセスの提供
この付録では、以下の項目について説明します。
COBOL の Zen サポートの概要
コンポーネント
SQL アクセスの使用
サンプル XML ファイルの実行例
COBOL の Zen サポートの概要
Zen リレーショナル エンジンには、COBOL の OCCURS 句、部分的 REDEFINES、および可変レコード レイアウトのサポートが含まれています。
部分的 REDEFINES 句は、レコード内のデータの一部(たとえば、01 レベル内の 05 レベルなど)を識別します。可変レコード レイアウトもまた REDEFINES と呼ばれます。これは、レコード全体を再定義するものだからです。用語の混乱を避けるため、このトピックでは部分的 REDEFINES および可変レコード レイアウトと呼びます。
SQL アクセスを利用するために COBOL アプリケーションを変更する必要はありません。
アプリケーションでのデータの処理を Zen リレーショナル エンジンに示すことによって、SQL アクセスは有効になります。開発者の言葉で言えば、リレーショナル エンジンにメタデータを定義します。
このトピックは、OCCURS、部分的 REDEFINES、または可変レコード レイアウトを含んでいる COBOL アプリケーションにのみ適用されることに注意してください。
制限
現在、COBOL アプリケーションに SQL アクセスを提供する場合には以下の制限が適用されます。
OCCURS の中で OCCURS をネストすることはできません。
部分的 REDEFINES の中で OCCURS をネストすることはできません。
部分的 REDEFINES の中で部分的 REDEFINES をネストすることはできません。
OCCURS の中で部分的 REDEFINES をネストすることはできません。
OCCURS に定義できるのは 1 インデックスのみです。OCCURS の中で、項目に追加インデックスを定義することはできません。
サポートされるデータ型は、MicroKernel エンジンおよびリレーショナル エンジンに定義されているデータ型のみです。データ型は、トランザクショナル データ型のみを使って、XML 制御ファイルに記述されます。XML 制御ファイルの解説については、表 179cobolschemaexec.xsd を参照してください。データ型の説明については、Zen で使用できるデータ型を参照してください。
SQL ステートメント
次の表は、OCCURS、部分的 REDEFINES、または可変レコード レイアウトに基づいて作成されたデータ テーブルでの SQL ステートメントの使用を示します。
表 178 COBOL データ構造での SQL ステートメントの使用
ステートメント
OCCURS、部分的 REDEFINES での使用
可変レコード レイアウトでの使用
注記
ALTER TABLE
No
No
 
CREATE INDEX
No
No
 
CREATE INDEX IN DICTIONARY
No
Yes
 
CREATE TRIGGER
No
No
 
DELETE
No
Yes
 
DROP TABLE
Yes
Yes
DROP TABLE ステートメントは、システム テーブルからすべてのエントリを削除します。データ ファイル自体は削除も変更もされません。また、メイン テーブルを削除する場合、従属テーブルが検出されると、それらをすべて削除するよう通知するメッセージが表示されます。従属テーブルはメイン テーブルに依存するものであり、これはインデックスを含んでいる OCCURS や部分的 REDEFINES などの条件によって生じます。従属テーブルを削除すれば、メイン テーブルの削除が可能になります。
INSERT INTO
No
No
 
UPDATE
Yes
Yes
UPDATE ステートメントで、テーブル フィルターが定義されている列は更新できません。テーブル フィルターとは、テーブルに関連付けられている論理式のことです。テーブル フィルターは XML ファイル内のメタデータの一部として定義されます。
本ドキュメントに列挙されているその他すべての SQL ステートメント
Yes
Yes
Zen の SQL 文法を参照してください。
コンポーネント
Zen は、COBOL アプリケーションの SQL アクセスを提供するために以下のコンポーネントをインストールします。
表 179 COBOL アプリケーションの SQL アクセスを提供するためにインストールされるコンポーネント
コンポーネント
用途
場所1
w3cobolschemaexec100.dll
Schema Executor が使用するルーチンの 32 ビット ライブラリ
Windows サーバー:file_path\Zen\bin\
w64cobolschemaexec.dll
Schema Executor が使用するルーチンの 64 ビット ライブラリ
Windows サーバー:file_path\Zen\bin\
Linux:
libpsqlcobolschemaexec100.so
macOS:
libpsqlcobolschemaexec100.dylib
Schema Executor が使用するルーチンの 32 ビットおよび 64 ビット ライブラリ
Linux サーバー:/usr/local/actianzen/lib
cobolschemexecmsgrb.dll
ルーチンの 32 ビット ライブラリで使用されるメッセージ リソース バンドル
Windows サーバー:file_path\Zen\bin\
w64cobolschemaexecmsgrb.dll
ルーチンの 64 ビット ライブラリで使用されるメッセージ リソース バンドル
Windows サーバー:file_path\Zen\bin\
Linux:
libpsqlcobolschemaexecmsgrb.so
macOS:
libpsqlcobolschemaexecmsgrb.dylib
ルーチンの 32 ビットおよび 64 ビット ライブラリで使用されるメッセージ リソース バンドル
Linux サーバー:/usr/local/actianzen/lib
cobolschemaexec.xsd
XML ファイルを処理する際に Schema Executor が使用する制御ファイル(ドキュメント型定義)
Windows サーバー:
file_path\Zen\schemas
Linux または macOS サーバー:
/user/local/actianzen/schemas/
cobolschemaexec.log
XML ファイルを処理する際に Schema Executor が生成したメッセージを記録するデフォルトのログ ファイル
Windows サーバー:
file_path\Zen\logs
Linux または macOS サーバー:
/usr/local/actianzen/logs/
cobolschemaexec.exe
ISAM データを正規化された SQL テーブルと解釈するために、リレーショナル エンジンが使用するシステム テーブルを作成するユーティリティ
Schema Executor とも呼ばれます。
file_path\Zen\bin\
cobolschemaexec
ISAM データを正規化された SQL テーブルと解釈するために、リレーショナル エンジンが使用するシステム テーブルを作成するユーティリティ
Schema Executor とも呼ばれます。
Linux または macOS インストール:
/usr/local/actianzen/bin/
SampleMainTable.xml
シンプルなテーブルのデータを定義する、サンプルの XML テンプレート
サンプル XML ファイルの実行例も参照してください。
Windows サーバーおよびクライアント:
file_path\Zen\samples\cobolschemaexec
Linux または macOS インストール:
/usr/local/actianzen/samples/cobolschemaexec
SampleMainWithOccurs.xml
OCCURS 構造を含んでいるデータの定義に使用する、サンプルの XML テンプレート
サンプル XML ファイルの実行例も参照してください。
Windows サーバーおよびクライアント:
file_path\Zen\samples\cobolschemaexec
Linux または macOS インストール:
/usr/local/actianzen/samples/cobolschemaexec
SampleMainWithRedefines.xml
REDEFINES 構造を含んでいるデータの定義に使用する、サンプルの XML テンプレート
サンプル XML ファイルの実行例も参照してください。
Windows サーバーおよびクライアント:
file_path\Zen\samples\cobolschemaexec
Linux または macOS インストール:
/usr/local/actianzen/samples/cobolschemaexec
SampleVariantRecord.xml
可変レコード レイアウトを含んでいるデータの定義に使用する、サンプルの XML テンプレート
サンプル XML ファイルの実行例も参照してください。
Windows サーバーおよびクライアント:
file_path\Zen\samples\cobolschemaexec
Linux または macOS インストール:
/usr/local/actianzen/samples/cobolschemaexec
Windows クライアントおよび Linux クライアントでは、ログ ファイルはオプションです。Schema Executor を起動するときに指定できます。
Schema Executor コマンドの形式を参照してください。
パスが指定されていない場合は、現在のディレクトリと同じです。そうでない場合は、ユーザー指定のパスによって決まります。
1 Zen ファイルのデフォルトの保存場所については、『Getting Started with Zen』のファイルはどこにインストールされますか?を参照してください。
SQL アクセスの使用
SQL アクセスを利用するには次の作業を行います。
1 適切な XML テンプレートを手で編集して、データ レイアウトを記述します。
2 XML テンプレートで指定したデータ ファイルをデータベース フォルダーにコピーします。
3 ユーティリティを実行して、リレーショナル エンジンが使用するシステム テーブルを作成します(XML を使って、正規化されたデータを作成します)。
4 COBOL アプリケーションの開発者である場合は、任意で、Schema Executor によって作成された新しいシステム テーブルを配布します。
手順 1:サンプル XML テンプレートの変更
Zen にはサンプルの XML テンプレートが含まれており、これを利用すると、COBOL アプリケーションで必要とされるとおりにデータのレイアウトを定義できます。表 179 を参照してください。開発者の言葉で言えば、XML ファイルにメタデータを記述します。
XML テンプレートを変更するには
1 テキスト エディターで XML テンプレートを開きます。
2 ファイルに記述されているコメントに従って XML を変更します。
3 選択したパスとファイル名で、変更したテンプレートを保存します。
手順 2:XML テンプレートで指定したデータ ファイルのコピー
Schema Executor を起動する前に、XML ファイルで指定したデータ ファイルをデータベースのデータ ファイルの場所へコピーします。データベースは、テーブルを追加する必要のあるデータベースです。
たとえば、XML で mytable.mkd と指定したテーブルをデータベース test に追加するとします。このとき、データベースのデータ ファイルは c:\data\test にあるとします。Schema Executor を起動する前に、データ ファイル mytable.mkd を c:\data\test へコピーします。
手順 3:Schema Executor ユーティリティの実行
Zen には Schema Executor というコマンド ライン ユーティリティが付属しています。このユーティリティは SchemaExec とも言います。
Schema Executor は以下の操作を実行します。
手で編集された XML ファイルを解析する
リレーショナル エンジンがデータを正規化された SQL テーブルと解釈するために使用する、既存のシステム テーブルを配置する(Zen で作成されるデータベースには、SQL アクセスのサポートに必要なシステム テーブルがすべて含まれています)
Zen の現在のバージョンより前のバージョンで作成されたデータベースに対してこのユーティリティを実行している場合は、追加のシステム テーブルを作成して配置する
Schema Executor で XML ファイルを処理するには
サンプル XML ファイルの実行例も参照してください。
1 オペレーティング システムでコマンド プロンプトにアクセスします。
2 コマンド ラインで Schema Executor を実行します(この実行可能プログラムがデフォルトでインストールされる場所は、表 179 を参照してください)。
必須オプションの XMLfilename および databasename と、必要な任意のオプションを指定します。Schema Executor コマンドの形式を参照してください。
XML コンテンツの処理中にエラーが発生した場合は、Schema Executor ログ ファイルに報告されているエラーを検討します。ログ メッセージを参照してください。処理でエラーが発生しなくなるまで、繰り返し XML を修正してユーティリティを実行します。
Schema Executor コマンドの形式
cobolschemaexec XMLfilename databasename [-s servername] [-u login_id] [-p password] [-i svr_loginid] [-c svr_password] [-l log_file] [ -h | -? ]
 
表 180 Schema Executor ユーティリティのオプション
オプション
説明
XMLfilename
データのレイアウトを定義する XML スキーマのファイル名。必須オプションです。手順 1:サンプル XML テンプレートの変更を参照してください。
databasename
アプリケーションがアクセスする Zen データベースの名前。必須オプションです。指定したデータベースが存在しない場合は、ユーティリティからパスとファイル名の入力を求められます。
-s servername
Zen データベース エンジンが実行されているサーバーの名前、または IP アドレス。データベース エンジンと同じマシン上で SchemaExec を実行している場合は、名前として "localhost" を使用できます。servername が指定されていない場合は、ローカル マシンがサーバーであると見なします。
-u login_id
セキュリティで保護されたデータベースへのアクセスに必要なユーザー名。Zen セキュリティ モデルの解説については、『Advanced Operations Guide』の Zen セキュリティを参照してください。
-p password
セキュリティで保護されたデータベースへのアクセスに必要なパスワード。Zen セキュリティ モデルの解説については、『Advanced Operations Guide』の Zen セキュリティを参照してください。
-i svr_loginid
リモート マシンのオペレーティング システムへのアクセスに必要なログイン名。SchemaExec がリモート サーバー上にある XML ファイルを処理している場合には、このオプションは必須です。
-c svr_password
リモート マシンのオペレーティング システムへのアクセスに必要なパスワード。SchemaExec がリモート サーバー上にある XML ファイルを処理している場合には、このオプションは必須です。
-l log_file
XML ファイルの処理中に生成されるメッセージの記録に使用するログ ファイル。
Zen データベース エンジンが実行されているマシンで SchemaExec を実行する場合は、自動的にデフォルト ログが作成されます。-l log_file オプションを使用する必要はありません。デフォルト ログの名前は cobolschemaexec.log です。
クライアント マシン(Zen データベース エンジンが実行されていないマシン)で SchemaExec を実行する場合は、クライアント マシン用のログ ファイルを指定できます。
ログ メッセージを参照してください。
-h または -?
コマンドの使い方を表示します。その他すべてのオプションは無視されます。
メモ:必須オプションの XMLfilenamedatabasename は位置決めされており、この順序で指定する必要があります。
使い方の例
次の例は、Schema Executor の使い方を示しています。
Zen ファイルのデフォルトの保存場所については、『Getting Started with Zen』のファイルはどこにインストールされますか?を参照してください。
データベースが既に存在する場合(サーバーはローカル ホストで動作している):
cobolschemaexec file_path\Zen\samples\cobolschemaexec\test.xml demodata\
データベースが存在しない場合(サーバーはローカル ホストで動作している):
cobolschemaexec file_path\Zen\samples\cobolschemaexec\test.xml mytest
ユーティリティは次のようなプロンプトを表示します。
CB103 : mytest に接続できません
データベースを作成しますか(y/n)?
y を押すと、ユーティリティはデータベース パスを入力するプロンプトを表示します。
データベース パスを入力してください。
既存のパスを入力します。そうしないと、エラーが返されます。必ず、XML ファイルで使用されているデータベース ファイル(たとえば .MKD ファイル)がそのパスで使用可能であるようにしてください。
データベースがリモート サーバーに存在する場合:
cobolschemaexec file_path\Zen\samples\cobolschemaexec\test.xml demodata -s TestMachine -i testuser -c testuser
この例では、管理者権限を持つユーザー testuser(パスワード "testuser")がリモート マシン(TestMachine)に存在し、XML ファイルで使用されるデータベース ファイルは、リモート マシン上のデータベースのデータ ファイル ディレクトリにあるものとします。
データベースがリモート サーバーに存在しない場合:
cobolschemaexec file_path\Zen\samples\cobolschemaexec\test.xml mytest -s RemoteMachine -i testuser -c testuser
この例では、ユーザー testuser(パスワード "testuser")はリモート マシン(TestMachine)に存在し、管理者権限を持っているものとします。
ユーティリティは次のようなプロンプトを表示します。
CB103 : mytest に接続できません
データベースを作成しますか(y/n)?
y を押すと、ユーティリティはデータベース パスを入力するプロンプトを表示します。
データベース パスを入力してください。
既存のパスを入力します。そうしないと、エラーが返されます。必ず、XML ファイルで使用されているデータベース ファイル(たとえば .MKD ファイル)がそのパスで使用可能であるようにしてください。
Schema Executor による新規データベースの作成
ユーティリティ オプション databasename に存在しないデータベースを指定すると、Schema Executor は新しいデータベースを作成するかどうかを尋ねます。"yes" と答えると、新しいデータベースの場所を入力するプロンプトが表示されます。Schema Executor がデータベースを作成する場所(パスとフォルダー名)は既存でなければなりません。
また、Schema Executor は、デフォルト フォルダーに databasename のデータ ファイルがあることを期待するので注意してください。データ ファイルが見つからない場合は、その旨が通知されます。データ ファイルを自分でデフォルト フォルダーへコピーしてから、Schema Executor を再実行して XML を処理します。
ログ メッセージ
このセクションは、Schema Executor による XML ファイルの処理後、ログ ファイルに記載されている可能性のあるコードの一覧を示します。
成功を表すコードは、「CB100:Schemaexec は正常に完了しました」です。
次の表は、エラー コードの一覧を示します。
表 181 CobolSchemaExec ログ ファイルに記載される可能性のあるエラー コード
エラー コード
説明
CB001
不明なエラーです
CB002
プロパティ名属性がありません
CB003
MAINTABLE および VARIANTRECORDTABLES はサポートされていません
CB004
指定された Occurs テーブル名が不正です
CB005
指定された Occurs Count が不正です
CB006
指定された Occurs マッピング インデックスは親テーブルのインデックスではありません
CB007
TableName - TableName が重複しています
CB008
FieldName - FieldName が重複しています
CB009
IndexName - IndexName が重複しています
CB010
テーブル名パラメーターが指定されていません
CB012
Identifier - 不正な文字が含まれています
CB013
オフセットは負でない整数でなければなりません
CB014
識別子の長さは 20 文字を超えてはいけません
CB016
精度はゼロより大きくなければなりません
CB017
指定された精度が不正です - FieldName
CB018
小数位を精度よりも大きくすることはできません - FieldName
CB019
ログ ファイルと XML ファイルは別にしなければなりません
CB022
TableFilter - テーブル フィルターは 255 文字を超えてはいけません
CB023
FieldName は TableName のフィールドではありません
CB024
TableFilter は、すべての REDEFINES テーブルに対して、または NONE に対して定義する必要があります
CB025
親要素が正しくありません
CB028
識別子名 identifiername は英文字で始まっている必要があります
CB029
識別子名 identifiername にキーワードは使用できません
CB050
DataFile - DatabasePath に存在しません
CB051
OCCURS/REDEFINES の長さは負でない整数でなければなりません
CB052
Btrievefilename の長さが 64 文字を超えてはいけません
CB057
親テーブルにインデックスが指定されていません - ParentTableName
CB099
パーサー エラー
CB100
Schemaexec は正常に完了しました
CB101
コマンド ライン引数 argument の値が不正です
CB102
Login を指定しないで、Password の値を指定することはできません
CB103
DatabaseName に接続できません
CB105
ディレクトリ パス Databasepath にデータベース DatabaseName を作成できませんでした
CB106
指定された DSN を作成できませんでした
CB108
データベース databasename を閉じられませんでした
CB109
XML ファイルからデータを読み取れませんでした
CB110
データベースを削除できませんでした
手順 4:システム テーブルの配布(任意)
COBOL アプリケーションの開発者である場合は、作成したアプリケーションと共にすべてのシステム アプリケーションを配布するようにしてください。配布自体に違いはありませんが、追加するシステム テーブルが生じる可能性があるので、ここで述べています。たとえば、Zen の現在のバージョンより前のバージョンで作成されたデータベースに対して Schema Executor を実行した場合は、追加のシステム テーブルが作成され配置されます。その結果、配布するシステム テーブル(DDF ファイル)がいくつか追加されることになります。
サンプル XML ファイルの実行例
サンプル XML ファイルおよびデータ ファイルは、file_path\Zen\samples\cobolschemaexec フォルダー内に提供されています。Zen ファイルのデフォルトの保存場所については、『Getting Started with Zen』のファイルはどこにインストールされますか?を参照してください。
Schema Executor を使って XML ファイル SampleMainTable.xml を実行するには、次の手順に従います。
1 接続するデータベースのデータ ファイル フォルダーに maintbl.mkd をコピーします。
たとえば、test という名前のデータベースがあり、データ ファイルの場所は c:\data\test であるとします。c:\data\test へ maintbl.mkd をコピーします。
2 Zen\bin\ ディレクトリでコマンド プロンプトを開きます。
3 DOS プロンプトで次のコマンドを実行します。
cobolschemaexec file_path\Zen\samples\cobolschemaexec\samplemaintable.xml test
4 Schema Executor の実行が成功したら、(XML ファイルに指定されている)テーブル maintbl が test データベースに作成されます。
5 これで、ZenCC を使ってテーブル maintbl で SQL 操作を実行できます。
補注
このセクションでは、SELECT ステートメントおよびテーブル フィルターに関する注意事項を提供します。
SELECT ステートメント
OCCURS テーブルで SELECT クエリを実行すると、次の内容が返されます。
OCCURS テーブルの列
マッピング インデックスを構成するメイン テーブルの列
OCCURS 句の出現回数を示す OCCURS カウンター
たとえば、次のサンプル XML ファイルについて Schema Executor を実行した結果作成されるテーブルに対し、SELECT * FROM FIELD というクエリを実行するとします。
file_path\Zen\samples\cobolschemaexec\ SampleMainWithOccurs.xml
ユーティリティは、列 Id、OccursCounter、Field_1、Field_2、および Field_3 を返します。
REDEFINES テーブルで SELECT を実行すると、親テーブルの列と REDEFINES テーブルの列がすべて返されます。
たとえば、次のサンプル XML ファイルについて Schema Executor を実行した結果作成されるテーブルに対し、SELECT * FROM Redefined_group というクエリを実行するとします。
file_path\Zen\samples\ cobolschemaexec\SampleMainWithRedefines.xml
ユーティリティは、列 Id、Account_Num、Category、Redef_Struct_Num(親テーブルのすべての列)、および Redefined_field_1(REDEFINES テーブルの列)を返します。
テーブル フィルター
テーブル フィルターとは、特定のテーブルのフィルター条件のことです。サンプル XML ファイルでは TABLEFILTER として参照されます。
TABLEFILTER の式は、左右両方のオペランドが列名であってもかまいません。たとえば、Cust_Num = My_Cust_Num とした場合、Cust_Num と My_Cust_Num はどちらも列名です。
オペランドと演算子の間にスペースを入れてください。
TABLEFILTER の式で定数を使用する場合は、値を一重引用符で囲んで指定する必要があります。
例: Cust_Num = '100' (Cust_Num は列名です)
XML ファイルで TABLEFILTER を指定する場合は、次の XML エンティティを使用します。
XML エンティティ
使用目的
<
より小さい(<)
&gt;
より大きい(>)
&amp;
アンパサンド(&)(AND)
&quot;
二重引用符(")
&apos;
一重引用符(')
有効な TABLEFILTER の使用例
Cust_Num = '100' (Cust_Num = 100 と同等)
 
Cust_Num &lt; '100' (Cust_Num < 100 と同等)
 
Cust_Num &gt; '100' (Cust_Num > 100 と同等)
 
Cust_Num &lt;&gt; '100' (Cust_Num <> 100 と同等)
 
'a' = Category | Account_Num &lt;= 'a123' ('a'=category OR account_num <= 'a123' と同等)
 
'a' = Category &amp; Account_Num = 'a123' ('a' = category AND account_num = 'a123' と同等)
 
Cust_Num = My_cust_Num (両オペランドが列名)