SORT ステートメント

SORT ステートメントにより、一連のレコードまたはテーブル・エレメントがユーザー指定の順序で配置されます。

ファイルをソートする場合、SORT ステートメントは、1 つ以上のファイルからレコードを受け取り、指定されたキーに従ってそれらをソートし、出力プロシージャーを介して、または出力ファイル内で、ソートされたレコードを使用できるようにします。

テーブルをソートする場合、SORT ステートメントは、指定されたテーブル・キーに従ってテーブル・エレメントをソートします。

構文図を読む構文図をスキップする
フォーマット 1: SORT ステートメント

>>-SORT--file-name-1-------------------------------------------->

   .--------------------------------------------------.   
   |                                  .-------------. |   
   V                                  V             | |   
>----+----+--+-ASCENDING--+--+-----+----data-name-1-+-+--------->
     '-ON-'  '-DESCENDING-'  '-KEY-'                      

>--+-----------------------------------------+------------------>
   '-+------+--DUPLICATES--+----+--+-------+-'   
     '-WITH-'              '-IN-'  '-ORDER-'     

>--+---------------------------------------------------+-------->
   '-+-----------+--SEQUENCE--+----+-- alphabet-name-1-'   
     '-COLLATING-'            '-IS-'                       

            .-------------.                                                           
            V             |                                                           
>--+-USING----file-name-2-+-------------------------------------------------------+-->
   '-INPUT PROCEDURE--+----+--procedure-name-1--+-------------------------------+-'   
                      '-IS-'                    '-+-THROUGH-+--procedure-name-2-'     
                                                  '-THRU----'                         

             .-------------.                                                           
             V             |                                                           
>--+-GIVING----file-name-3-+-------------------------------------------------------+-><
   '-OUTPUT PROCEDURE--+----+--procedure-name-3--+-------------------------------+-'   
                       '-IS-'                    '-+-THROUGH-+--procedure-name-4-'     
                                                   '-THRU----'                         

形式 1 SORT ステートメントは、宣言部分内を除き、PROCEDURE DIVISION のどこにでも指定できます。 この形式の SORT ステートメントは、THREAD オプションを指定してコンパイルされたプログラムではサポートされません。 MERGE ステートメントも参照してください。

構文図を読む構文図をスキップする
形式 2: テーブル SORT ステートメント

>>-SORT--data-name-2-------------------------------------------->

>--+-------------------------------------------------------+---->
   | .---------------------------------------------------. |   
   | |                               .-----------------. | |   
   | V                               V                 | | |   
   '---+----+-+-ASCENDING--+-+-----+---+-------------+-+-+-'   
       '-ON-' '-DESCENDING-' '-KEY-'   '-data-name-1-'         

>--+-----------------------------------------+------------------>
   '-+------+--DUPLICATES--+----+--+-------+-'   
     '-WITH-'              '-IN-'  '-ORDER-'     

>--+---------------------------------------------------+-------><
   '-+-----------+--SEQUENCE--+----+-- alphabet-name-1-'   
     '-COLLATING-'            '-IS-'                       

形式 2 SORT ステートメントは、PROCEDURE DIVISION のどこにでも指定できます。 この形式の SORT ステートメントは、THREAD オプションを指定してコンパイルされるプログラムで使用できます。

ファイル名-1
ソートされるレコードを記述している SD 項目の中で指定されている名前。

SORT ステートメントの中にあるファイル名の対を、 同じ SAME SORT AREA 節または SAME SORT-MERGE AREA 節の中で指定することはできません。 GIVING 節に関連したファイル名 (ファイル名-3 ...) は、SAME AREA 節には指定できません。 ただし、それらを SAME RECORD AREA 節に関連付けることは可能です。

データ名-2
以下の規則に従ったテーブル・データ名を指定します。
  • データ名-2 では、データ記述項目内に OCCURS 節がなければなりません。
  • データ名-2 は修飾することができます。
  • データ名-2 には添え字を付けることができます。テーブルの右端または唯一の添え字は省略するか、ワード ALL で置き換える必要があります。

