SORT 文

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

MF SORT 文は、表内の要素を整列するためにも使用できる。

書き方 1 の一般形式


SORT - Format 1
MF 

書き方 2 の一般形式


SORT - Format 2

指令

  1. 予約語リストのフラグ付けおよび修正を行うコンパイラ指令に加えて、以下の指令が、本セクションに記載の構文または意味内容に影響を与える可能性がある。
    • CALLSORT - SORT および MERGE の処理を行うために使用するプログラムを指定する。

すべての書き方の構文規則

  1. 書き方 1 の SORT 文は、手続き部の宣言部分、および SORT 文または MERGE 文に関連付けた入力または出力手続きには記述できない。

    MF 書き方 2 の SORT 文は、宣言部分に記述できる。

  2. data-name-1 は KEY のデータ名であり、以下の規則に従う。
    1. KEY データ名は修飾できる。
    2. KEY データ名が示すデータ項目には、可変長項目を指定できない。
    3. KEY データ項目は、浮動小数点項目でもよい。
    4. OSVSVSC2MF KEY が外部浮動小数点数である場合、コンパイラはそのデータ項目を数値データではなく文字データとして扱う。レコードを整列する順番は、使用する文字の照合順序に依存する。
    5. OSVSVSC2MF KEY データ項目が内部浮動小数点数である場合、レコードはキー値の数値順に整列される。

書き方 1 の構文規則

  1. file-name-1 は、データ部の整列併合ファイル記述項に記述する。
  2. data-name-1 は KEY のデータ名であり、以下の規則に従う。
    1. KEY データ名が示すデータ項目は、file-name-1 に関連付けたレコード内に記述する。
    2. file-name-1 が複数のレコード記述を含む場合、KEY データ名が示すデータ項目は、1 つのレコード記述内にのみ指定する必要がある。
    3. KEY データ名が示すデータ項目のいずれも、OCCURS 句を含む記述項、または OCCURS 句を含む記述項に従属する記述項によって記述することはできない。
    4. file-name-1 が参照するファイルに可変長のレコードが含まれる場合、KEY の data-name に指定するデータ項目はすべて、レコードの最初の x 文字位置内に含まれているものとする。ここで x は、file-name-1 が参照するファイルに指定した最小レコード サイズに等しい。
  3. THRU および THROUGH は同義語である。
  4. file-name-2 および file-name-3 は、データ部内の整列併合ファイル記述項にではなく、ファイル記述項に記述する。
  5. ANS85 file-name-2 および file-name-3 が参照するファイルは、同じマルチ ファイル リールにあってもよい。
  6. ANS85 file-name-3 が索引ファイルを参照する場合、最初の data-name-1 は ASCENDING 指定に関連付ける。また、その data-name-1 が参照するデータ項目がレコード上で占める文字位置は、そのファイルの主レコード キーに関連付けたデータ項目と同じとする。
  7. 1 つの SORT 文で使用しているファイル名のペアは、SAME SORT AREA 句または SAME SORT-MERGE AREA 句では指定できない。GIVING 指定で複数の file-name を関連付けた場合、それらは同じ SAME 句で指定できない。
  8. ANS85 GIVING を指定し、file-name-3 が参照するファイルに可変長レコードが含まれている場合、file-name-1 が参照するファイルに含まれるレコードのサイズは、最小レコード以上とし、file-name-3 に記述した最大のレコード以下とする。file-name-3 が参照するファイルに固定長レコードが含まれている場合、file-name-1 が参照するファイルに含まれるレコードのサイズは、file-name-3 が参照するファイルに記述した最大のレコード以下とする。

    これらのレコードを構成する基本データ項目のデータ記述が異なる場合は、プログラミングの段階で、対応するレコード同士で、レコードに割り当てる文字位置数が等しくなるように記述する必要がある。

  9. ANS85 USING を指定し、file-name-1 が参照するファイルに可変長レコードが含まれている場合、file-name-2 が参照するファイルに含まれるレコードのサイズは、最小レコード以上とし、file-name-1 に記述した最大のレコード以下とする。file-name-1 が参照するファイルに固定長レコードが含まれている場合、file-name-2 が参照するファイルに含まれるレコードのサイズは、file-name-1 が参照するファイルに記述した最大のレコード以下とする。
  10. procedure-name-1 は、入力手続きの名前を表わす。procedure-name-3 は、出力手続きの名前を表わす。
  11. rocedure-name-1、rocedure-name-2、rocedure-name-3、および rocedure-name-4 は節名とする。

    ANS85OSVS 現在、この制限は廃止されている。

  12. USING 句または GIVING 句で 10 以上のファイル名を指定する場合は、コンパイラ指令 CALLSORT"EXTSM" を使用する。この指令を使用すると、255 個までのファイルを指定できる。
