SORT(整列)文

SORT(整列)文は、ファイル中のレコードを整列させる。この処理は3つの段階に分かれる。最初の段階では、入力手続きを実行するかまたは他のファイルからレコードを転送するかして、整列用ファイルを作成する。次の段階では、指定されたキーの組に基づいて、整列用ファイル中のレコードの順序をそろえる。最後の段階では、整列させたレコードをその順番に出力手続きまたは出力ファイルに引き渡す。

表の中の要素を整列させるためにも、SORT文を使用できる。

SORT動詞の使用例は、言語リファレンス - 追加トピックの章の入出力手続きを使用したファイルのSORT およびSORTの表の項目節に掲載されている。

一般形式

形式 1

形式 2

指令

  1. 予約語リストにフラグを付けたり修正したりするコンパイラ指令に加えて、下記の指令によって、この項に記述した構文または意味が影響を受ける可能性がある。

    • CALLSORT - SORTおよびMERGEの処理を行うために使用するプログラムを指定する。

構文規則

すべての形式
  1. 形式 1のSORT文は、手続き部の宣言部分、SORT文またはMERGE文に関連する入力手続き、出力手続きの場所には置くことができない。

    形式 2のSORT文は宣言節に置いてもよい。

  2. データ名-1はキーのデータ名であり、下記の規則に従う。

    1. キー・データ名は修飾してもよい。

    2. キー・データ名のデータ項目は、可変長項目であってはならない。

    3. キー・データ項目は、浮動小数点数項目でもよい。

    4. キーが外部浮動小数点数であると、コンパイラはそのデータ項目を数字データとしてではなく文字データとして扱う。レコードがそろえられる順序は、使用する文字の照合順序に左右される。

    5. キー・データ項目が内部浮動小数点数である場合、キーの順序は数値順となる。
形式 1
  1. ファイル名-1は、データ部の整列併合ファイル記述項に記述しておく。

  2. データ名-1はキーのデータ名であり、下記の規則に従う。

    1. キーとするデータ項目は、ファイル名-1のレコード中に記述しておく。

    2. ファイル名-1に複数のレコード記述を含める場合、キー・データ項目は1つのレコード記述の中だけに指定する。

    3. キー・データ項目には、OCCURS句を含む記述項は記述できない。また、OCCURS句を含む記述項の下位にキー・データ項目を属させてはならない。

    4. ファイル名-1のファイルのレコードが可変長である場合、データ名をキーに指定するデータ項目はすべて、そのファイルの最初の x 文字位置のレコードの範囲内に入っていること。ここで x は、ファイル名-1によって参照されるファイルに指定された最小レコードサイズを示す。

  3. 語THRUとTHROUGHは同義語である。

  4. ファイル名-2とファイル名-3はデータ部の中の整列併合ファイル記述項にではなく、ファイル記述項に記述しておく。

  5. ファイル名-2のファイルとファイル名-3のファイルは、同じマルチ・ファイル・リールに収録されていてもよい。

  6. ファイル名-3が索引ファイルを指す場合、最初のデータ名-1にはASCENDINGを指定する。また、データ名-1がレコード上で占める文字位置は、そのファイルの主レコードキーと同じにする。

  7. 1つのSORT文の中で使用しているファイル名の組は、SAME SORT AREA句またはSAME SORT-MERGE AREA句には指定できない。GIVING指定の対象となっている複数のファイルは、同じSAME句には指定できない。

  8. GIVINGを指定したとき、ファイル名-3のファイルに含まれるレコードが可変長である場合、ファイル名-1のファイル中に含まれるレコードの大きさは、ファイル名-3のレコードの最小のもの以上かつ最大のもの以下にする。ファイル名-3のファイルに含まれるレコードが固定長である場合、ファイル名-1のファイル中に含まれるレコードの大きさは、ファイル名-3のレコード最大のものを超えてはならない。

    これらのレコードを構成する基本データ項目のデータ記述が異なる場合、対応するレコード同士の文字数が等しくなるように記述することは、プログラマの責任である。

  9. USINGを指定し、ファイル名-1のファイルに含まれるレコードが可変長である場合、ファイル名-2のファイル中に含まれるレコードの大きさは、ファイル名-1のレコードの最小のもの以上かつ最大のもの以下にする。ファイル名-1のファイルに含まれるレコードが固定長である場合、ファイル名-2のファイル中に含まれるレコードの大きさは、ファイル名-1のレコードの最大のものを超えてはならない。

  10. 手続き名-1は、入力手続きの名前を表わす。手続き名-3は、出力手続きの名前を表わす。

  11. 手続き名-1、手続き名-2、手続き名-3、手続き名-4は、節名とする。

    この制限は削除された。

  12. USING句またはGIVING句に10個以上のファイル名を指定したい場合、コンパイラ指令のCALLSORT"EXTSM"を使用しなければならない。この指令を使用すると、255個までのファイルを指定できる。
