MERGE ステートメントは、1 つまたは複数のキーに基づいて、 2 つ以上の同じシーケンスで並べられたファイル (すなわち、 同じ 1 組の昇順 / 降順キーに従ってすでにソートされているファイル) を結合して、 出力プロシージャーまたは出力ファイルで、マージしたシーケンスでレコードを使用できるようにします。
MERGE ステートメントは、宣言セクション以外ならば、手続き部のどこにでも置くことができます。
MERGE ステートメントの中で同じファイル名を繰り返すことはできません。
MERGE ステートメントの中で対になるどのファイル名も、同じ SAME AREA 文節、 SAME SORT AREA 文節、または SAME SORT-MERGE AREA 文節の中で指定することはできません。 同じ SAME RECORD AREA 文節内では、MERGE ステートメントに任意のファイル名を指定できます。
MERGE ステートメントが実行されると、ファイル名-2、ファイル名-3 などに含まれているすべてのレコードがマージ・プログラムに受け取られ、その後指定されたキー (複数のキーも可) に従ってマージされます。
この句は、指定されたマージ・キーに基づいて、 レコードを昇順または降順 (どちらになるかは指定された句次第) で処理することを指定します。
次の規則が適用されます。
マージ処理の方向は、次に示すように ASCENDING または DESCENDING のどちらのキーワードを指定するかによって異なります。
KEY データ項目が英字、英数字、英数字編集、数字編集の場合、キー値のシーケンスは使用される照合シーケンスに依存します (後出の COLLATING SEQUENCE 句を参照)。
KEY データ項目が使用法 NATIONAL を指定して記述されている場合、KEY 値のシーケンスは国別文字の 2 進値に基づきます。
KEY が使用法 DISPLAY を持つ外部浮動小数点項目の場合、キーは英数字カテゴリーとして扱われます。レコードがマージされるシーケンスは、使用される照合シーケンスに依存します。
KEY が使用法 NATIONAL を持つ外部浮動小数点項目の場合、キーは国別カテゴリーとして扱われます。
KEY が内部浮動小数点項目の場合、キー値のシーケンスは数値順となります。
COLLATING SEQUENCE 句が指定されていない場合は、 比較条件のオペランド比較規則に従ってキーが比較されます。詳細については、一般比較条件を参照してください。
COLLATING SEQUENCE 句が指定されている場合は、英字、英数字、英数字編集、外部浮動小数点、および数字編集カテゴリーの キー・データ項目に対して、指定された照合シーケンスが使用されます。それ以外のキー・データ項目については、比較条件のオペランド比較規則に従って比較が行われます。
この句によって、このマージ処理で KEY データ項目に対して行われる英数字比較で使用する照合シーケンスを指定します。
COLLATING SEQUENCE 句は、英字または英数字以外のキーには影響を与えません。
COLLATING SEQUENCE 句は、単一バイトの ASCII コード・ページが有効である場合にのみ有効です。
COLLATING SEQUENCE 句を省略した場合は、 OBJECT-COMPUTER 段落の PROGRAM COLLATING SEQUENCE 文節 (指定されている場合) で使用したい照合シーケンスを識別します。MERGE ステートメントの COLLATING SEQUENCE 句および OBJECT-COMPUTER 段落の PROGRAM COLLATING SEQUENCE 文節を両方とも省略した場合、COLLSEQ コンパイラー・オプションで指定する照合シーケンスが使用されます。COLLSEQ(EBCDIC) を指定した場合、EBCDIC 照合シーケンスが使用されます。COLLSEQ(LOCALE) を指定した場合、ロケールで指定された照合シーケンスが使用されます。ロケールの詳細については、付録G. ロケールの考慮事項を参照してください。
MERGE 操作では、ファイル名-2、ファイル名-3、 ... (入力ファイル) にあるすべてのレコードはファイル名-1 に転送されます。MERGE ステートメントの実行時に、これらのファイルがオープンされていてはなりません。 入力ファイルは自動的にオープンされ、読み取られ、クローズされます。これらのファイルの入力操作に DECLARATIVE プロシージャーが指定されていると、エラーが起きた場合には宣言はエラーとなります。
入力ファイルはいずれも、順次アクセス・モードまたは動的アクセス・モードを指定し、 データ部の中の FD 項目に記述されていなければなりません。
ファイル名-1 が可変長レコードを含んでいる場合は、入力ファイル (ファイル名-2、ファイル名-3、...) に入っているレコードのサイズは、ファイル名-1 に記述されている最小レコード以上または最大レコード以下でなくてはなりません。ファイル名-1 が固定長レコードを含んでいる場合は、入力ファイルに入っているレコードのサイズは、ファイル名-1 で記述されている最大レコード以下である必要があります。詳細については、「COBOL for Windows プログラミング・ガイド」を参照してください。
GIVING 句が指定されたとき、ファイル名-1 にあるマージされたレコードはすべて、 自動的に出力ファイル (ファイル名-4...) に転送されます。
出力ファイルはいずれも、順次アクセス・モードまたは動的アクセス・モードを指定し、 データ部の中の FD 項目に記述されていなければなりません。
出力ファイル (ファイル名-4、...) に可変長レコードが入っている場合、 ファイル名-1 に入っているレコードのサイズは、その出力ファイルに記述されている最小レコード以上または最大レコード以下でなくてはなりません。出力ファイルが固定長レコードを含んでいる場合は、ファイル名-1 に入っているレコードのサイズは、出力ファイルで記述されている最大レコードより大きくすることはできません。詳細については、「COBOL for Windows プログラミング・ガイド」を参照してください。
MERGE ステートメントの実行時に、出力ファイル (ファイル名-4、...) がオープンされてはなりません。出力ファイルは自動的にオープンされ、読み取られ、クローズされます。これらのファイルの出力操作に DECLARATIVE プロシージャーが指定されていると、エラーが起きた場合には宣言はエラーとなります。
この句は、マージ処理から得られた出力レコードを選択または変更するプロシージャーの名前を指定します。
OUTPUT PROCEDURE は、ファイル名-1 によって参照されたファイルから RETURN ステートメントによって 1 個ずつ使用可能にされるレコードをマージ順に選択、修正、またはコピーするときに必要になるプロシージャーで構成することができます。この範囲には、出力プロシージャーの範囲内で CALL、EXIT、GO TO、PERFORM、および XML PARSE ステートメントによって制御が移動して実行されるすべてのステートメントが含まれます。また、この範囲には、出力プロシージャーの範囲内のステートメントが実行されると実行される宣言型プロシージャーの中のすべてのステートメントも含まれます。出力プロシージャーの範囲内では、MERGE、 RELEASE、または SORT のステートメントを実行させることはできません。
出力プロシージャーが指定されていると、ファイル名-1 によって参照されたファイルが MERGE ステートメントによって順序付けされてから、制御はこの出力プロシージャーに渡されます。コンパイラーは、出力プロシージャーの最後のステートメントの終わりに、戻りメカニズムを挿入します。制御がこの出力プロシージャーの中の最後のステートメントに移ると、 この戻りメカニズムによってマージ処理が終了し、 ついで制御を MERGE ステートメントの後ろにある実行可能ステートメントに渡します。出力プロシージャーに入る前に、マージ・プロシージャーは要求されたとき、次のレコードをマージされた順に選択できる段階になっています。出力プロシージャーの中の RETURN ステートメントは、次のレコードを要求することになります。
OUTPUT PROCEDURE 句は、基本的な PERFORM ステートメントと似ています。例えば、OUTPUT PROCEDURE 句の中でプロシージャー名を指定すると、そのプロシージャーは、 それが PERFORM ステートメントで指定された場合と同様にして、マージ操作時に実行されます。 PERFORM ステートメントによる場合と同様に、プロシージャーの実行は、 最後のステートメントがその実行を終えると終了します。 OUTPUT PROCEDURE 句の最後のステートメントは、EXIT ステートメントにすることができます (EXIT ステートメントを参照)。
ソート制御ファイルを使用して制御ステートメントを指定する場合は、 ソート制御ファイルの中に指定されている値がその他の SORT 特殊レジスターにある値に優先します。
詳細については、SORT-CONTROLを参照してください。
固定セグメントで MERGE ステートメントがコード化された場合、この MERGE ステートメントが参照するすべての出力プロシージャーは完全に固定セグメントの範囲内にあるか、プロシージャー全体が単一の独立セグメントに含まれている必要があります。
独立セグメントで MERGE ステートメントがコード化された場合、この MERGE ステートメントが参照するすべての出力プロシージャーは完全に固定セグメントの範囲内にあるか、プロシージャー全体が MERGE ステートメントと同じ独立セグメントに含まれている必要があります。