COBOL アプリケーションの SQL アクセス
COBOL アプリケーションの SQL アクセスの提供
この付録では、以下の項目について説明します。
COBOL の PSQL サポートの概要
PSQL リレーショナル エンジンには、COBOL の OCCURS 句、部分的 REDEFINES、および可変レコード レイアウトのサポートが含まれています。
部分的 REDEFINES 句は、レコード内のデータの一部(たとえば、01 レベル内の 05 レベルなど)を識別します。可変レコード レイアウトもまた REDEFINES と呼ばれます。これは、レコード全体を再定義するものだからです。用語の混乱を避けるため、このトピックでは部分的 REDEFINES および可変レコード レイアウトと呼びます。
SQL アクセスを利用するために COBOL アプリケーションを変更する必要はありません。
アプリケーションでのデータの処理を PSQL リレーショナル エンジンに示すことによって、SQL アクセスは有効になります。開発者の言葉で言えば、リレーショナル エンジンにメタデータを定義します。
このトピックは、OCCURS、部分的 REDEFINES、または可変レコード レイアウトを含んでいる COBOL アプリケーションにのみ適用されることに注意してください。
制限
現在、COBOL アプリケーションに SQL アクセスを提供する場合には以下の制限が適用されます。
•OCCURS の中で OCCURS をネストすることはできません。
•部分的 REDEFINES の中で OCCURS をネストすることはできません。
•部分的 REDEFINES の中で部分的 REDEFINES をネストすることはできません。
•OCCURS の中で部分的 REDEFINES をネストすることはできません。
•OCCURS に定義できるのは 1 インデックスのみです。OCCURS の中で、項目に追加インデックスを定義することはできません。
•サポートされるデータ型は、MicroKernel エンジンおよびリレーショナル エンジンに定義されているデータ型のみです。データ型は、トランザクショナル データ型のみを使って、XML 制御ファイルに記述されます。XML 制御ファイルの解説については、表
181 の
cobolschemaexec.xsd を参照してください。データ型の説明については、
PSQL で使用できるデータ型を参照してください。
SQL ステートメント
次の表は、OCCURS、部分的 REDEFINES、または可変レコード レイアウトに基づいて作成されたデータ テーブルでの SQL ステートメントの使用を示します。
表 180 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 | |
コンポーネント
PSQL は、COBOL アプリケーションの SQL アクセスを提供するために以下のコンポーネントをインストールします。
表 181 COBOL アプリケーションの SQL アクセスを提供するためにインストールされるコンポーネント
コンポーネント | 用途 | 場所1 |
w3cobolschemaexec100.dll | Schema Executor が使用するルーチンの 32 ビット ライブラリ | Windows サーバー:<file_path>\PSQL\bin\ |
w64cobolschemaexec.dll | Schema Executor が使用するルーチンの 64 ビット ライブラリ | Windows サーバー:<file_path>\PSQL\bin\ |
Linux: libpsqlcobolschemaexec100.so OS X: libpsqlcobolschemaexec100.dylib | Schema Executor が使用するルーチンの 32 ビットおよび 64 ビット ライブラリ | Linux サーバー:/usr/local/psql/lib |
cobolschemexecmsgrb.dll | ルーチンの 32 ビット ライブラリで使用されるメッセージ リソース バンドル | Windows サーバー:<file_path>\PSQL\bin\ |
w64cobolschemaexecmsgrb.dll | ルーチンの 64 ビット ライブラリで使用されるメッセージ リソース バンドル | Windows サーバー:<file_path>\PSQL\bin\ |
Linux: libpsqlcobolschemaexecmsgrb.so OS X: libpsqlcobolschemaexecmsgrb.dylib | ルーチンの 32 ビットおよび 64 ビット ライブラリで使用されるメッセージ リソース バンドル | Linux サーバー:/usr/local/psql/lib |
cobolschemaexec.xsd | XML ファイルを処理する際に Schema Executor が使用する制御ファイル(ドキュメント型定義) | Windows サーバー: <file_path>\PSQL\schemas Linux または OS X サーバー: /user/local/psql/schemas/ |
cobolschemaexec.log | XML ファイルを処理する際に Schema Executor が生成したメッセージを記録するデフォルトのログ ファイル | Windows サーバー: <file_path>\PSQL\logs Linux または OS X サーバー: /usr/local/psql/logs/ |
cobolschemaexec.exe | ISAM データを正規化された SQL テーブルと解釈するために、リレーショナル エンジンが使用するシステム テーブルを作成するユーティリティ Schema Executor とも呼ばれます。 | <file_path>\PSQL\bin\ |
cobolschemaexec | ISAM データを正規化された SQL テーブルと解釈するために、リレーショナル エンジンが使用するシステム テーブルを作成するユーティリティ Schema Executor とも呼ばれます。 | Linux または OS X インストール: /usr/local/psql/bin/ |
SampleMainTable.xml | シンプルなテーブルのデータを定義する、サンプルの XML テンプレート | Windows サーバーおよびクライアント: <file_path>\PSQL\samples\cobolschemaexec Linux または OS X インストール: /usr/local/psql/samples/cobolschemaexec |
SampleMainWithOccurs.xml | OCCURS 構造を含んでいるデータの定義に使用する、サンプルの XML テンプレート | Windows サーバーおよびクライアント: <file_path>\PSQL\samples\cobolschemaexec Linux または OS X インストール: /usr/local/psql/samples/cobolschemaexec |
SampleMainWithRedefines.xml | REDEFINES 構造を含んでいるデータの定義に使用する、サンプルの XML テンプレート | Windows サーバーおよびクライアント: <file_path>\PSQL\samples\cobolschemaexec Linux または OS X インストール: /usr/local/psql/samples/cobolschemaexec |
SampleVariantRecord.xml | 可変レコード レイアウトを含んでいるデータの定義に使用する、サンプルの XML テンプレート | Windows サーバーおよびクライアント: <file_path>\PSQL\samples\cobolschemaexec Linux または OS X インストール: /usr/local/psql/samples/cobolschemaexec |
Windows クライアントおよび Linux クライアントでは、ログ ファイルはオプションです。Schema Executor を起動するときに指定できます。 | | パスが指定されていない場合は、現在のディレクトリと同じです。そうでない場合は、ユーザー指定のパスによって決まります。 |
1 PSQL ファイルのデフォルトの保存場所については、『 Getting Started with PSQL』の PSQL ファイルはどこにインストールされますか?を参照してください。 |
SQL アクセスの使用
SQL アクセスを利用するには次の作業を行います。
1 適切な XML テンプレートを手で編集して、データ レイアウトを記述します。
2 XML テンプレートで指定したデータ ファイルをデータベース フォルダーにコピーします。
3 ユーティリティを実行して、リレーショナル エンジンが使用するシステム テーブルを作成します(XML を使って、正規化されたデータを作成します)。
4 COBOL アプリケーションの開発者である場合は、任意で、Schema Executor によって作成された新しいシステム テーブルを配布します。
手順 1:サンプル XML テンプレートの変更
PSQL にはサンプルの XML テンプレートが含まれており、これを利用すると、COBOL アプリケーションで必要とされるとおりにデータのレイアウトを定義できます。表
181 を参照してください。開発者の言葉で言えば、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 ユーティリティの実行
PSQL には Schema Executor というコマンド ライン ユーティリティが付属しています。このユーティリティは SchemaExec とも言います。
Schema Executor は以下の操作を実行します。
•手で編集された XML ファイルを解析する
•リレーショナル エンジンがデータを正規化された SQL テーブルと解釈するために使用する、既存のシステム テーブルを配置する(PSQL で作成されるデータベースには、SQL アクセスのサポートに必要なシステム テーブルがすべて含まれています)
•PSQL の現在のバージョンより前のバージョンで作成されたデータベースに対してこのユーティリティを実行している場合は、追加のシステム テーブルを作成して配置する
►Schema Executor で XML ファイルを処理するには
1 オペレーティング システムでコマンド プロンプトにアクセスします。
2 コマンド ラインで Schema Executor を実行します(この実行可能プログラムがデフォルトでインストールされる場所は、表
181 を参照してください)。
必須オプションの 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 | -? ]
表 182 Schema Executor ユーティリティのオプション
オプション | 説明 |
XMLfilename | データのレイアウトを定義する XML スキーマのファイル名。必須オプションです。 手順 1:サンプル XML テンプレートの変更を参照してください。 |
databasename | アプリケーションがアクセスする PSQL データベースの名前。必須オプションです。指定したデータベースが存在しない場合は、ユーティリティからパスとファイル名の入力を求められます。 |
-s servername | PSQL データベース エンジンが実行されているサーバーの名前、または IP アドレス。データベース エンジンと同じマシン上で SchemaExec を実行している場合は、名前として "localhost" を使用できます。servername が指定されていない場合は、ローカル マシンがサーバーであると見なします。 |
-u login_id | セキュリティで保護されたデータベースへのアクセスに必要なユーザー名。PSQL セキュリティ モデルの解説については、『 Advanced Operations Guide』の PSQL セキュリティを参照してください。 |
-p password | セキュリティで保護されたデータベースへのアクセスに必要なパスワード。PSQL セキュリティ モデルの解説については、『 Advanced Operations Guide』の PSQL セキュリティを参照してください。 |
-i svr_loginid | リモート マシンのオペレーティング システムへのアクセスに必要なログイン名。SchemaExec がリモート サーバー上にある XML ファイルを処理している場合には、このオプションは必須です。 |
-c svr_password | リモート マシンのオペレーティング システムへのアクセスに必要なパスワード。SchemaExec がリモート サーバー上にある XML ファイルを処理している場合には、このオプションは必須です。 |
-l log_file | XML ファイルの処理中に生成されるメッセージの記録に使用するログ ファイル。 PSQL データベース エンジンが実行されているマシンで SchemaExec を実行する場合は、自動的にデフォルト ログが作成されます。-l log_file オプションを使用する必要はありません。デフォルト ログの名前は cobolschemaexec.log です。 クライアント マシン(PSQL データベース エンジンが実行されていないマシン)で SchemaExec を実行する場合は、クライアント マシン用のログ ファイルを指定できます。 |
-h または -? | コマンドの使い方を表示します。その他すべてのオプションは無視されます。 |
メモ: 必須オプションの XMLfilename と databasename は位置決めされており、この順序で指定する必要があります。
使い方の例
次の例は、Schema Executor の使い方を示しています。
PSQL ファイルのデフォルトの保存場所については、『
Getting Started with PSQL』の
PSQL ファイルはどこにインストールされますか?を参照してください。
•データベースが既に存在する場合(サーバーはローカル ホストで動作している):
cobolschemaexec <file_path>\PSQL\samples\cobolschemaexec\test.xml demodata\
•データベースが存在しない場合(サーバーはローカル ホストで動作している):
cobolschemaexec <file_path>\PSQL\samples\cobolschemaexec\test.xml mytest
ユーティリティは次のようなプロンプトを表示します。
CB103 : mytest に接続できません
データベースを作成しますか(y/n)?
"y" を押すと、ユーティリティはデータベース パスを入力するプロンプトを表示します。
データベース パスを入力してください。
既存のパスを入力します。そうしないと、エラーが返されます。必ず、XML ファイルで使用されているデータベース ファイル(たとえば .MKD ファイル)がそのパスで使用可能であるようにしてください。
•データベースがリモート サーバーに存在する場合:
cobolschemaexec <file_path>\PSQL\samples\cobolschemaexec\test.xml demodata -s TestMachine -i testuser -c testuser
この例では、管理者権限を持つユーザー "testuser"(パスワード "testuser")がリモート マシン(TestMachine)に存在し、XML ファイルで使用されるデータベース ファイルは、リモート マシン上のデータベースのデータ ファイル ディレクトリにあるものとします。
•データベースがリモート サーバーに存在しない場合:
cobolschemaexec <file_path>\PSQL\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 は正常に完了しました」です。
次の表は、エラー コードの一覧を示します。
表 183 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 アプリケーションの開発者である場合は、作成したアプリケーションと共にすべてのシステム アプリケーションを配布するようにしてください。配布自体に違いはありませんが、追加するシステム テーブルが生じる可能性があるので、ここで述べています。たとえば、PSQL の現在のバージョンより前のバージョンで作成されたデータベースに対して Schema Executor を実行した場合は、追加のシステム テーブルが作成され配置されます。その結果、配布するシステム テーブル(DDF ファイル)がいくつか追加されることになります。
サンプル XML ファイルの実行例
サンプル XML ファイルおよびデータ ファイルは、
<file_path>\PSQL
\samples
\cobolschemaexec フォルダー内に提供されています。PSQL ファイルのデフォルトの保存場所については、『
Getting Started with PSQL』の
PSQL ファイルはどこにインストールされますか?を参照してください。
Schema Executor を使って XML ファイル SampleMainTable.xml を実行するには、次の手順に従います。
1 接続するデータベースのデータ ファイル フォルダーに maintbl.mkd をコピーします。
たとえば、データベース "test" があり、データ ファイルの場所は c:\data\test であるとします。c:\data\test へ maintbl.mkd をコピーします。
2 PSQL\bin\ ディレクトリでコマンド プロンプトを開きます。
3 DOS プロンプトで次のコマンドを実行します。
cobolschemaexec <file_path>\PSQL\samples\cobolschemaexec\samplemaintable.xml test
4 Schema Executor の実行が成功したら、(XML ファイルに指定されている)テーブル maintbl が test データベースに作成されます。
5 これで、PCC を使ってテーブル maintbl で SQL 操作を実行できます。
補注
このセクションでは、SELECT ステートメントおよびテーブル フィルターに関する注意事項を提供します。
SELECT ステートメント
OCCURS テーブルで SELECT クエリを実行すると、次の内容が返されます。
•OCCURS テーブルの列
•マッピング インデックスを構成するメイン テーブルの列
•OCCURS 句の出現回数を示す OCCURS カウンター
たとえば、次のサンプル XML ファイルについて Schema Executor を実行した結果作成されるテーブルに対し、SELECT * FROM FIELD というクエリを実行するとします。
<file_path>\PSQL\samples\cobolschemaexec\SampleMainWithOccurs.xml
ユーティリティは、列 Id、OccursCounter、Field_1、Field_2、および Field_3 を返します。
REDEFINES テーブルで SELECT を実行すると、親テーブルの列と REDEFINES テーブルの列がすべて返されます。
たとえば、次のサンプル XML ファイルについて Schema Executor を実行した結果作成されるテーブルに対し、SELECT * FROM Redefined_group というクエリを実行するとします。
<file_path>\PSQL\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 エンティティ | 使用目的 |
< | より小さい(<) |
> | より大きい(>) |
& | アンパサンド(&)(AND) |
" | 二重引用符(") |
' | 一重引用符(') |
有効な TABLEFILTER の使用例
Cust_Num = '100' (Cust_Num = 100 と同等)
Cust_Num < '100' (Cust_Num < 100 と同等)
Cust_Num > '100' (Cust_Num > 100 と同等)
Cust_Num <> '100' (Cust_Num <> 100 と同等)
'a' = Category | Account_Num <= 'a123' ('a'=category OR account_num <= 'a123' と同等)
'a' = Category & Account_Num = 'a123' ('a' = category AND account_num = 'a123' と同等)
Cust_Num = My_cust_Num (両オペランドが列名)