MF 

書き方 2 の構文規則

  1. MF data-name-2 は修飾でき、そのデータ記述項では、OCCURS 句を記述する。
  2. MF data-name-1 が参照するデータ項目は、data-name-2 が参照するデータ項目と同じにするか、data-name-2 が参照するデータ項目に属する記述項とする。
  3. MF data-name-1 および data-name-2 が同じでない場合、OCCURS 句を含む記述項で、data-name-1 が参照するデータ項目を記述することはできない。data-name-1 が参照するデータ項目は、data-name-2 にも属する OCCURS 句を含む記述項に属することはできない。
  4. MF data-name-2 が参照する表の記述に KEY 指定が含まれる場合にのみ、KEY 指定は省略できる。
  5. MF data-name-2 が参照するデータ項目が、OCCURS 句を含むデータ項目に属する場合、data-name-2 が参照するデータ項目の親である OCCURS 句を含む各データ項目には、指標名を関連付ける。

すべての書き方に関する一般規則

  1. 語 ASCENDING および DESCENDING は、別の ASCENDING または DESCENDING を検出するまで、後続のすべての data-name-1 に効力を及ぼす。
  2. data-name-1 の指定が参照するデータ項目はキー データ項目であり、このキー データ項目によって、file-name-1 が参照するファイルからレコードを返す順序、または整列の終了後に表の要素が格納される順序が決まる。キーの重要度の順序は、それらを SORT 文で指定した順番であり、それらに関連付けた ASCENDING または DESCENDING 指定は関係ない。
  3. DUPLICATES を指定した場合、あるデータ レコードまたは表要素に関連付けたすべてのキー データ項目の内容が、他の 1 つ以上のデータ レコードまたは表要素に関連付けた対応するキー データ項目の内容と等しいとき、これらのレコードが返される順序は以下のようになる。
    1. SORT 文、または RTS スイッチで指定した、関連付けた入力ファイルの順序。入力ファイル内では、そのファイルからレコードを読み取った順序。
    2. 入力手続きを指定した場合は、入力手続きからレコードが引き渡された順序。
    3. 整列処理を行う前の、表要素の内容の相対順序。
  4. DUPLICATES を指定しない場合、あるデータ レコードまたは表要素に関連付けたすべてのキー データ項目の内容が、他の 1 つ以上のデータ レコードまたは表要素に関連付けた対応するキー データ項目の内容と等しいとき、これらのレコードが返される順序または表要素の内容の相対順序は未定義となる。
  5. 文字のキー データ項目の比較に適用される文字の照合順序は、SORT 文の実行開始時に、以下の優先順位で決まる。
    1. 最初に、SORT 文内の COLLATING SEQUENCE 指定で設定した照合順序 (指定した場合)。
    2. 次に、プログラム用に設定された照合順序。