データ名-2 によって参照されるテーブル・エレメントの出現数は、OCCURS 節内の規則によって決定されます。 ソートされたテーブル・エレメントは、データ名-2 によって参照されるテーブルと同じテーブルに配置されます。

ASCENDING KEY 句および DESCENDING KEY 句 (形式 1)

この句は、指定されたソート・キーに基づいて、 レコードを昇順または降順 (どちらになるかは指定された句次第) で処理することを指定します。

データ名-1
SORT ステートメントがソートの際に基準として使用する KEY データ項目を指定します。 そのようなデータ名はそれぞれ、ファイル名-1 に関連するレコードの中のデータ項目を識別する必要があります。 KEY という語の後に置かれたデータ名は、 レベルが高いものから順に左から右へと SORT ステートメントの中にリストします。 その際、これらのデータ名が KEY 句の中でどのように分割されるかは関係ありません。 左端のデータ名が最もレベルの高いキーとなり、次のデータ名が 2 番目のレベルのキーとなる、というようになります。 次の規則が適用されます。
  • 特定の KEY データ項目は、各入力ファイルの中で、 物理的に同じ位置になければならず、 また同じデータ・フォーマットを持っていなければなりません。 しかし、同じデータ名を持っている必要はありません。
  • ファイル名-1 が 2 つ以上のレコード記述を持つ場合には、KEY データ項目は、 どちらか一方のレコード記述の中にのみ記述されている必要があります。
  • ファイル名-1 が可変長レコードを含んでいる場合には、KEY データ項目はすべて、 レコードの最初の n 個の文字位置内に入っていなければなりません (nファイル名-1 で指定されている最小レコード・サイズ)。
  • KEY データ項目は、OCCURS 節を含んでいたり、OCCURS 節を含む項目に従属していたりすることはできません。
  • KEY データ項目には、以下を指定できません。
    • 可変位置項目
    • 可変オカレンス・データ項目を含むグループ項目
    • USAGE NATIONAL で記述された数字カテゴリー (国別 10 進数項目)
    • USAGE NATIONAL で記述された外部浮動小数点カテゴリー (国別浮動小数点項目)
    • DBCS カテゴリー
  • KEY データ項目は、 修飾することができます。
  • KEY データ項目は、以下のデータ・カテゴリーのいずれかに属することができます。
    • 英字、英数字、英数字編集
    • 数字 (USAGE NATIONAL の数字を除く)
    • 数字編集 (USAGE DISPLAY または NATIONAL)
    • 内部浮動小数点または display 浮動小数点
    • NCOLLSEQ(BINARY) コンパイラー・オプションが有効な場合は、国別または国別編集

ファイル名-3 が索引付きファイルを参照している場合、データ名-1 の最初の指定は ASCENDING 句に関連付けられていなければならず、そのデータ名-1 によって参照されるデータ項目は、そのファイルの基本レコード・キーに関連付けられているデータ項目と同じ文字位置をこのレコード内で占めていなければなりません。

ソート処理の方向は、次に示すように ASCENDING または DESCENDING のどちらのキーワードを指定するかによって異なります。

  • ASCENDING を指定すると、最低のキー値から最高のキー値へのシーケンスとなります。
  • DESCENDING を指定すると、最高のキー値から最低のキー値へのシーケンスとなります。
  • KEY データ項目が USAGE NATIONAL で記述されている場合、KEY 値のシーケンスは国別文字の 2 進値に基づきます。
  • KEY データ項目が内部浮動小数点項目の場合は、キー値のシーケンスは数値順になります。
  • COLLATING SEQUENCE 句が指定されていない場合は、 比較条件のオペランド比較規則に従ってキーが比較されます。 一般比較条件を参照してください。 .
  • COLLATING SEQUENCE 句が指定されている場合は、英字、英数字、英数字編集、外部浮動小数点、および数字編集の各カテゴリーのキー・データ項目に対して、指定された照合シーケンスが使用されます。 その他すべてのキー・データ項目に対しては、比較条件でのオペランドの比較規則に従って比較が行われます。