形式 2
  1. データ名-2は修飾してもよい。データ名-2のデータ記述項には、OCCURS句を記述しておく。

  2. データ名-1のデータ項目は、データ名-2のデータ項目と同じであるか、またはデータ名-2のデータ項目の下位に属する項目とする。

  3. データ名-1とデータ名-2が同じでない場合、データ名-1のデータ項目のデータ記述項にOCCURS句が記述してあってはならない。また、データ名-1のデータ項目は、データ名-2の下位に属しOCCURS句を伴うデータ項目の下位にも属してはならない。

  4. データ名-2の表の記述中にKEY指定がある場合にだけ、KEY指定を省略できる。

  5. OCCURS句を伴うデータ項目の下位にデータ名-2のデータ項目が属す場合、データ名-2のデータ項目の親であるOCCURS句を伴うデータ項目には、指標名を付ける。

一般規則

すべての形式
  1. 語ASCENDINGおよびDESCENDINGは、別のASCENDINGまたはDESCENDINGが出てくるまで、後ろに繰り返し続くすべてのデータ名-1に効力を及ぼす。

  2. データ名-1のデータ項目は、キー・データ項目である。このキー・データ項目によって、ファイル名-1のファイルからレコードが引き取られる順序または整列が終了した後で表の要素が格納される順序が決まる。キーの強さの順序は、SORT文の中に記述した順である。ASCENDINGまたはDESCENDING の指定は、キーの強さには関係ない。

  3. DUPLICATES指定をした場合、あるレコードまたは表要素のすべてのキー・データ項目の内容が他のいくつかのレコードまたは表要素の対応するキー・データ項目の内容と等しいとき、引き取られるレコードの順序は下記のようになる。

    1. SORT文の中または実行時スイッチに指定された入力ファイルの順序。 入力ファイルからレコードを読み込んだ場合は、その順序が保たれる。

    2. 入力手続きが用いられているときは、入力手続きからレコードが引き渡された順序。

    3. 整列処理が実行される前の、表要素の内容の相対順序。

  4. DUPLICATES指定をしなかった場合、あるレコードまたは表要素のすべてのキー・データ項目の内容が他のいくつかのレコードまたは表要素の対応するキー・データ項目の内容と等しいとき、引き取られるレコード順序または表要素の内容の相対順序はどうなるかわからない。

  5. 文字のキー・データ項目の比較に適用される文字の照合順序は、SORT文の実行開始時に、下記の優先順序で決定される。

    1. 最初は、指定してあれば、SORT文中のCOLLATING SEQUENCEに指定した文字の照合順序。

    2. 次は、プログラム用に設定してある文字の照合順序。