書き方 1 の一般規則

  1. SORT 文は、file-name-2 が参照するファイル内のすべてのレコード、または file-name-1 が参照するファイルへの入力手続きが引き渡すすべてのレコードを引き渡す。その後、file-name-1 の指定が参照するデータ項目の値および ASCENDING または DESCENDING 指定で決められた順番でそれらのレコードを整列し、出力手続きまたは file-name-3 が参照するファイルに戻す。
  2. file-name-1 が参照するファイルから返された 2 つのレコードの相対順序を決めるために、比較条件の作用対象の比較規則に従い、対応するキー データ項目の内容が、最上位のキー データ項目から始まって、以下の順番で比較される。
    1. 対応するキー データ項目同士の内容が異なり、キーが ASCENDING 指定に関連付けられている場合、値が小さい方のキー データ項目を含むレコードが最初に返される。
    2. 対応するキー データ項目同士の内容が異なり、キーが DESCENDING 指定に関連付けられている場合、値が大きい方のキー データ項目を含むレコードが最初に返される。
    3. 対応するキー データ項目同士の内容が等しい場合、次に最上位のキー データ項目の内容に基づいて、順序が決まる。
  3. SORT 文の実行は、以下の 3 段階で構成される。
    1. レコードが、file-name-1 が参照するファイルで使用できるようになる。これを行うには、入力手続きで RELEASE 文を実行するか、file-name-2 に対して暗黙的に READ 文を実行する。この段階の開始時には、file-name-2 が参照するファイルを開いた状態にしておくことはできない。この段階の終了時には、file-name-2 が参照するファイルは閉じられている。
    2. file-name-1 が参照するファイルでは、レコードが順序付けられている。この段階では、file-name-2 および file-name-3 が参照するファイルの処理は行われない。
    3. file-name-1 が参照するファイルのレコードは、整列された順序で利用できる。整列されたレコードは、file-name-3 が参照するファイルに書き込まれるか、RETURN 文を実行することにより、出力手続きの処理で利用できる。この段階の開始時には、file-name-3 が参照するファイルを開いた状態にしておくことはできない。この段階の終了時には、file-name-3 が参照するファイルは閉じられている。
  4. 入力手続きは、file-name-1 が参照するファイルで、RELEASE 文で 1 つずつ使用できるレコードを選択、変更、またはコピーするために必要な任意の手続きで構成できる。範囲に含まれるのは、入力手続きの範囲内で、CALL 文、オプションの PROGRAM または METHOD を指定しない EXIT 文、GO TO 文、および PERFORM 文による制御の移転結果として実行されるすべての文である。この入力手続きの範囲内では、MERGE 文、RETURN 文、または SORT 文は実行できない。
  5. 入力手続きを指定した場合、入力手続きに制御が渡された後に、file-name-1 が参照するファイル内のレコードを SORT 文が整列する。コンパイラは、入力手続きの最後の文の末尾に復帰メカニズムを挿入する。入力手続きの最後の文に制御が移ると、file-name-1 が参照するファイルに引き渡されたレコードが整列される。
  6. USING を指定した場合、file-name-2 が参照するファイル内のすべてのレコードは、file-name-1 が参照するファイルに転送される。file-name-2 が参照する各ファイルについて、SORT 文を実行すると以下の処理が行われる。
    1. ファイルの処理が開始する。この開始処理は、INTPUT および WITH LOCK を指定した OPEN 文を実行した場合と同様に行われる。
    2. 論理レコードを取得し、整列処理に引き渡す。各レコードの取得は、NEXT および AT END を指定した READ 文を実行した場合と同様に行われる。file-name-1 が参照するファイルが固定長のレコードを含む場合、file-name-2 が参照するファイルのレコードのうち file-name-1 に指定したものよりも文字位置が少ないレコードについては、そのレコードが file-name-1 の参照先のファイルに引き渡される際に、レコード内の最後の文字の後の最初の文字位置を起点として、その右側に空白が埋められる。file-name-1 が参照するファイルが可変長のレコードで記述されている場合、file-name-1 に書き込まれるレコードのサイズは、そのレコードを file-name-2 または file-name-3 から読み取った時点のサイズとなる。これは、file-name-1 のファイル記述項で指定した RECORD VARYING DEPENDING ON または OCCURS DEPENDING ON 句が参照するデータ項目の内容とは無関係である。
    3. ファイルの処理が終了する。この終了処理は、オプションの指定がない CLOSE 文を実行した場合と同様に行われる。この終了処理の完了後、file-name-1 が参照するファイルは、SORT 文によって整列される。

      相対ファイルでは、GIVING 指定で file-name-2 を参照しない場合、SORT 文の実行後に、相対キー データ項目の内容は未定義となる。

      USE AFTER EXCEPTION 手続きを関連付けていれば、これらの暗黙の処理でその手続きも実行される。ただし、そのような USE 手続きの実行により、file-name-2 が参照するファイルを操作する文、または file-name-2 に関連付けたレコード領域を読み取る文を実行してはならない。

      file-name-2 のファイル記述項で指定した RECORD VARYING DEPENDING ON 句が参照するデータ項目の値は、SORT 文の完了時では未定義である。

  7. 出力手続きは、file-name-1 が参照するファイルから、整列した順番で RETURN 文で 1 つずつ使用できるレコードを選択、変更、またはコピーするために必要な任意の手続きで構成できる。この範囲には、出力手続きの範囲内の CALL 文、オプションの PROGRAM または METHOD を指定しない EXIT 文、GO TO 文、および PERFORM 文が制御を転送した結果として実行されるすべての文、および出力手続きの範囲内の文の実行結果として実行される宣言手続き内のすべての文が含まれる。この出力手続きの範囲内では、MERGE 文、RELEASE 文、または SORT 文は実行できない。
  8. 出力手続きを指定した場合、file-name-1 が参照するファイル内のレコードを SORT 文が整列した後に、出力手続きに制御が渡される。コンパイラは、出力手続きの最後の文の末尾に復帰メカニズムを挿入する。出力手続きの最後の文に制御が移ると、復帰メカニズムによって SORT 文の処理が終了した後、SORT 文の次の実行可能文に制御が移る。出力手続きに入る前にレコードは整列されており、要求に応じて整列順の次のレコードを選択できる状態になっている。出力手続き内の RETURN 文は、次のレコードを要求する。
  9. GIVING を指定すると、SORT 文の暗黙的な出力手続きとして、整列されたすべてのレコードが、file-name-3 が参照するファイルに書き込まれる。file-name-3 が参照する各ファイルについては、SORT 文を実行すると以下の処理が行われる。
    1. ファイルの処理が開始する。この開始処理は、OUTPUT を指定した OPEN 文を実行した場合と同様に行われる。この開始処理は、入力手続きの実行後に行われる。
    2. 論理レコードが戻されてファイルに書き込まれる。レコードの書き込みは、オプションの指定がない WRITE 文実行した場合と同様に行われる。file-name-3 が参照するファイルが固定長のレコードで記述されている場合、file-name-1 が参照するファイルのレコードのうち file-name-3 に指定したものよりも文字位置が少ないレコードについては、そのレコードが file-name-3 の参照先のファイルに戻される際に、レコード内の最後の文字の後の最初の文字位置を起点として、その右側に空白が埋められる。file-name-3 が参照するファイルが可変長のレコードで記述されている場合、file-name-3 に書き込まれるレコードのサイズは、そのレコードを file-name-1 から読み取った時点のサイズとなる。これは、file-name-3 のファイル記述項で指定した RECORD VARYING DEPENDING ON または OCCURS DEPENDING ON 句が参照するデータ項目の内容とは無関係である。

      相対ファイルについては、戻される最初のレコードの相対キー データ項目の値は 1、戻される 2 番目のレコードの値は 2、と続く。SORT 文の実行後の相対キー データ項目の内容は未定義となる。

    3. ファイルの処理が終了する。この終了処理は、オプションの指定がない CLOSE 文を実行した場合と同様に行われる。

      USE AFTER EXCEPTION 手続きを関連付けていれば、これらの暗黙の処理でその手続きも実行される。ただし、そのような USE 手続きの実行により、file-name-3 が参照するファイルを操作する文、または file-name-3 に関連付けたレコード領域を読み取る文を実行してはならない。ファイルの外部定義境界を越えて最初に書き込む際に、そのファイルに USE AFTER EXCEPTION 手続きが関連付けられている場合は、それが実行される。USE 文の規則で指定されたとおりに制御が戻る場合は、そのファイルに対して追加の暗黙的な書き込み操作は実行されず、この部分で指定されたとおりにファイルの処理が終了する。

    file-name-1 のファイル記述項で指定した RECORD VARYING DEPENDING ON 句が参照するデータ項目の値は、GIVING を指定した SORT 文の完了時には未定義となる。

  10. 区分化」トピックに記載のとおり、SORT 文を含むプログラムでは、区分化を適用できる。ただし、以下の制約事項がある。
    1. 独立区分ではない区分の節に SORT 文がある場合、その SORT 文が参照する入力手続きまたは出力手続きは、以下のどちらかの状態で組み込まれるものとする。
      • 非独立区分に完全に含まれる
      • 単一の独立区分に完全に含まれる
    2. 独立区分に SORT 文がある場合、その SORT 文が参照する入力手続きまたは出力手続きは、以下のどちらかの状態で組み込まれるものとする。
      • 非独立区分に完全に含まれる
      • その SORT 文と同じ独立区分に完全に含まれる
  11. OSVSVSC2MF  SORT-RETURN 特殊レジスタは、SORT ランタイム要素で利用できる。この特殊レジスタには、整列処理の完了時に 0 (成功) または 16 (失敗) という戻りコードが格納される。エラー宣言、入力手続き、または出力手続きで SORT-RETURN 特殊レジスタを値 16 に設定して、すべてのレコードを処理する前に整列処理を中断できる。この場合、整列処理は次の RETURN 文または RELEASE 文で中断する。