ASCENDING KEY 句および DESCENDING KEY 句 (形式 2)

この句は、指定された句およびソート・キーに基づいて、テーブル・エレメントを昇順または降順に処理することを指定します。

データ名-1
以下の規則に従った KEY データ名を指定します。
  • キー・データ名で示されるデータ項目は、データ名-2 によって参照されるデータ項目と同一であるか、そのデータ項目に従属していなければなりません。
  • KEY データ項目は、 修飾することができます。
  • KEY データ項目は、以下のデータ・カテゴリーのいずれかに属することができます。
    • 英字、英数字、英数字編集
    • 数字 (USAGE NATIONAL の数字を除く)
    • 数字編集 (USAGE DISPLAY または NATIONAL)
    • 内部浮動小数点または display 浮動小数点
    • 国別または国別編集
  • KEY データ項目には、以下を指定できません。
    • 可変位置項目
    • 可変オカレンス・データ項目を含むグループ項目
    • USAGE NATIONAL で記述された数字カテゴリー (国別 10 進数項目)
    • USAGE NATIONAL で記述された外部浮動小数点カテゴリー (国別浮動小数点項目)
    • DBCS カテゴリー
    • クラス・オブジェクトまたはポインター
    • 変更の始まりUSAGE OBJECT、USAGE POINTER、USAGE PROCEDURE-POINTER、USAGE FUNCTION-POINTER変更の終わり
    • 添え字付き
  • KEY データ名で示されるデータ項目がデータ名-2 に従属している場合は、以下の規則が適用されます。
    • データ項目は OCCURS 節で記述できません。
    • データ項目は、同じくデータ名-2 に従属し、OCCURS 節を含んでいる項目に従属することはできません。

データ名-2 によって参照されるテーブルの記述に KEY 句が含まれている場合にのみ、KEY 句を省略できます。

ワード ASCENDING および DESCENDING は、別の ASCENDING または DESCENDING のワードが検出されるまでに出現するすべてのデータ名-1 にわたって適用されます。

データ名-1 によって参照されるデータ項目はキー・データ項目であり、これらのデータ項目によって、ソートされるテーブル・エレメントの保管順が決まります。 キーの重要度の順序は、データ項目が SORT ステートメントで指定される順序であり、ASCENDING 句または DESCENDING 句との関連は考慮されません。

SORT ステートメントは、データ名-2 によって参照されるテーブルをソートし、ソートされたテーブルをデータ名-2 に示します。 ソート順は、ASCENDING 句および DESCENDING 句 (指定されている場合)、またはデータ名-2 に関連付けられている KEY 句によって決まります。

ソート操作の方向は、以下のように、キーワード ASCENDING または DESCENDING の指定によって異なります。
  • ASCENDING を指定すると、順序は最低キー値から最高キー値になります。
  • DESCENDING を指定すると、順序は最高キー値から最低キー値になります。
  • KEY データ項目が USAGE NATIONAL で記述されている場合、KEY 値のシーケンスは国別文字の 2 進値に基づきます。
  • KEY データ項目が内部浮動小数点である場合、キー値のシーケンスは数値順になります。
  • COLLATING SEQUENCE 句が指定されていない場合は、英字、英数字、英数字編集、外部浮動小数点、および数字編集の各カテゴリーのキー・データ項目に対して、EBCDIC シーケンスが使用されます。 その他すべてのキー・データ項目に対しては、比較条件でのオペランドの比較規則に従って比較が行われます。
  • COLLATING SEQUENCE 句が指定されている場合は、英字カテゴリー、英数字カテゴリー、英数字編集カテゴリー、外部浮動小数点カテゴリー、および数字編集カテゴリーのキー・データ項目に対して、指示された照合シーケンスが使用されます。 その他すべてのキー・データ項目に対しては、比較条件でのオペランドの比較規則に従って比較が行われます。
