COBOL2002 ユーザーズガイド
6.9.5 HiRDBによる索引編成ファイル固有の機能と相違点
HiRDBによる索引編成ファイルのトランザクションは,最初のOPEN文でファイルをオープンしたときに開始され,すべてのファイルが閉じられたときに暗黙的にCOMMIT文を実行し,終了します。なお,COMMIT文およびROLLBACK文を明示的には実行できません。COMMIT文およびROLLBACK文を明示的に実行した場合,実行時エラーが表示され,処理は中断されます。
HiRDBによる索引編成ファイルでは,実行時環境変数CBL_RDBCOMMITを指定することで,HiRDBが持つトランザクション管理機能を制御できます。
(a) 環境変数CBL_RDBCOMMIT
COMMIT文およびROLLBACK文で,RDBアクセスのトランザクションを管理する場合,環境変数CBL_RDBCOMMITにMANUAL,AUTO,YESのどれかを指定します。環境変数CBL_RDBCOMMITの指定方法を次に示します。
- 形式
CBL_RDBCOMMIT={MANUAL|AUTO|YES}
- MANUALを指定した場合
- 明示的にCOMMIT文およびROLLBACK文を実行できます。
- AUTOまたはYESを指定した場合
- 明示的にCLOSE文を実行した場合,および未クローズのファイルがクローズされた場合に,暗黙的にCOMMIT文が実行されます。
- また,明示的にCOMMIT文およびROLLBACK文を実行できます。
- それ以外の値を指定した場合,または環境変数CBL_RDBCOMMITを指定しなかった場合
- 明示的にCOMMIT文およびROLLBACK文を実行できません。
(b) トランザクションの範囲
環境変数CBL_RDBCOMMITの値とトランザクションの範囲の関係を次に示します。なお,COMMIT文,ROLLBACK文の取り扱いの詳細については,「6.9.6 プログラムのコンパイルと実行」を参照してください。
図6-4 環境変数CBL_RDBCOMMITの値とトランザクションの範囲
- 注※
- HiRDBのトランザクション管理機能によって,HiRDBにアクセスを実行中プロセスが異常終了したことを検出してROLLBACKが発生します。
(2) ISAMによる索引編成ファイルとの相違
HiRDBによる索引編成ファイルとISAMによる索引編成ファイルとの相違点について説明します。
レコードの検索基準の相違を,次に示します。
表6-8 索引編成ファイルでのレコードの検索基準の相違
レコードキーの項目 |
キー判定属性 |
ISAMの場合 |
RDBの場合 |
固定長集団項目 |
文字 |
文字 |
外部10進項目 |
文字 |
文字 |
内部10進項目 |
文字 |
数値 |
外部浮動小数点数字項目 |
文字 |
文字 |
数字編集項目 |
文字 |
文字 |
英字項目 |
文字 |
文字 |
日本語項目 |
文字 |
文字 |
2進項目(2バイト) |
2バイト固定小数点 |
2バイト固定小数点 |
2進項目(4バイト) |
4バイト固定小数点 |
4バイト固定小数点 |
内部浮動小数点数字項目(4バイト) |
単精度浮動小数点 |
単精度浮動小数点 |
内部浮動小数点数字項目(8バイト) |
倍精度浮動小数点 |
倍精度浮動小数点 |
HiRDBによる索引編成ファイルでは,ISAMによる索引編成ファイルと入出力状態に返される値が異なる場合があります。詳細は,「付録G 入出力状態の値」を参照してください。
(c) 機能の相違点
- スキーマ定義と一致したレコード記述でのアクセスが前提のため,ファイル記述項に記述できるレコード記述項は一つだけです。
- スキーマ定義に可変長(行長が可変長)がないため,レコード記述から計算した長さを最大長とする固定長で入出力されます。このため,次のような制限があります。
- ファイル記述項のDEPENDING ON データ名指定のRECORD句は,データ名の内容に関係なく,常にレコード記述から計算した長さで入出力されます。
- レコード記述中にDEPENDING ON指定のOCCURS句は,記述できません。
- HiRDBによる索引編成ファイルでは,DATA FORMAT句を指定しても覚え書きとなります。
- 環境変数CBLD_ファイル名のISAMDL/NOISAMDLオプションは常にISAMDLとして扱われます。また,環境変数CBLISAMDLの値は,常にYESとして扱われます。このため,OPEN文の出力モードでファイルを開いた場合,ファイルは更新されないで新規作成となり,すべてのデータが削除されます。
ただし,OPEN文の出力モード,または拡張モードで開いたときに,ファイル実体(表)がない場合は,ファイル実体が作成されません。
なお,出力モードでファイルを開く場合,すでにファイル内にあるレコードを高速で削除する機能があります。詳細は,「(5) その他の拡張機能」の「(a) 出力ファイルの高速オープン機能」を参照してください。
- 排他制御はRDBのスキーマ定義に従うため,COBOLのファイル共用は利用できません。また,RDBシステムへのアクセスに用いる,内部的に入出力文から変換されたSQL文には,排他オプションが付けられません。このため,排他モードは,内部的に発行するSQL文および実行環境によってRDBシステムの規定に従います。
ただし,HiRDBによる索引編成ファイルでは,固有のファイル共用を使用できます。詳細は,「(4) HiRDBによる索引編成ファイル固有のファイル共用」を参照してください。
- HiRDBによる索引編成ファイルを使用するプログラムと,SQLを使用するプログラムを,同じ実行環境中に混在できません。
- HiRDBによる索引編成ファイルを使用するプログラムは,OpenTP1環境下で使用できません。
- トランザクション管理機能を使用しないで複数のファイルを同時に開いた場合,すべてのファイルを閉じるまでファイルに対しての追加・変更は反映されません。このため,追加書きしたレコードは,すべてのファイルを閉じるまで入力できません。
- 複数の表を結合するビュー表に対して行の追加,更新,および削除はできません。
- データ型が文字型(CHAR,VARCHAR,NCHAR,NVARCHAR,MCHAR,MVARCHAR)の列に対応させたデータ項目に,LOW-VALUEを使用できます。
- レコードキーのデータが重複している場合,START文やREAD文で重複したレコードキー値に位置づけた状態でREAD文を実行すると,そのあとに読み込まれるレコードの順序が不定となります。
- START文で次の指定を用いて位置づけた場合,そのあとに実行されるREAD文は,常にキーの降順呼び出しとなります。
- LESS THAN
- LESS THAN OR EQUAL TO
- NOT GREATER THAN
- <
- =<
- NOT >
- LAST指定
- レコードキーに指定した内部10進項目の照合順序は,文字属性の照合順序ではなく,数値の照合順序となります。
- レコード中に次のデータが含まれる場合,入出力結果は保証しません。
- レコード長が短い場合,または長い場合
- 読み込むレコード中にナル値が含まれる場合
- 書き出すレコード中に次のデータが含まれる場合
a.データ項目の文字列長,またはデータ長の値が1より小さい
b.DATEデータ型の列に対応させたデータ項目の値がLOW-VALUEである。
c.内部10進項目で定義したデータ項目の値が0で,かつ符号ビットが0である。
レコード中に保証されないデータが含まれるかどうかをチェックする機能があります。詳細は,「(5) その他の拡張機能」の「(b) データチェック機能」を参照してください。
- データ型がBLOBの列に対応するレコードの項目は,キーにできません。
- READ文,WRITE文,およびREWRITE文で重複キーを検知する場合,次の点に注意してください。
- HiRDBによる索引編成ファイルの入出力では,ALTERNATE RECORD KEY句のDUPLICATES指定は覚え書きとなります。そのため,重複キーを検知するには,インデクス定義時のCREATE INDEXでUNIQUEを指定する必要があります。
CREATE INDEXの詳細は,「HiRDBのSQLリファレンスマニュアル」を参照してください。
- 重複キーを検知するとき,インデクス定義でのUNIQUE指定の有無によって,入出力状態値が次のように異なります。
手続き文 |
HiRDBによる索引編成ファイルの場合 |
ISAMによる索引編成ファイルの場合 |
インデクス定義あり |
インデクス
定義なし |
DUPLICATES
指定あり |
DUPLICATES
指定なし |
UNIQUE指定あり |
UNIQUE指定なし |
READ文 |
00 |
00 |
00 |
02 |
00 |
REWRITE文 |
22 |
00 |
00 |
02 |
22 |
WRITE文 |
22 |
00 |
00 |
02 |
22 |
- 合成キーを使用するときは,CREATE INDEXで並べる列の順序と,合成キーに指定する項目の順序が一致している必要があります。順序が一致していないと,動作は保証しません。
(d) 物理的制限事項の相違点
HiRDBによる索引編成ファイルの制限値を,次に示します。
- キーに関する制限値
- 主レコードキーの最大長:255バイト
- 副レコードキーの最大長:255バイト
- 副レコードキーの最大定義個数:98個
- 合成キーを構成する最大項目数:8個
- 合成キーを構成する項目の合計最大長:255バイト
- 同一実行環境中でRDBアクセスする索引編成ファイルの数
- 同一実行環境中でRDBアクセスする索引編成ファイルの数は,最大63個です。
- また,HiRDBのシステム定義のpd_max_access_tables(同時に使用する表の数)に,使用するファイル数以上の値を指定しておく必要があります。
- レコード長
- 定義できるレコード長は,65,535バイト以内です。
- ただし,CREATE TABLE定義にFIXの指定がある場合は,CREATE TABLE定義の<FIX指定のある表>の列の長さの合計式に従います。CREATE TABLE定義の詳細は,「HiRDBのSQLリファレンスマニュアル」のCREATE TABLE定義の説明を参照してください。
- 作成できる列の数
- HiRDBの一つの表に作成できる列の数は,最大4,000です。
(3) HiRDBサーバの設定での注意事項
HiRDBシステムでは,HiRDBによる索引編成ファイルを使用するクライアントからの要求に対する応答を返してから,次にクライアントから要求があるまでのHiRDBシステムの最大待ち時間を,環境変数PDSWAITTIMEに秒単位で指定できます。
次に,環境変数PDSWAITTIMEを設定する場合の注意事項を示します。
- 環境変数PDSWAITTIMEに指定した時間での監視は,トランザクション開始から終了までの間,行われます。トランザクションについては,「(1) トランザクション管理機能」を参照してください。
- 実行中のHiRDBシステムでは,指定した時間内にクライアントから次の要求が来ない場合,COBOLプログラムに異常が発生したものとみなし,トランザクションをロールバックします。
- 環境変数PDSWAITTIMEに0を指定した場合,HiRDBシステムは,クライアント(COBOLプログラム)からの応答があるまで待ち続けます。
- ブロック転送機能を使用する場合,HiRDBシステムからブロック転送されてきたレコードがなくなるまで,クライアント(COBOLプログラム)内で入力処理が行われます。このため,入力処理が終了するまで,クライアントからHiRDBシステムに要求しません。したがって,ブロック転送機能を使用する場合,環境変数PDSWAITTIMEにはブロック転送文の入力処理時間を含めた値を設定してください。
環境変数PDSWAITTIMEの詳細は,「HiRDBのUAP開発ガイドマニュアル」を参照してください。
(b) 環境変数PDDDLDEAPRPEXEの設定時の注意事項
COBOLプログラム実行中に,環境変数PDDDLDEAPRPEXEを設定した環境で定義系トランザクションを実行しないでください。環境変数PDDDLDEAPRPEXEを設定した環境で定義系トランザクションを実行した場合,先行トランザクションの前処理が無効となるため,COBOLの管理情報との不整合が発生し,予期しない実行時エラーが発生するおそれがあります。
環境変数PDDDLDEAPRPEXEの詳細は,「HiRDBのUAP開発ガイドマニュアル」を参照してください。
(c) COBOLプログラムの異常終了時の対処
COBOLのプログラムが異常終了した場合,プロセスが待ち状態となります。待ち状態となったプロセスは,次の方法で終了させてください。
- 環境変数PDSWAITTIMEの設定によるトランザクションのロールバック
HiRDBサーバ側で,環境変数PDSWAITTIMEにサーバの最大待ち時間を設定しておき,トランザクションをロールバックさせる。
- PDCANCELコマンドによる強制終了
PDCANCELコマンドを入力してプロセスを強制終了させる。
PDCANCELコマンドの詳細については,「HiRDBのコマンドリファレンスマニュアル」を参照してください。
(4) HiRDBによる索引編成ファイル固有のファイル共用
HiRDBによる索引編成ファイルでは,ほかのファイル編成とは異なり,固有のファイル共用を使用できます。ここでは,HiRDBによる索引編成ファイル固有のファイル共用について説明します。
- 指定形式
CBLRDBILWAIT=YES
- 機能
- 環境変数CBLRDBILWAITにYESを指定すると,ファイルを入力モードで開いたとき,内部的に発行されるSELECT文に対して「WITHOUT LOCK WAIT」の排他オプションを付けられます。排他オプションの詳細については,「HiRDBのSQLリファレンスマニュアル」を参照してください。
(5) その他の拡張機能
HiRDBによる索引編成ファイルでは,次の拡張機能を使用できます。
(a) 出力ファイルの高速オープン機能
出力モードでファイルを開く場合,すでにファイル内にあるレコードを高速で削除したいときは,環境変数CBLD_ファイル名にRDBOPURGEを指定するか,または環境変数CBLRDBOPURGEにYESを指定してください。
- 指定形式(ファイル単位に指定する方法)
CBLD_ファイル名={ RDBOPURGE | NORDBOPURGE }
- 機能
- RDBOPURGEを指定した場合,実行単位中の任意のファイルに対してOUTPUTモードでファイルを開いたときに,すべてのデータを削除するために内部的に発行するSQL文をPURGE TABLEで行います。このとき,暗黙的にCOMMIT文を実行して現行のトランザクションを終了させるので,ほかのファイルをOPENしているときなどは注意してください。
- PURGE TABLEの詳細については,マニュアル「HiRDBのSQLリファレンスマニュアル」を参照してください。
- NORDBOPURGEを指定した場合,この機能は無効になります。
- 指定形式(実行単位中のすべてのファイルに指定する方法)
CBLRDBOPURGE=YES
- 機能
- CBLRDBOPURGE=YESを指定した場合,実行単位中のすべてのファイルに対してOUTPUTモードでファイルを開いたときに,すべてのデータを削除するために内部的に発行するSQL文をPURGE TABLEで行います。このとき,暗黙的にCOMMIT文を実行して現行のトランザクションを終了させるので,ほかのファイルをOPENしているときなどは注意してください。
- PURGE TABLEの詳細については,マニュアル「HiRDBのSQLリファレンスマニュアル」を参照してください。
- 環境変数CBLRDBOPURGEにYESの指定がないか,またはYES以外を指定した場合は,この機能は無効になります。
- 規則
- ファイル単位に指定する方法と実行単位中のすべてのファイルに指定する方法を併用した場合,ファイル単位に指定する方法が優先されます。次に指定の組み合わせによる動作を示します。
CBLRDBOPURGE |
CBLD_ファイル名 |
RDBOPURGE |
NORDBOPURGE |
指定なし |
YES |
○ |
× |
○ |
環境変数指定なし,またはYES以外 |
○ |
× |
× |
- (凡例)
- ○:出力ファイルの高速オープン機能は有効
- ×:出力ファイルの高速オープン機能は無効
(b) データチェック機能
入出力時,レコード中に保証されないデータが含まれているかどうかをチェックする場合は,環境変数CBLRDBDATAERRを指定します。
- 指定形式
CBLRDBDATAERR=YES
- 機能
- 環境変数CBLRDBDATAERRにYESを指定すると,レコード中に次のような保証されないデータが含まれていないかがチェックされ,含まれていた場合にはKCCC8353R-Sの入出力エラーが出力されます。
- (入出力が保証されないデータ)
- レコード長が短い場合,または長い場合
- 読み込むレコード中にナル値※が含まれる場合
- 書き出すレコード中に次のデータが含まれる場合
・データ項目の文字列長またはデータ長が1より小さい
・DATEデータ型の列に対応させたデータ項目の値がLOW-VALUEである
・内部10進データ項目で,値が0かつ符号ビットが0である
- 注※
- ナル値については,「HiRDBのSQLリファレンスマニュアル」を参照してください。
(c) 内部発行されるSQL文で行値構成子を使用する機能
HiRDBによる索引編成ファイルを使用した入出力で,実行時環境変数CBLRDBROWVALCONSTRUCTORが指定されているとき,COBOL2002が内部で発行するSQLのSELECT文で行値構成子を使用します。行値構成子を使用すると,次の条件すべてに該当する場合に,性能の向上が見込めます。
- 主レコードキー,または副レコードキーに合成キーが指定されていて,合成キーを構成する項目の個数が多い。
- 合成キーを構成する項目がHiRDBでインデクス定義されている。
- HiRDBのインデクス定義がメモリ上だけで処理されない(ディスクの実I/Oが発生する)。
- START文,NEXT指定のREAD文を繰り返す,またはKEY指定のREAD文を繰り返す。
この機能を使用するには,COBOLプログラム実行時にアクセスするHiRDBのバージョンが行値構成子をサポートしていることが前提です。サポートしていない場合は,動作は保証しません。
- 指定形式
CBLRDBROWVALCONSTRUCTOR=YES
- 機能
- 環境変数CBLRDBROWVALCONSTRUCTORにYESを指定すると,複数のキーを使用して入出力する場合,実行時ライブラリが内部で発行するSQLのSELECT文に行値構成子が使用されます。行値構成子が使用される条件を次に示します。
- 主レコードキーまたは副レコードキーに合成キーが指定されていて,合成キーを構成する項目の数が2個以上である。
- 1.のキーを指定したファイルに対して,次のどれかの文を実行した。
- START文。ただし,FIRST指定,LAST指定のSTART文は除く。
- KEY指定のREAD文。
- 乱アクセスまたは動的アクセスのREWRITE文,DELETE文で直前の入出力文がREAD文でない場合。
- 行値構成子を使用することで実行結果が変わることはありません。
- 環境変数CBLRDBROWVALCONSTRUCTORにYES以外を指定した場合は,この機能は有効になりません。その場合,内部で発行するSQL文に行値構成子は使用されません。
All Rights Reserved. Copyright (C) 2013, 2016, Hitachi, Ltd.
All Rights Reserved. Copyright (C) 2002, 2011, Microsoft Corporation.