形式 1
  1. SORT文は、ファイル名-2のファイル中のすべてのレコードまたは入力手続きによって、ファイル名-1のファイルに引き渡されるレコードを受け取る。その後、データ名-1のデータ項目の値とASCENDING またはDESCENDING指定によって定まる順に、それらのレコードを並べ変え、出力手続きまたはファイル名-3のファイルに引き渡す。

  2. ファイル名-1のファイルから返された2つのレコードの相対順序を決めるために、比較条件の作用対象比較規則に従い、対応するキー・データ項目の内容が、最も強いキー・データ項目から順に比較される。

    1. 対応するキー・データ項目同士の内容が異なり、キーにASCENDING指定がなされている場合、キーの値が小さい方のレコードが先に返される。

    2. 対応するキー・データ項目同士の内容が異なり、キーにDESCENDING指定がなされている場合、キーの値が大きい方のレコードが先に返される。

    3. 対応するキー・データ項目同士の内容が等しい場合、次に強いキー・データ項目の内容に基づいて、順序が決定される。

  3. SORT文の実行は、下記の3つの段階に区分される。

    1. ファイル名-1のファイル中で、レコードを利用できるようにする。このためには、入力手続き中のRELEASE文を実行するか、またはファイル名-2に対して暗黙的にREAD文を実行する。この段階の処理が始まるときに、ファイル名-2のファイルは開かれていてはならない。この段階の処理が終わるとき、ファイル名-2のファイルは閉じられている。

    2. ファイル名-1のファイル中のレコードの順序がそろえられる。この段階では、ファイル名-2およびファイル名-3のファイルの処理は、何も行われない。

    3. ファイル名-1のファイルのレコードがそろえられた順序に従って、利用できるようにされる。このために、順序をそろえられたレコードがファイル名-3のファイルに書き出されるか、RETURN文を実行することによって出力手続きで利用できるようにされる。この段階の処理が始まるときに、ファイル名-3のファイルは開かれていてはならない。この段階の処理が終わるとき、ファイル名-3のファイルは閉じられている。

  4. 入力手続きでは、RELEASE文によって1件ずつファイル名-1のファイルに引き渡されるレコードを、必要に応じて選択したり修正したり複写したりする。この入力手続きの範囲には、その中からCALL文、PROGRAM指定のないEXIT文、GO TO文、PERFORM文によって制御を移された結果実行されるすべての文が含まれる。この入力手続きの範囲内で、MERGE文、RETURN文、SORT文を起動するようなことはできない。

  5. 入力手続きを指定すると、SORT文によってファイル名-1のファイル中のレコードの並べ替えが開始される前に、入力手続きに制御が渡される。コンパイラは、入力手続きの最後の文の末尾に復帰機構を組み込む。入力手続きの最後の文に制御が渡ると、ファイル名-1のファイルに引き渡されているレコードの整列処理が開始される。

  6. USINGを指定すると、ファイル名-2のファイル中のすべてのレコードが、ファイル名-1のファイルに書き出される。SORT文を実行すると、ファイル名-2の各ファイルに対して、下記の処理が行われる。

    1. ファイルの処理が開始される。これはINTPUT指定およびWITH LOCK指定をしたOPEN文を実行するように行われる

    2. 論理レコードが、入力ファイルから整列用ファイルに引き渡される。これはNEXTおよびAT END指定をしたREAD文が実行されるように行われる。ファイル名-1のファイルに含まれるレコードが固定長である場合、ファイル名-2のファイル中にファイル名-1の固定長レコードよりも短いものがあると、ファイル名-2のレコードがファイル名-1のファイルに引き渡されるときに、ファイル名-2のレコードの後部に空白が埋められる。ファイル名-1のファイルのレコードが可変長であると、ファイル名-1のファイルに書き出されるレコードの大きさは、ファイル名-2またはファイル名-3から読み込んだときのレコードの大きさとなる。このことは、ファイル名-1のファイルのファイル記述項に指定したRECORD VARYING DEPENDING ON句またはOCCURS DEPENDING ON句のDEPENDING ON指定の対象となっているデータ項目の内容にかかわらず、適用される。

    3. ファイルの処理が終了される。これは任意指定の何もないCLOSE文が実行されたように行われる。この終了処理が済んだ後で、SORT文によるファイル名-1のファイルの整列処理が開始される。

      相対ファイルに関しては、GIVING指定の対象にファイル名-2を指定しないと、SORT文の実行が終了したときに、RELATIVE KEYデータ項目の内容はどうなっているかわからない。

      USE AFTER EXCEPTION手続きを指定してあれば、上記の暗黙の処理においてそれも対象となる。しかし、そのUSE手続きの中から、ファイル名-2のファイルを操作したり、そのレコード領域をアクセスしたりするような文が実行されるようなことがあってはならない。

      ファイル名-2のファイル記述項中に指定したRECORD VARYING DEPENDING ON句の対象となっているデータ項目の値は、SORT文が完了した時点でどのようになっているかはわからない。

  7. 出力手続きでは、RETURN文によって1件ずつファイル名-1のファイルから引き取られる整列済みのレコードを、必要に応じて選択したり修正したり複写したりする。この出力手続きの範囲には、その中からCALL文、PROGRAM指定またはMETHOD指定のないEXIT文、GO TO文、PERFORM文によって制御を移された結果実行されるすべての文が含まれる。また、この出力手続きの範囲内の文を実行した結果として実行される宣言手続き中のすべての文も、この出力手続きの範囲に含まれる。この出力手続きの範囲内で、MERGE文、RELEASE文、SORT文を起動するようなことはできない。

  8. 出力手続きを指定すると、SORT文によってファイル名-1のファイル中のレコードの並べ替えが終了した後で、出力手続きに制御が渡される。コンパイラは、出力手続きの最後の文の末尾に復帰機構を組み込む。出力手続きの最後の文に制御が渡ると、復帰機構によってSORT文の処理が終了され、SORT文の次の実行文に制御が移される。出力手続きに入る前に、レコードの並べ替えは済んでいる。要求されれば次のレコードを引き渡せる状態に達している。出力手続き中のRETURN文は、次のレコードを求める要求である。
  9.  

  10. GIVINGを指定すると、順序をそろえられたすべてのレコードがファイル名-3のファイルに書き出される。これはSORT文に暗黙的に出力手続きを使用することである。SORT文を実行すると、ファイル名-3の各ファイルに対して下記の処理が行われる。

    1. ファイルの処理が開始される。これはOUTPUT指定をしたOPEN文を、暗黙的に実行することである。この開始処理は、入力手続きがあれば、その実行が済んだ後で行われる。

    2. 論理レコードが、整列用ファイルから出力ファイルに書き出される。これは何も任意指定をしないWRITE文を、暗黙的に実行することである。ファイル名-3のファイルに含まれるレコードが固定長である場合、ファイル名-1のファイル中にファイル名-3の固定長レコードよりも短いものがあると、ファイル名-1のレコードがファイル-3のファイルに書き出されるときに、ファイル名-1のレコードの後部に空白が埋められる。ファイル名-3のファイルのレコードが可変長であると、ファイル名-3のファイルに書き出されるレコードの大きさは、ファイル名-1から読み込んだときのレコードの大きさとなる。このことは、ファイル名-3のファイルのファイル記述項に指定したRECORD VARYING DEPENDING ON句またはOCCURS DEPENDING ON句の対象となっているデータ項目の内容にかかわらず、適用される。

      出力ファイルが相対ファイルである場合、最初に引き取られるレコードのRELATIVE KEYデータ項目の値は "1" 、2番目に引き取られるレコードのRELATIVE KEYデータ項目の値は "2" 、という具合いになる。SORT文の実行が終了した後のRELATIVE KEYデータ項目の内容は、どうなっているかわからない。

    3. ファイルの処理が終了される。これは任意指定の何もないCLOSE文を、暗黙的に実行することである。

      USE AFTER EXCEPTION手続きを指定してあれば、上記の暗黙の処理において、それも対象となる。しかし、そのUSE手続きの中から、ファイル名-3のファイルを操作したりそのレコード領域を呼び出したりするような文が実行されるようなことがあってはならない。外部的に定義されているファイル境界を超えて最初に書き出しが試みられたときに、そのファイルに関してUSE AFTER EXCEPTION手続きを指定してあれば、その手続きが実行される。USE文の規則に従って制御が戻されると、さらに暗黙の書き出し処理が行われることはない。上記のように、そのファイルの処理は終了される。

    ファイル名-1のファイル記述項中に指定したRECORD VARYING DEPENDING ON句の対象となっているデータ項目の値は、GIVING指定をしたSORT文が完了した時点でどのようになっているかはわからない。

  11. SORT文を含むプログラムを区分化できる。(言語リファレンス - 追加トピック区分化節を参照。)ただし、下記の制限がある。

    1. 独立区分ではない区分中の節内にSORT文が存在する場合、そのSORT文から呼び出される入力手続きまたは出力手続きは、下記のどちらかの状態で組み込まれていなければならない。

      • 非独立区分中に完全に含まれる。

      • 単一の独立区分中に完全に含まれる。

    2. 独立区分中にSORT文が存在する場合、そのSORT文から呼び出される入力手続きまたは出力手続きは、下記のどちらかの状態で組み込まれていなければならない。

      • 非独立区分中に完全に含まれる。

      • SORT文と同じ独立区分中に完全に含まれる。

  12. SORT ランタイム要素用に、特殊レジスタのSORT-RETURNが用意されている。この特殊レジスタには、整列処理が終わったときに0(正常終了)または16(不成功)が設定される。入力/出力手続きの中で、この特殊レジスタに値16を設定して、途中で整列処理を終わらせることができる。この場合、整列処理は次のRETURN文またはRELEASE文のところで終了される。