テーブル・エレメントが保管される相対順位を決定するために、比較条件でのオペランドの比較規則に従って、対応するキー・データ項目の内容が比較されます。 ソートは、以下の規則に従って、最上位キー・データ項目から開始されます。
  • 対応するキー・データ項目の内容が同一ではなく、キーが ASCENDING 句に関連付けられている場合、テーブル・エレメントに含まれているキー・データ項目の値が小さいほど、そのテーブル・エレメントのオカレンス番号は小さくなります。
  • 対応するキー・データ項目の内容が同一ではなく、キーが DESCENDING 句に関連付けられている場合、テーブル・エレメントに含まれているキー・データ項目の値が大きいほど、そのテーブル・エレメントのオカレンス番号は小さくなります。
  • 対応するキー・データ項目の内容が同一である場合は、次の最上位キー・データ項目の内容に基づいて決定が行われます。

KEY 句が指定されていない場合は、データ名-2 によって参照されるテーブルのデータ記述項目内の KEY 句によって順序が決定されます。

KEY 句が指定されている場合は、その KEY 句が、データ名-2 によって参照されるテーブルのデータ記述項目に指定されているすべての KEY 句をオーバーライドします。

データ名-1 が省略されている場合は、データ名-2 によって参照されるデータ項目がキー・データ項目になります。

DUPLICATES 句 (形式 1)

DUPLICATES 句が指定され、あるレコードに関連するすべてのキー・エレメントの内容が、 1 つまたは複数の他のレコードの中の対応するキー・エレメントに一致している場合は、 これらのレコードは次のような順序で戻されます。

  • 関連付けられた入力ファイルの SORT ステートメント中に指定されている通りの順序。 ある 1 個のファイル内では、レコードがそのファイルからアクセスされるときの順序。
  • 入力プロシージャーが指定されているとき、 これらのレコードが入力プロシージャーにより解放されるときの順序。

DUPLICATES 句が指定されていない場合には、これらのレコードの順序は未定義です。

DUPLICATES 句 (形式 2)

以下の両方の条件を満たしている場合、テーブル・エレメントの内容は、ソート操作を行う前の順序と同じ相対順序になります。
  • DUPLICATES 句が指定されている。
  • あるテーブル・エレメントに関連付けられているすべてのキー・データ項目の内容が、1 つ以上の他のテーブル・エレメントに関連付けられている、対応するキー・データ項目の内容に等しい。

DUPLICATES 句が指定されておらず、2 番目の条件が存在する場合、これらのテーブル・エレメントの内容の相対順序は未定義になります。

COLLATING SEQUENCE 句 (両方の形式)

この句で指定する照合シーケンスは、このソート処理で KEY データ項目に対して行われる英数字比較で使用されます。

COLLATING SEQUENCE 句は、英字または英数字以外のキーには影響を与えません。

英字名-1
これは SPECIAL-NAMES 段落の ALPHABET 節で指定されている必要があります。 英字名-1 は ALPHABET 節の句のいずれか 1 つに関連付けることができ、次のような結果になります。
STANDARD-1
ASCII 照合シーケンスがすべての英数字比較のために使用されます。 (ASCII 照合シーケンスは、EBCDIC および ASCII の照合シーケンスに示されています。)
STANDARD-2
国際標準版の「ISO/IEC 646, 7-bit coded character set for information processing interchange」が、すべての英数字比較のために使用されます。
NATIVE
EBCDIC 照合シーケンスがすべての英数字比較のために使用されます。 (EBCDIC 照合シーケンスは、EBCDIC および ASCII の照合シーケンスに示されています。)
EBCDIC
EBCDIC 照合シーケンスがすべての英数字比較のために使用されます。 (EBCDIC 照合シーケンスは、EBCDIC および ASCII の照合シーケンスに示されています。)
literal
ALPHABET-NAME 節でリテラルを指定したことにより設定された照合シーケンスが、 すべての英数字比較のために使用されます。