MF 

書き方 2 の一般規則

  1. MF SORT 文は data-name-2 が参照する表を整列し、data-name-2 に整列した表を表示する。整列の順序は、ASCENDING または DESCENDING 指定 (ある場合) によって決まるか、data-name-2 に関連付けた KEY 指定によって決まる。
  2. MF 整列後に表要素を整列する相対順序を決めるには、比較条件の作用対象の比較規則に従い、対応するキー データ項目の内容が、最上位のキー データ項目から始まって、順に比較される。
    1. 対応するキー データ項目同士の内容が異なり、キーが ASCENDING 指定に関連付けられている場合、値が小さい方のキー データ項目を含む表要素に最小の出現番号が割り当てられる。
    2. 対応するキー データ項目同士の内容が異なり、キーが DESCENDING 指定に関連付けられている場合、値が大きい方のキー データ項目を含む表要素に最小の出現番号が割り当てられる。
    3. 対応するキー データ項目同士の内容が等しい場合、次に最上位のキー データ項目の内容に基づいて、順序が決まる。
  3. MF data-name-2 が参照する表の要素の出現番号は、OCCURS 句の規則に従って決まる。
  4. MF OCCURS 句を含むデータ項目に属するデータ項目を data-name-2 が参照する場合、そのような親の表に関連付けた最初または唯一の指標名を、任意の出現番号に設定してから SORT 文を実行する。
  5. MF KEY を指定しない場合、data-name-2 が参照する表のデータ記述項の KEY 指定によって順序が決まる。
  6. MF KEY を指定した場合、この指定の方が、data-name-2 が参照する表のデータ記述項で指定した KEY よりも優先される。
  7. MF KEY を指定して data-name-1 を省略した場合、data-name-2 が参照するデータ項目がキー データ項目となる。
  8. MF data-name-2 が参照する表の整列済み表要素は、その表に配置される。
  9. SORT 手続きは、同時に複数のスレッドから呼び出すことはできない。

SORT 動詞の使用例については、「入出力手続きを使用したファイルの整列」および「表の項目の整列」トピックを参照。