形式 2
  1. SORT文は、データ名-2が参照する表の要素を並べ替え、並べ替えた表を、ASCENDING またはDESCENDING指定により決定された順序、またはデータ名-2に関連づけられたKEY指定により決定された順序で、データ名-2に表示する。

  2. 並べ替えた後の表要素の相対順序を決めるために、比較条件の規則に従い、対応するキー・データ項目の内容が、最も強いキー・データ項目から順に比較される。

    1. 対応するキー・データ項目同士の内容が異なり、キーにASCENDING指定が含まれている場合、キーの値が小さい方の表要素に小さい出現番号が割り当てられる。

    2. 対応するキー・データ項目同士の内容が異なり、キーにDESCENDING指定が含まれている場合、キーの値が大きい方の表要素に小さい出現番号が割り当てられる。

    3. 対応するキー・データ項目同士の内容が等しい場合、次に強いキー・データ項目の内容に基づいて、順序が決定される。

  3. データ名-2の表の要素の出現番号は、OCCURS句の規則に従って決定される。

  4. OCCURS句を伴うデータ項目の下位に属するデータ項目をデータ名-2が指す場合、親の表の最初または唯一の指標名を、希望する値に設定してからSORT文を実行する。

  5. KEY指定をしないと、データ名-2が参照する表のデータ記述項中のKEY指定によって、順序が決定される。

  6. KEY指定をすると、この指定の方が、データ名-2の表のデータ記述項中のKEY指定よりも優先する。

  7. KEY指定をしてもデータ名-1を省略すると、データ名-2が参照するデータ項目がキー・データ項目とされる。

  8. データ名-2が参照する表の要素を整列した結果は、同じ表に書き戻される。

  9. COLLATING SEQUENCE指定は注記としてのみ処理される。