COLLATING SEQUENCE 句を省略した場合は、 OBJECT-COMPUTER 段落の PROGRAM COLLATING SEQUENCE 節 (指定されている場合) で使用したい照合シーケンスを指定します。 COLLATING SEQUENCE 句と PROGRAM COLLATING SEQUENCE 節を両方とも省略した場合には、 EBCDIC 照合シーケンスが使用されます。

USING 句

ファイル名-2 , ...
入力ファイル。

USING 句が指定されている場合、ファイル名-2、... (つまり、入力ファイル) の中のすべてのレコードは自動的にファイル名-1 に移動されます。 SORT ステートメントの実行時に、これらのファイルがオープンしないでください。 コンパイラーが自動的にこれらのファイルをオープンし、 読み取り、レコードを使用可能にし、そしてクローズします。 EXCEPTION/ERROR プロシージャーがこれらのファイルに対して指定されていると、 コンパイラーはこれらのプロシージャーへの必要なリンケージを設定します。

すべての入力ファイルは、DATA DIVISION の中の FD 項目に記述されている必要があります。

USING 句が指定され、ファイル名-1 に可変長レコードが含まれている場合、入力ファイル (ファイル名-2、...) に含まれるレコードのサイズは、ファイル名-1 に記述されている最小レコード以上かつ最大レコード以下でなければなりません。 ファイル名-1 に固定長レコードが含まれている場合、入力ファイルに含まれるレコードのサイズは、ファイル名-1 に対して記述されている最大レコード以下でなければなりません。 詳しくは、「Enterprise COBOL プログラミング・ガイド」の『ソートまたはマージへの入力の記述』を参照してください。

INPUT PROCEDURE 句

この句によって、ソート処理を開始する前に、 入力レコードを選択したり修正したりするために使うプロシージャーの名前を指定します。

プロシージャー名-1
入力プロシージャーの中の最初の (または唯一の) セクションまたは段落を指定します。
プロシージャー名-2
入力プロシージャーの最後のセクションまたは段落を識別します。

入力プロシージャーは、ファイル名-1 によって参照されるファイルに対する RELEASE ステートメントの実行によって 1 つずつ使用可能にされるレコードを選択、 修正、またはコピーするために必要なプロシージャーで構成することができます。 この範囲には、入力プロシージャーの範囲内の CALL、EXIT、GO TO、PERFORM、および XML PARSE の各ステートメントの実行による制御移動の結果として実行されるすべてのステートメントと、 入力プロシージャーの範囲にあるステートメント実行の結果として実行される宣言型プロシージャーの中のすべてのステートメントが含まれます。 入力プロシージャーの範囲内で、MERGE ステートメント、RETURN ステートメント、形式 1 の SORT ステートメントを実行することはできません。

入力プロシージャーが指定されている場合、制御がその入力プロシージャーに渡されない限り、ファイル名-1 によって参照されたファイルを SORT ステートメントが順序付けすることはできません。 コンパイラーは、入力プロシージャーの中の最後のステートメントの終わりに RETURN 挿入します。 制御が入力プロシージャーの中の最後のステートメントに渡されると、ファイル名-1 によって参照されるファイルに対して以前に解放されていたレコードがソートされます。

GIVING 句

ファイル名-3 , ...
出力ファイル。

GIVING 句が指定されたとき、ファイル名-1 にあるソートされたレコードはすべて、 自動的に出力ファイル (ファイル名-3...) に転送されます。

すべての出力ファイルは、DATA DIVISION の中の FD 項目に記述されている必要があります。

出力ファイル (ファイル名-3、...) に可変長レコードが含まれている場合、ファイル名-1 に含まれるレコードのサイズは、その出力ファイルについて記述された最小レコード以上かつ最大レコード以下でなければなりません。 出力ファイルに固定長レコードが含まれている場合、ファイル名-1 に含まれるレコードのサイズは、出力ファイルについて記述された最大レコードを超えてはいけません。 詳しくは、「Enterprise COBOL プログラミング・ガイド」の『ソートまたはマージからの出力の記述』を参照してください。

