SORT ステートメントは、1 つまたは複数のファイルからレコードを受け取り、 指定されたキー (複数も可能) に従ってそれらをソートし、出力プロシージャーを通して、 または出力ファイルの中で、それらのソート済みファイルを利用できるようにします。 MERGE ステートメントも参照してください。SORT ステートメントは、宣言部分の中を除き手続き部のどこにでも置くことができます。
SORT ステートメントの中にあるファイル名の対を、同じ SAME SORT AREA 文節または SAME SORT-MERGE AREA 文節の中で指定することはできません。GIVING 文節に関連したファイル名 (ファイル名-3 ...) は、SAME AREA 文節には指定できません。 ただし、それらを SAME RECORD AREA 文節に関連付けることは可能です。
この句は、指定されたソート・キーに基づいて、 レコードを昇順または降順 (どちらになるかは指定された句次第) で処理することを指定します。
ファイル名-3 索引付きファイルを参照している場合、データ名-1 の最初の指定は、ASCENDING 句に関連付けられている必要があります。そして、そのデータ名-1 によって参照されるデータ項目は、そのファイルの主レコード・キーに関連付けられたデータ項目として、このレコードの中で同じ文字位置を占める必要があります。
ソート処理の方向は、次に示すように ASCENDING または DESCENDING のどちらのキーワードを指定するかによって異なります。
DUPLICATES 句が指定され、あるレコードに関連するすべてのキー・エレメントの内容が、 1 つまたは複数の他のレコードの中の対応するキー・エレメントに一致している場合は、 これらのレコードは次のような順序で戻されます。
DUPLICATES 句が指定されていない場合には、これらのレコードの順序は未定義です。 DUPLICATES 句の使用方法については、「COBOL for Windows プログラミング・ガイド」の代替索引に関する説明を参照してください。
この句で指定する照合シーケンスは、このソート処理で KEY データ項目に対して行われる英数字比較で使用されます。
COLLATING SEQUENCE 句は、英字または英数字以外のキーには影響を与えません。
COLLATING SEQUENCE 句は、単一バイトの ASCII コード・ページが有効である場合にのみ有効です。
COLLATING SEQUENCE 句を省略した場合は、 OBJECT-COMPUTER 段落の PROGRAM COLLATING SEQUENCE 文節 (指定されている場合) で使用したい照合シーケンスを指定します。 COLLATING SEQUENCE 句および PROGRAM COLLATING SEQUENCE 文節を両方とも省略した場合、COLLSEQ コンパイラー・オプションで指定する照合シーケンスが使用されます。
USING 句が指定されている場合、ファイル名-2、... (つまり、入力ファイル) の中のすべてのレコードは自動的にファイル名-1 に移動されます。 SORT ステートメントの実行時に、これらのファイルがオープンしないでください。 コンパイラーが自動的にこれらのファイルをオープンし、読み込み、レコードを使用可能にし、そしてクローズします。EXCEPTION/ERROR プロシージャーがこれらのファイルに対して指定されていると、 コンパイラーはこれらのプロシージャーへの必要なリンケージを設定します。
すべての入力ファイルは、データ部の中の FD 項目に記述されている必要があります。
USING 句が指定されている場合、およびファイル名-1 が可変長レコードを含んでいる場合は、入力ファイル (ファイル名-2、...) に入っているレコードのサイズは、ファイル名-1 に記述されている最小レコード以上または最大レコード以下である必要があります。 ファイル名-1 が固定長レコードを含んでいる場合は、入力ファイルに入っているレコードのサイズは、ファイル名-1 で記述されている最大レコード以下である必要があります。詳細については、「COBOL for Windows プログラミング・ガイド」を参照してください。
この句によって、ソート処理を開始する前に、 入力レコードを選択したり修正したりするために使うプロシージャーの名前を指定します。
入力プロシージャーは、ファイル名-1 によって参照されるファイルに対する RELEASE ステートメントの実行によって 1 つずつ使用可能にされるレコードを選択、修正、またはコピーするために必要なプロシージャーで構成することができます。この範囲には、入力プロシージャーの範囲内の CALL、EXIT、GO TO、PERFORM、および XML PARSE の各ステートメントの実行による制御移動の結果として実行されるすべてのステートメントと、 入力プロシージャーの範囲にあるステートメント実行の結果として実行される宣言型プロシージャーの中のすべてのステートメントが含まれます。入力プロシージャーの範囲では、MERGE、RETURN、 または SORT のいずれのステートメントも実行させることはできません。
入力プロシージャーが指定されている場合、制御がその入力プロシージャーに渡されない限り、ファイル名-1 によって参照されたファイルを SORT ステートメントが順序付けすることはできません。コンパイラーは、入力プロシージャーの中の最後のステートメントの終わりに RETURN を挿入します。制御が入力プロシージャーの中の最後のステートメントに渡されると、ファイル名-1 によって参照されるファイルに対して以前に解放されていたレコードがソートされます。
GIVING 句が指定されたとき、ファイル名-1 にあるソートされたレコードはすべて、 自動的に出力ファイル (ファイル名-3...) に転送されます。
すべての出力ファイルは、データ部の中の FD 項目に記述されている必要があります。
出力ファイル (ファイル名-3、...) に可変長レコードが入っている場合、ファイル名-1 に入っているレコードのサイズは、その出力ファイルに記述されている最小レコード以上または最大レコード以下である必要があります。出力ファイルが固定長レコードを含んでいる場合は、ファイル名-1 に入っているレコードのサイズは、出力ファイルで記述されている最大レコードより大きくすることはできません。詳細については、「COBOL for Windows プログラミング・ガイド」を参照してください。
SORT ステートメントの実行時に、出力ファイル (ファイル名-3、...) がオープンされないようにします。各出力ファイルに対して、SORT ステートメントが実行されると、 次のことが行われます。
相対ファイルの場合、戻された最初のレコードの相対キー・データ項目には値 '1' が含まれます。戻された 2 番目のレコードでは、値 '2' が含まれるというようになります。 SORT ステートメントの実行が終わると、相対キー・データ項目は、 ファイルに最後に戻されたレコードを示しています。
これらの暗黙の関数は、関連付けられている USE AFTER EXCEPTION/ERROR プロシージャーを実行するように実行されます。ただし、このような USE プロシージャーの実行によって、ファイル名-3 が参照するファイルを操作するステートメント、または関連付けられているレコード域にアクセスする操作を行うステートメントが実行されないように注意してください。 ファイルの外部定義境界を超えて書き込む最初の試みが行われると、 そのファイルに USE AFTER STANDARD EXCEPTION/ERROR プロシージャーが指定されていれば、 それが実行されます。制御がその USE プロシージャーから戻されるか、 またはこのような USE プロシージャーが指定されていなければ、 ファイルの処理は終了します。
この句によって、ソート処理から出力レコードを選択したり修正したりするために使うプロシージャーの名前を指定します。
出力プロシージャーは、ファイル名-1 によって参照されるファイルから RETURN ステートメントの実行によってソート順序に基づいて 1 つずつ使用可能に されるレコードを選択、修正、またはコピーするために必要なプロシージャーで構成することができます。この範囲には、出力プロシージャーの範囲内で CALL、EXIT、GO TO、PERFORM、および XML PARSE ステートメントによって制御が移動して実行されるすべてのステートメントが含まれます。また、この範囲には、出力プロシージャーの範囲内のステートメントが実行されると実行される宣言型プロシージャーの中のすべてのステートメントも含まれます。出力プロシージャーの範囲内では、MERGE、 RELEASE、または SORT のステートメントを実行させることはできません。
出力プロシージャーが指定されていると、ファイル名-1 によって参照されたファイルが SORT ステートメントによって順序付けされてから、制御はこの出力プロシージャーに渡されます。コンパイラーは、出力プロシージャーの中の最後のステートメントの終わりに RETURN を挿入し、制御が出力プロシージャーの中の最後のステートメントに移ると、RETURN によってソートが終了し、 制御が SORT ステートメントの後に置かれた次の実行可能ステートメントに移ります。出力プロシージャーに入る前に、ソート・プロシージャーは要求されたとき、次のレコードをソートされた順に選択できる所まで来ています。出力プロシージャーの中の RETURN ステートメントは、次のレコードを要求することになります。
INPUT PROCEDURE および OUTPUT PROCEDURE は基本的な PERFORM ステートメント用の句と類似しています。例えば、出力プロシージャーにあるプロシージャーを指定すると、そのプロシージャーは、 それが PERFORM ステートメントの中で指定された場合とまったく同じように、 ソート操作時に実行されます。PERFORM ステートメントによる場合と同様に、プロシージャーの実行は、 最後のステートメントがその実行を終えると終了します。入力プロシージャーまたは出力プロシージャーの最後のステートメントとして、 EXIT ステートメントを使用することができます (EXIT ステートメントを参照)。
特殊レジスターの SORT-CORE-SIZE、SORT-MESSAGE、および SORT-MODE-SIZE は、 ソート制御ファイルの中の制御ステートメントのオプションで使用されるキーワードと同じ働きをします。ソート制御データ・セットの定義は、SORT-CONTROL 特殊レジスターを使用して行います。
注: ソート制御ファイルを使用して制御ステートメントを指定する場合は、 ソート制御ファイルの中に指定されている値が特殊レジスターにある値に優先します。
固定セグメントで SORT ステートメントがコード化された場合、この SORT ステートメントが参照するすべての出力プロシージャーは完全に固定セグメントの範囲内にあるか、プロシージャー全体が単一の独立セグメントに含まれている必要があります。
独立セグメントで SORT ステートメントがコード化された場合、この SORT ステートメントが参照するすべての入出力プロシージャーは完全に固定セグメントの範囲内にあるか、プロシージャー全体が SORT ステートメントと同じ独立セグメントに含まれている必要があります。