MERGE(併合)文は、指定されたキーの組に従って同じようにそろえられているいくつかのファイルを、1つのファイルに併合する。そして、併合された順番に従って、出力手続きまたは出力ファイルへレコードを引き渡す。
一般書式
指令
フラグを提供し、予約語リストを変更するコンパイラ指令の他に、以下の指令が、この節で解説する構文または意味に影響を及ぼす場合がある。
CALLSORT"EXTSM" - USING句またはGIVING句で255個までのファイルの指定を可能にする。この指令がない場合は、指定できるファイル名は10個までに制限される。
構文規則
ファイル名-1は、データ部の整列併合ファイル記述項に記述しておく。
手続き名-1は、出力手続きの名前を表わす。
手続き名-1および手続き名-2は、節名とする.
この制約は解除されている。
ファイル名-1のファイルに含まれるレコードが可変長である場合、ファイル名-2およびファイル名-3のファイル中に含まれるレコードの大きさは、ファイル名-1のレコードの最小のもの以上かつ最大のもの以下にする。ファイル名-1のファイルに含まれるレコードが固定長である場合、ファイル名-2およびファイル名-3のファイル中に含まれるレコードの大きさは、ファイル名-1のレコードの最大のものを超えてはならない。
ファイル名-2、ファイル名-3、ファイル名-4は、データ部の中の整列併合ファイル記述項にではなく、ファイル記述項に記述しておく。
THRUとTHROUGHは同義語である。
データ名-1はキーのデータ名であり、下記の規則に従う。
キー データ名で示すデータ項目は、ファイル名-1のレコード中に記述しておく。
キー データ名は、修飾してもよい。
キー データ項目は、可変長であってはならない。
ファイル名-1に複数のレコード記述を含める場合、キー データ名で示すデータ項目は1つのレコード記述の中だけに指定する。1つのレコード記述の中でキー データ名に指定した文字位置が、そのファイルの他のすべてのレコードのキーとして扱われる。
キー データ名には、OCCURS句を含む記述項は記述できない。また、OCCURS句を含む記述項の下位に、キー データ名を属させてはならない。
キー データ項目は、浮動小数点項目であってもよい。
キー データ項目が外部浮動小数点数である場合、キーは英数字として扱われる。レコードが併合される順序は、使用する文字の照合順序に左右される。
キー データ項目が内部浮動小数点数である場合、キーの順序は数値順となる。
MERGE文には、複数ファイル リール中のファイル名を複数指定してはならない。
MERGE文の中でファイル名を繰り返し指定してはならない。
MERGE文は、手続き部の宣言部分以外のどこにでも置くことができる。
ファイル名-4が索引ファイルである場合、最初のデータ名-1にはASCENDINGを指定する。また、データ名-1がレコード上で占める文字位置は、そのファイルの主レコードキーと同じにする。
GIVING を指定し、その対象であるファイル名-4のファイルに含まれるレコードが可変長である場合、ファイル名-1のファイル中に含まれるレコードの大きさは、ファイル名-4のレコードの最小のもの以上かつ最大のもの以下にする。ファイル名-4のファイルに含まれるレコードが固定長である場合、ファイル名-1のファイル中に含まれるレコードの大きさは、ファイル名-4のレコードの最大のものを超えてはならない。
一般規則
MERGE文は、ファイル名-2およびファイル名-3のファイルに含まれるすべてのレコードを併合する。
ファイル名-1のファイルに含まれるレコードが固定長である場合、ファイル名-2またはファイル名-3のファイル中にファイル名-1の固定長レコードよりも短いものがあると、ファイル名-2またはファイル名-3のレコードがファイル名-1のファイルに引き渡されるときに、その後部に空白が埋められる。
語KEYの後ろに続くデータ名は、KEY指定での区切り方とは関係なく、強さの順に左から右に並べる。つまり、一番左のデータ名が最も強いキーであり、その右のデータ名が次に強いキーである、といった具合いである。
ASCENDING を指定した場合、比較の規則に従って、キー データ項目の内容の値の小さい方から大きい方へと、順に併合される。
DESCENDINGを指定した場合、比較の規則に従って、キー データ項目の内容の値の大きい方から小さい方へと、順に併合される。
比較の規則に従って、あるデータレコードのすべてのキー データ項目の内容が、他のいくつかのデータレコードの対応するキー データ項目と等しい場合、引き取りの順序は下記のようになる。
MERGE文に指定した入力ファイルの順。
1つの入力ファイル内にキー データ項目の値が等しいレコードが複数ある場合は、それらがすべて他の入力ファイルからよりも先に引き取られる。
文字のキー データ項目の比較に適用される文字の照合順序は、iMERGE文の実行開始時に、下記の優先順序で決定される。
最初は、指定してあれば、MERGE文中のCOLLATING SEQUENCEに指定した文字の照合順序。
次は、プログラム用に設定してある文字の照合順序。
ファイル名-2およびファイル名-3のファイル中のレコードが、MERGE文中に指定したASCENDING KEYまたはDESCENDING KEYの順に整列されていないと、併合処理の結果はどうなるかわからない。
ファイル名-2およびファイル名-3のファイル中のすべてのレコードが、ファイル名-1のファイルに引き渡される。MERGE文の実行開始時にファイル名-2およびファイル名-3のファイルが開かれていてはならない。MERGE文を実行すると、ファイル名-2およびファイル名-3の各ファイルに対して、下記の操作が行われる。
ファイルの処理が開始される。これはINPUT指定をしたOPEN文を、暗黙的に実行することである。出力手続きを指定すると、この開始処理は出力手続きに制御が移される前に行われる。
論理レコードが読み込まれて、併合操作に引き渡される。これはNEXTおよびAT ENDを指定したREAD文を、暗黙的に実行することである。
ファイル名-1のファイルのレコードが可変長であると、ファイル名-1のファイルに書き出されるレコードの大きさは、ファイル名-2またはファイル名-3から読み込んだときのレコードの大きさとなる。このことは、ファイル名-1のファイルの整列併合ファイル記述項に指定した、RECORD IS VARYING句またはOCCURS句のDEPENDING ON指定の対象となっているデータ項目の内容にかかわらず適用される。
相対ファイルに関しては、相対キー データ項目の内容がMERGE文の実行後にどうなっているかはわからない。
ファイルの処理が終了される。これは任意指定の何もないCLOSE文を暗黙的に実行することである。出力手続きを指定した場合は、その中の最後の文に制御が移されるまで、この終了処理は実行されない。
USE AFTER EXCEPTION/ERROR手続きを指定してあれば、この暗黙のCLOSE処理において、それも対象となる。
ファイル名-2またはファイル名-3のファイル記述項中に指定した、RECORD IS VARYING句のDEPENDING ON指定の対象となっているデータ項目の内容は、MERGE MERGE文の完了時点でどのようになっているかわからない。
出力手続きには、RETURN(引き取り)文を用いてファイル名-1のファイルから順に1件ずつ引き取った併合済みレコードを、選択したり変更したり複写したりする任意の必要な手続きを組み込むことができる。この出力手続きの範囲には、その中からCALL文、EXIT文、GO TO文、PERFORM文によって制御を移された結果実行される、すべての文が含まれる。また、この出力手続きの範囲内の文を実行した結果として実行される宣言手続き中のすべての文も、この出力手続きの範囲に含まれる。この出力手続きの範囲内で、MERGE文、RELEASE文、SORT文を起動するようなことがあってはならない。(COBOL言語の概念 の章の明示指定と暗黙指定 節を参照。)
出力手続きを指定すると、MERGE文の実行中にその手続きに制御が渡される。コンパイラは出力手続きの最後の文の末尾に復帰機構を組み込む。出力手続きの最後の文に制御が移されると、復帰機構によってMERGE文の処理が終了されて、MERGE文の後ろの次の実行可能文に制御が移される。出力手続きに制御が移される前に、併合処理は、要求されれば併合された次の順序のレコードを引き渡せる状態に達している。出力手続き中のRETURN文は、そのレコードを引き取るための要求である。
出力手続きの実行中に、ファイル名-2、ファイル名-3、ファイル名-4のファイルを操作したり、そのレコード領域にアクセスしたりする文を実行することはできない。
GIVINGを指定すると、暗黙の出力手続きによって、併合されたすべてのレコードはファイル名-4のファイルに書き出される。MERGE文の開始時点で、ファイル名-4のファイルが開かれていてはならない。MERGE文を実行すると、ファイル名-4の各ファイルに対して、下記の処理が行われる。
ファイルの処理が開始される。これはOUTPUT指定をしたOPEN文を、暗黙的に実行することである。
論理レコードが引き取られてファイルに書き出される。これは任意指定を何も含まないWRITE文を、暗黙的に実行することである。
ファイル名-4のファイルのレコードが可変長であると、ファイル名-4のファイルに書き出されるレコードの大きさは、ファイル名-1から読み込んだときのレコードの大きさとなる。このことは、ファイル名-4のファイルの整列併合ファイル記述項に指定した、RECORD IS VARYING句またはOCCURS句のDEPENDING ON指定の対象となっているデータ項目の内容にかかわらず適用される。
相対ファイルに関しては、相対キー データ項目の値は、最初のレコードが引き取られたときは"1" 、2番目のレコードが引き取られたときは"2" という具合いに設定される。MERGE文の実行が終了した後で、相対キー データ項目の内容がどうなっているかはわからない。
ファイルの処理が終了される。これは任意指定の何もないCLOSE文を、暗黙的に実行することである。
USE AFTER EXCEPTION/ERROR手続きを指定してあれば、上記の暗黙の処理において、それも対象となる。しかし、そのUSE手続きの中から、ファイル名-4のファイルを操作したりそのレコード領域をアクセスしたりするような文が実行されるようなことがあってはならない。外部的に定義されているファイルの境界を超えて最初にレコードが書き出されると、そのファイルに指定してあるUSE AFTER EXCEPTION/ERROR手続きが実行される。そのUSE手続きから制御が戻されたとき、またはそのようなUSE手続きが指定されていないときは、上記の11cと同様にファイルの処理が終了される。
ファイル名-1のファイル記述項中に指定した、RECORD IS VARYING句のDEPENDING ON指定の対象となっているデータ項目の内容は、GIVINGを指定したMERGE文が完了した時点でどのようになっているかはわからない。
Iファイル名-4のファイルに含まれるレコードが固定長である場合、ファイル名-1のファイル中にファイル名-4の固定長レコードよりも短いものがあると、ファイル名-4のファイルにレコードが引き渡されるときに、その後部に空白が埋められる。
言語リファレンス - 追加トピック の区分化区分化 の章に示すように、MERGE文を含むプログラムを区分化できる。ただし、下記の制限がある。
独立区分ではない区分中の節内にMERGE文が存在する場合、そのMERGE文から呼び出される出力手続きは、下記のどちらかの状態で組み込まれていなければならない。
非独立区分中に完全に含まれる。
単一の独立区分中に完全に含まれる。
独立区分中にMERGE文が存在する場合、そのMERGE文から呼び出される出力手続きは、下記のどちらかの状態で組み込まれていなければならない。
非独立区分中に完全に含まれる。
MERGE文と同じ独立区分中に完全に含まれる。
特殊レジスタのSORT-RETURNがMERGE文の原始要素 に対して用意されている。 この特殊レジスタには、併合処理が終わったときに0(正常終了)または16(不成功)が設定される。出力手続きの中でこの特殊レジスタに値16を設定して、途中で併合処理を終わらせることができる。この場合、併合処理は次のRETURN文のところで終了される。