紹介
本書では、SORTユーティリティ・コマンドの機能について説明します。
1. 概要
SORTは、入力データセット(SORTIN、SORTINnn)に対してソート、マージ、コピー、フィルタリング、再編集、合計などを実行して出力データセット(SORTOUT、OUTFILデータセット)を作成するユーティリティ・プログラムです。富士通メインフレームのSort/Mergeプログラムで記述したコマンドを受け取り、サードパーティ・ソリューションであるTmaxSoftのProSortを使用して実行します。
2. ユーティリティの機能
以下は、SORTユーティリティの主要機能です。
区分 | 説明 |
---|---|
ソート |
ソートを実行するための入力データセットのレコードを、指定されたキーに従って昇順または降順に並べ替えて出力データセットとして出力します。 |
マージ |
SORTINnnに指定された入力データセットのマージを実行するために、指定されたキーを使用してソート済みの2つ以上の入力データセットを、1つのソートされた出力データセットとしてマージして出力します。 |
コピー |
入力データセットのすべてのレコードを出力データセットにコピーします。 |
入力データセットがTSAMデータセットである場合、SORTユーティリティの主な機能の実行方法は、以下から最初にマッチされる方法が使用されます。
-
RECORD TYPE=[F|V]を実行する場合は[F|V]が使用されます。
-
SORTOUT DDに指定したデータセットのRECFMが確定された場合はRECFMが使用されます。
-
OUTFIL DDに指定したデータセットのRECFMが確定された場合はRECFMが使用されます。
-
SORTINがTSAM、SORTOUTがTSAMの場合は、Vタイプが使用されます。
以下は、SORTユーティリティで実行できるその他の機能です。
-
入力レコードのフィルタリング(条件付き入力フィルタリング)
入力レコードの再フォーマットを行う前に、INCLUDE、OMIT、SKIPREC、STOPAFTなどで条件を満たす入力レコードのみを含めるか除外することができます。
-
入力レコードの再フォーマット
ソート、マージ、コピーを実行する前に、INRECでフィルタリングされたレコードを指定された形式で再フォーマットします。これにより、入力レコードから不要なフィールドを削除し、ソート、マージ、コピーを実行する際の性能を高めることができます。
-
フィールド合計
ソート、マージの実行時にSUMを使用してキー値が一致する1つ以上のレコードの値をすべて合計します。EQUALSオプションが設定されていると、フィールドの値をすべて合計した後、同じキー値のレコードのうち、最初のレコードのみをSORTOUTとして出力します。
-
出力レコードの再フォーマット
ソート、マージ、コピーを実行した後、OUTRECを使用して指定された形式でレコードを再フォーマットします。再フォーマットされたレコードがSORTOUTとして出力されるか、OUTFILの入力レコードとなります。
-
出力レコードのコピー
OUTFILを使用してSORTOUTとして書き込まれるレコードを入力レコードとして、複数のOUTFIL DDで出力します。入力レコード・フィルタリングと出力レコードの再フォーマットをこのステップで再適用することができます。
3. SORT制御文
本節では、SORT制御文について説明します。
3.1. ジョブ制御文
ジョブ制御文は、JOB文、EXEC文、DD文、 /*文などで構成されています。
-
JOB文
ジョブの先頭に位置する制御文です。ジョブの開始を示しており、そのジョブの特性を定義します。
以下は、作成例です。
//SORT00 JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
-
EXEC文
1つのジョブは複数のステップで構成されており、EXEC文はジョブ・ステップの先頭に位置します。プログラムの名称およびプログラムに渡すパラメータなどを指定します。
以下は、作成例です。
//SORT EXEC PGM=SORT,REGION=2M
以下は、SORTで使用できるパラメータです。
パラメータ 説明 'JPn"string"'
SORTスクリプト内でJPnを文字列に置き換えます。
VLTESTI=n
INCLUDEまたはOMIT演算で指定されたフィールドがレコードに存在しないか、一部のみ存在する場合の動作を定義します。
-
VLTESTI=0 : INCLUDEまたはOMIT演算で指定されたすべてのフィールドがレコードの存在する必要があります。そうでない場合は、エラーが発生します。VLTESTIパラメータが指定されていない場合は、VLTESTI=0と見なされます。
-
VLTESTI=1 : INCLUDE演算は、指定されたフィールドが入力レコードに存在しないか一部のみ存在すると、そのレコードを出力しません。OMIT演算の場合は、指定されたフィールドが入力レコードに存在しないか一部のみ存在すると、そのレコードを出力します。
-
VLTESTI=2 : INCLUDEまたはOMIT演算で指定されたフィールドが入力レコードに存在しないか一部のみ存在すると、その関係式を「偽」と判断します。
-
-
DD文
ソートの実行時に使用されるデータセットの名前や属性などを以下の項目で指定します。
項目 説明 SYSIN
ソートの制御文を入力するためのデータセットです。一般的にDD *でシステムの入力ストリームを使用します。
SYSOUT
制御文のリストおよびメッセージを出力するためのデータセットです。一般的にシステムの出力ストリームを使用します。
SORTIN
ソート/コピー処理の入力データセットです。
SORTINnn
マージ処理の入力データセットです。データセット名は、SORTIN01から順に定義する必要はありませんが、同じ番号を使用することはできません。
また、マージ処理の入力データセットは、以下の条件を満たす必要があります。
-
同じレコード形式(RECFM)である必要があります。
-
レコード形式(RECFM)が固定長(FB)の場合、レコード長(LRECL)も同じである必要があります。
-
入力データセットは、MERGEコマンドのFIELDSオペランドに指定されたキーフィールドの条件で事前にソートされている必要があります。
SORTWKnn
ソート処理中に作業領域として使用するデータセットです。
SORTOUT
ソート/マージ/コピーの処理結果を出力するデータセットです。
JCLでSORTOUTを新規作成する際、レコード形式(RECFM)が指定されていない場合、SORTINまたはSORTINnnが固定長(FB)であればSORTOUTも固定長となり、SORTINまたはSORTINnnが可変長(VB)であればSORTOUTも可変長で作成されます。入力が非VSMのレコードをVSAMレコードとして出力するか、VSAMレコードを非VSMレコードとして出力することも可能です。
SORTOFxx
OUTFILを使用してレコードを再フォーマットする際、複数の出力データセットで出力します。xxは、1文字または2文字で構成された任意の英数字です。
SYMNAMES
シンボルを置換する場合、参照されるデータセットです。
-
レコード形式
シンボル名,フィールドの開始位置,フィールドの長さ,フィールドのフォーマット
JNFnCNTL
JOINを実行する際、subtasknの制御文です。JOINを実行する前に実行するSORT文を指定します。nは、1または2です。
-
-
/*文
SYSINデータセットの終了を指定します。SORT制御文のENDを使用して終了を指定することもできます。
3.2. データセットの定義
以下は、データセットの定義に一般的に必要なオペランドです。
データセット | DCB | DISP | DSN | LABEL | SPACE | UNIT | VOL | AMP |
---|---|---|---|---|---|---|---|---|
SORTIN |
1 |
○ |
○ |
2 |
Ⅹ |
3 |
3 |
7 |
SORTINnn |
1 |
○ |
○ |
2 |
5 |
3 |
3 |
7 |
SORTOUT |
1 |
○ |
4 |
2 |
5 |
3 |
6 |
7 |
SORTOFxx |
1 |
○ |
4 |
2 |
5 |
3 |
6 |
7 |
SORTWKnn |
Ⅹ |
4 |
4 |
Ⅹ |
5 |
3 |
6 |
Ⅹ |
SYMNAMES |
1 |
○ |
○ |
2 |
Ⅹ |
3 |
3 |
Ⅹ |
JNFnCNTL |
1 |
4 |
4 |
2 |
5 |
3 |
3 |
7 |
-
○ : 必ず指定します。
-
Ⅹ : 指定しなくても構いません。
-
1 : 場合によって指定が必要です。
-
2 : ディスク上では不要です。
-
3 : 現在のジョブ・ステップの前に作成およびカタロギングされている場合は不要ですが、そうでない場合は指定する必要があります。
-
4 : 一時データセットでない場合は指定します。
-
5 : 直接アクセス記憶装置上に作成する場合は指定します。
-
6 : 一時データセットの場合、現在のステップの前に作成およびカタロギングされていれば、同じジョブ内の他のステップから渡された場合を除いて指定します。
-
7 : VSAMデータセットの場合は、付加情報が必要な際に指定することができ、それ以外のデータセットの場合は不要です。
DCBオペランドのサブパラメータ
入出力データセットがVSAMデータセットでない場合、レコード形式(RECFM)、レコード長(LRECL)、ブロック・サイズ(BLKSIZE)の情報を指定する必要があります。
項目 | 説明 |
---|---|
レコード形式(RECFM) |
データセットに記録されているレコード形式を指定します。 |
レコード長(LRECL) |
データセットに記録されているレコードの論理的な最大長をバイトで指定します。 |
ブロック・サイズ(BLKSIZE) |
データセットに記録されているレコードの物理的な最大長をバイトで指定します。 |
上記情報の指定は、以下の順序に従って決定されます。
-
RECFM、LRECL、BLKSIZEがDD文のDCBオペランドで指定されている場合はその情報を使用し、その他の設定情報は無視します。
-
入力データセットの場合、DCBオペランドが指定されていないとエラーが発生します。ただし、すでにデータセットが存在している場合はその情報を使用します。出力データセットの場合、DCBオペランドの指定がなければ以下の順序で指定されます。
-
OUTRECで指定された情報を上書きして使用します。
-
RECORDで指定された情報を上書きして使用します。
-
INRECで指定された情報を上書きして使用します。
-
入力データセットで指定された情報を上書きして使用します。
-
4. 一般的なコーディング規則
以下は、SORTユーティリティのコマンド文を作成するための構文です。

区分 | 説明 |
---|---|
ラベル・フィールド(Label Field) |
ラベル・フィールドは行の1列目から始まります。空白やアスタリスク(*)は1列目に使用できません。(ラベル・フィールドは省略可能) ラベルは1~70列まで使用可能であり、空白が現れるとラベルの終わりを示します。 |
オペレーション・フィールド(Operation Field) |
SORT、MERGEなど、プログラムが実行するコマンドを指定します。1行目の2~71列に作成できます。 |
オペランド・フィールド(Operand Field) |
オペランド・フィールドはコンマで続けることができ、オペレーション・フィールドの後ろに少なくとも1つ以上の空白文字を入れて指定します。 オペランド・フィールド内では、空白は使用できません。 |
リマーク・フィールド(Remark Field) |
コメント文のようにどんな内容でも作成することができます。プログラムの動作中には無視されます。 オペランド・フィールドの後ろに1つ以上の空白文字を入れて作成します。 |
継続列(Continuation Column)(72) |
72列目は継続列です。この列に空白以外の文字が位置すると、現在の構文が次の行に続くことを意味します。ただし、オペランド・フィールドがコンマで終わった場合は、次の行をオペランドの続きと判断します。 |
73~80列 |
このフィールドは自由に使用できます。プログラムでは読み込みません。 |
継続行(Continuation Lines) |
継続行は、先行する行の論理的な拡張です。これはオペランドの継続であることもあり、コメント文の継続である場合もあります。
|
1列目がアスタリスク(*)で始まると、その行はコメント文と見なされます。コマンド文内に空白行が存在する場合、プログラムはこれを無視します。したがって、空白行は実行の続きに影響を与えません。 |