MERGE ステートメントは、1 つまたは複数のキーに基づいて、 2 つ以上の同じシーケンスで並べられたファイル (すなわち、 同じ 1 組の昇順 / 降順キーに従ってすでにソートされているファイル) を結合して、 出力プロシージャーまたは出力ファイルで、マージしたシーケンスでレコードを使用できるようにします。
MERGE ステートメントは、宣言セクション以外ならば、手続き部のどこにでも置くことができます。
MERGE ステートメントは、THREAD コンパイラー・オプションを指定してコンパイルされたプログラムではサポートされません。
フォーマット >>-MERGE--ファイル名-1------------------------------------------> .-------------------------------------------------. | .------------. | V V | | >----+----+--+-ASCENDING--+--+-----+----データ名-1--+-+----------> '-ON-' '-DESCENDING-' '-KEY-' >--+-------------------------------------------+--USING---------> '-+-----------+--SEQUENCE--+----+--英字名-1--' '-COLLATING-' '-IS-' .--------------. V | >--ファイル名-2------ファイル名-3-+-------------------------------> >--+-OUTPUT PROCEDURE--+----+----プロシージャー名-1--+---------------------------------+-+->< | '-IS-' '-+-THROUGH-+--プロシージャー名-2-' | | '-THRU----' | | .--------------. | | V | | '-GIVING-----ファイル名-4-+--------------------------------------------------------'
MERGE ステートメントの中で同じファイル名を繰り返すことはできません。
MERGE ステートメントの中で対になるどのファイル名も、同じ SAME AREA 節、 SAME SORT AREA 節、 または SAME SORT-MERGE AREA 節の中で指定することはできません。 同じ SAME RECORD AREA 節内では、MERGE ステートメントに任意のファイル名を指定できます。
MERGE ステートメントが実行されると、ファイル名-2、ファイル名-3 などに含まれているすべてのレコードがマージ・プログラムに受け取られ、 その後指定されたキー (複数のキーも可) に従ってマージされます。
この句は、指定されたマージ・キーに基づいて、 レコードを昇順または降順 (どちらになるかは指定された句次第) で処理することを指定します。
次の規則が適用されます。
MERGE ステートメントがこれらの条件を満たしていると、 実行環境に世紀ウィンドウ表示をサポートするソート製品が組み込まれている場合には、SORT 2000 年機能を利用してマージ操作が行われます。
年末尾型日付フィールドは MERGE ステートメントの KEY として指定することが可能で、 それに対応する機能として、ソート製品の世紀ウィンドウ表示機能を利用できます。
ウィンドウ表示日付フィールドを KEY データ項目として使用する方法については、「Enterprise COBOL プログラミング・ガイド」を参照してください。
マージ処理の方向は、次に示すように ASCENDING または DESCENDING のどちらのキーワードを指定するかによって異なります。
KEY データ項目が USAGE NATIONAL で記述されている場合、KEY 値のシーケンスは国別文字の 2 進値に基づきます。
COLLATING SEQUENCE 句が指定されていない場合は、 比較条件のオペランド比較規則に従ってキーが比較されます。 詳細については、一般比較条件を参照してください。
COLLATING SEQUENCE 句が指定されている場合は、英字、英数字、英数字編集、外部浮動小数点、および数字編集カテゴリーの キー・データ項目に対して、指定された照合シーケンスが使用されます。 それ以外のキー・データ項目については、比較条件のオペランド比較規則に従って比較が行われます。
この句によって、このマージ処理で KEY データ項目に対して行われる英数字比較で 使用する照合シーケンスを指定します。
COLLATING SEQUENCE 句は、英字または英数字以外のキーには影響を与えません。
COLLATING SEQUENCE 句を省略した場合は、 OBJECT-COMPUTER 段落の PROGRAM COLLATING SEQUENCE 節 (指定されている場合) で使用したい照合シーケンスを識別します。MERGE ステートメントの COLLATING SEQUENCE 句および OBJECT-COMPUTER 段落の PROGRAM COLLATING SEQUENCE 節を両方とも省略した場合には、EBCDIC 照合シーケンスが使用されます。
MERGE 操作では、ファイル名-2、ファイル名-3、 ... (入力ファイル) にあるすべてのレコードはファイル名-1 に転送されます。MERGE ステートメントの実行時に、これらのファイルがオープンされていてはなりません。 入力ファイルは自動的にオープンされ、読み取られ、クローズされます。これらのファイルの入力操作に DECLARATIVE プロシージャーが指定されていると、エラーが起きた場合には宣言はエラーとなります。
入力ファイルはいずれも、順次アクセス・モードまたは動的アクセス・モードを指定し、 データ部の中の FD 項目に記述されていなければなりません。
ファイル名-1 が可変長レコードを含んでいる場合は、入力ファイル (ファイル名-2、ファイル名-3、...) に入っているレコードのサイズは、ファイル名-1 に記述されている最小レコード以上または最大レコード以下でなくてはなりません。ファイル名-1 が固定長レコードを含んでいる場合は、入力ファイルに入っているレコードのサイズは、ファイル名-1 で記述されている最大レコード以下である必要があります。詳細については、「Enterprise COBOL プログラミング・ガイド」を参照してください。
GIVING 句が指定されたとき、ファイル名-1 にあるマージされたレコードはすべて、 自動的に出力ファイル (ファイル名-4, ...) に転送されます。
出力ファイルはいずれも、順次アクセス・モードまたは動的アクセス・モードを指定し、 データ部の中の FD 項目に記述されていなければなりません。
出力ファイル (ファイル名-4、...) に可変長レコードが入っている場合、 ファイル名-1 に入っているレコードのサイズは、その出力ファイルに記述されている最小レコード以上または最大レコード以下でなくてはなりません。出力ファイルが固定長レコードを含んでいる場合は、ファイル名-1 に入っているレコードのサイズは、出力ファイルで記述されている最大レコードより大きくすることはできません。詳細については、「Enterprise COBOL プログラミング・ガイド」を参照してください。
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を参照してください。