SORT ステートメントの実行時に、出力ファイル (ファイル名-3、...) がオープンされないようにします。 各出力ファイルに対して、SORT ステートメントが実行されると、 次のことが行われます。

  • ファイルの処理が開始されます。 この開始は、 OUTPUT 句指定の OPEN ステートメントが実行された場合と同様にして行われます。
  • ソートされた論理レコードが戻され、ファイル上に書き込まれます。 各レコードは、 何もオプショナルの句が指定されていない WRITE ステートメントが実行された場合と同様にして書き込まれます。

    相対ファイルの場合、 戻された最初のレコードの相対キー・データ項目には値 '1' が含まれます。戻された 2 番目のレコードでは、値 '2' が含まれるというようになります。 SORT ステートメントの実行が終わると、相対キー・データ項目は、 ファイルに最後に戻されたレコードを示しています。

  • ファイルの処理が終了します。 この終了処理は、オプショナルの句を指定しない CLOSE ステートメントが実行されたかのように行われます。

これらの暗黙の関数は、関連付けられている USE AFTER EXCEPTION/ERROR プロシージャーを実行するように実行されます。 ただし、このような USE プロシージャーの実行によって、ファイル名-3 が参照するファイルを操作するステートメント、 または関連付けられているレコード域にアクセスする操作を行うステートメントが実行されないように注意してください。 ファイルの外部定義境界を超えて書き込む最初の試みが行われると、 そのファイルに USE AFTER STANDARD EXCEPTION/ERROR プロシージャーが指定されていれば、 それが実行されます。 制御がその USE プロシージャーから戻されるか、 またはこのような USE プロシージャーが指定されていなければ、 ファイルの処理は終了します。

OUTPUT PROCEDURE 句

この句によって、ソート処理から出力レコードを選択したり修正したりするために使うプロシージャーの名前を指定します。

プロシージャー名-3
出力プロシージャーの中の最初の (または唯一の) セクションまたは段落を指定します。
プロシージャー名-4
出力プロシージャーの最後のセクションまたは段落を識別します。

出力プロシージャーは、ファイル名-1 によって参照されるファイルから RETURN ステートメントの実行によってソート順序に基づいて 1 つずつ使用可能に されるレコードを選択、修正、またはコピーするために必要なプロシージャーで構成することができます。 この範囲には、出力プロシージャーの範囲内で CALL、EXIT、GO TO、PERFORM、および XML PARSE ステートメントによって制御が移動して実行されるすべてのステートメントが含まれます。 また、この範囲には、出力プロシージャーの範囲内のステートメントが実行されると実行される宣言型プロシージャーの中のすべてのステートメントも含まれます。 出力プロシージャーの範囲内で、MERGE ステートメント、RELEASE ステートメント、形式 1 の SORT ステートメントを実行することはできません。

出力プロシージャーが指定されていると、ファイル名-1 によって参照されたファイルが SORT ステートメントによって順序付けされてから、制御はこの出力プロシージャーに渡されます。 コンパイラーは、出力プロシージャーの中の最後のステートメントの終わりに RETURN を挿入し、 制御が出力プロシージャーの中の最後のステートメントに移ると、RETURN によってソートが終了し、 制御が SORT ステートメントの後に置かれた次の実行可能ステートメントに移ります。 出力プロシージャーに入る前に、ソート・プロシージャーは要求されたとき、 次のレコードをソートされた順に選択できる所まで来ています。 出力プロシージャーの中の RETURN ステートメントは、次のレコードを要求することになります。

INPUT PROCEDURE および OUTPUT PROCEDURE は基本的な PERFORM ステートメント用の句と類似しています。 例えば、出力プロシージャーにあるプロシージャーを指定すると、そのプロシージャーは、 それが PERFORM ステートメントの中で指定された場合とまったく同じように、 ソート操作時に実行されます。 PERFORM ステートメントによる場合と同様に、プロシージャーの実行は、 最後のステートメントがその実行を終えると終了します。 入力プロシージャーまたは出力プロシージャーの最後のステートメントとして、 EXIT ステートメントを使用することができます (EXIT ステートメントを参照)。