CALL PLISRTA(fields–spec, records-spec, storage, ret-code [,prefix][,msg-level] [,algorithm]);
CALL PLISRTB(fields-spec, records-spec, storage, ret-code, input-proc[,prefix][msg-level][,algorithm]);
CALL PLISRTC(fields-spec, records-spec, storage, ret-code, output-proc [,prefix][,msg-level] [,algorithm]);
CALL PLISRTD(fields-spec, records-spec, storage, ret-code, input-proc, output-proc [,prefix] [,msg-level][,algorithm]);
fields-spec は次の形式の文字列です。
`SORT
FIELDS=(pos,len,type,seq,[,posj,lenj,typej,seqj]...)[,options-list]
'
3 つの各インスタンスに出現する は、1 つ以上の空白文字を表します。文字列に含めることができる空白はこの空白だけです。
options-list には次の項目を指定できます。
FILSZ=n | ソート内のレコード数を指定します。このオプションは無視されます。 |
SKIPREC=n | 入力ファイルの先頭にある n 個のレコードをスキップするように指定します。 |
CKPT または CHKPT | チェックポイントを取得するように指定します。このオプションは無視されます。 |
EQUALS | 安定ソート アルゴリズムを指定します。つまり、同じキー値のレコードを入力ファイル内と同じ順序、または入力プロシージャで指定された際と同じ順序で保持するように指定します。 |
NOEQUALS | 安定ソート アルゴリズムを使用しないように指定します。これはデフォルトの設定です。 |
DYNALLOC=(d,n) | 中間記憶域を指定します。 |
records–spec は次の形式の文字列です。
`RECORD
TYPE=rectype,LENGTH=(len)[,ftype]
'
3 つの各インスタンスに出現する は、1 つ以上の空白文字を表します。文字列に含めることができる空白はこの空白だけです。
storage:この引数は無視されます。
例 1
plisrt1: proc options(main); /* Examples of the PLISRT Built in functions. This program uses a data file named 'SRT1IN', with a record length of 20, which must already exist. */ dcl (plisrta, plisrtb, plisrtc, plisrtd) builtin; declare ret_code fixed bin(31); declare eof bit(1); declare chkdata file; declare rec char(20); put skip list('Plisrt1 starting...'); put skip(2) list('Contents of SRT1IN :-'); /* display the input file */ open file(chkdata) record title('SRT1IN'); eof = '0'b; on endfile(chkdata) eof='1'b; read file(chkdata) into(rec); do while(eof = '0'b); put skip list(rec); read file(chkdata) into(rec); end; close file(chkdata); revert endfile(chkdata); put skip(2) list('Calling plisrta ---------------------------->'); call plisrta(' sort fields=(1,10,ch,a),equals', ' record type=F,length=(20) ', 0 , /* strg */ ret_code, 'SRT1', /* data name prefix */ 'AP', /* msg level */ 'xxxx' /* sort method */); put skip list('result code is ', ret_code); /* display output file of above */ put skip(2) list('Contents of SRT1OUT :-'); open file(chkdata) record title('SRT1OUT'); eof = '0'b; on endfile(chkdata) eof='1'b; read file(chkdata) into(rec); do while(eof = '0'b); put skip list(rec); read file(chkdata) into(rec); end; close file(chkdata); revert endfile(chkdata); put skip(2) list('Calling plisrtb ---------------------------->'); call plisrtb(' sort fields=(1,10,ch,a)', ' record type=f,length=(20) ', 0 , /* strg */ ret_code, input_proc, , /* data name prefix */ 'AP', /* msg level */ 'xxxx' /* sort method */); put skip list('result code is ',ret_code); /* display output file of above */ put skip(2) list('Contents of SORTOUT :-'); open file(chkdata) record title('SORTOUT'); eof = '0'b; on endfile(chkdata) eof='1'b; read file(chkdata) into(rec); do while(^eof); put skip list(rec); read file(chkdata) into(rec); end; close file(chkdata); revert endfile(chkdata); put skip(2) list('Calling plisrtc ---------------------------->'); call plisrtc(' sort fields=(1,10,ch,a) ', ' record type=f,length=(20) ', 0 , /* strg */ ret_code, output_proc, 'SRT1', /* data name prefix */ 'AP', /* msg level */ 'xxxx' /* sort method */); put skip list('result code is ',ret_code); put skip(2) list('Calling plisrtd ---------------------------->'); call plisrtd(' sort fields=(1,10,ch,a),skiprec=3 ', ' record type=f,length=(20) ', 0 , /* strg */ ret_code, input_proc, output_proc, , /* data name prefix */ 'AP', /* msg level */ 'xxxx' /* sort method */); put skip list('result code is ',ret_code); /* reset the PL/1 return code */ call pliretc(0); put skip(2) list('Plisrt1 processing completed'); input_proc: procedure returns(char(20)); dcl x char(20); dcl cnt fixed bin(31) static internal initial(0); dcl rec(1:5) char(20) static internal initial ( 'abc2', 'abc4', 'abc1', 'abc6', 'abc3'); cnt = cnt + 1; if cnt <= 5 then do; x=rec(cnt); call pliretc(12); end; else do; x = ''; call pliretc(8); /* no more */ cnt = 0; end; return(x); end input_proc; output_proc: procedure(y); dcl y char(*); put skip list(y); call pliretc(4); /* ready for more */ end output_proc; end plisrt1;
例 2
test: proc options(main); /* Test of SORT Bif using a indexed file as input. /* The input file is 1st created by this program prior to the sort. */ /* /* How to compile/link /* /* mfplx srt2.pl1 -defext -cisam */ /* Output of this program: /* /* Creating a indexed file with following records: /* /* Calling plisrtc --------------------------------------- /* Sorting on 2nd column ASCENDING, 1st column DECENDING /* Boston abc /* Albany ccc /* Westboro xyz /* Milford xyz /* Acton xyz /* /**/ dcl plisrtd builtin; declare ret_code fixed bin(31); declare (input_proc,output_proc) entry; dcl SORTIN direct env(vsam keylength(8) keyloc (5) recsize(50)); dcl rec char(50); %replace KEY2 by 40; /* be sure to change other references */ %replace KEY2_LEN by 3; /* be sure to change other references */ put skip list('Creating a indexed file with following records:'); open file(SORTIN) output; rec = ' '; substr(rec,KEY2,KEY2_LEN) = 'ccc'; write file(SORTIN) from(rec) keyfrom('Albany'); rec = ' '; substr(rec,KEY2,KEY2_LEN) = 'xyz'; write file(SORTIN) from(rec) keyfrom('Acton'); rec = ' '; substr(rec,KEY2,KEY2_LEN) = 'abc'; write file(SORTIN) from(rec) keyfrom('Boston'); rec = ' '; substr(rec,KEY2,KEY2_LEN) = 'xyz'; write file(SORTIN) from(rec) keyfrom('Westboro'); rec = ' '; substr(rec,KEY2,KEY2_LEN) = 'xyz'; write file(SORTIN) from(rec) keyfrom('Milford'); close file(SORTIN); put skip; put skip list('Calling plisrtc ---------------------------------------'); put skip list('Sorting on 2nd column ASCENDING, 1st column DECENDING'); call plisrtc(' sort fields=(40,3,ch,a,5,8,ch,d) ', ' record type=f,length(50),indexed ', 0 , /* strg */ ret_code, /* result status */ output_proc, , /* data name prefix */ 'AP', /* msg level */ 'xxxx' /* sort method */); put skip list('result code is ',ret_code); end test; output_proc: procedure(x); dcl x char(*); put skip list(x); call pliretc(4); /* ready for more */ end output_proc;
説明
入力レコードは、パラメーターの指定に従ってソートされ、出力ファイルに書き込まれるか出力プロシージャに渡されます。
入力プロシージャまたは出力プロシージャを使用する場合、このプロシージャは、ソートに関連するレコードごとに 1 回、ソート サブルーチンによって繰り返し呼び出されます。そのため、プロシージャは一度に 1 つのレコードを処理するように記述する必要があります。これらのプロシージャは通常の PL/I プロシージャであるため、すべての PL/I 言語規則が適用されます。含まれている AUTOMATIC 変数は、プロシージャが呼び出されるごとに再初期化され、割り当てられた BASED 変数または CONTROLLED 変数は、プロシージャが戻る際に解放されます。
入力プロシージャは次の形式にする必要があります。
出力プロシージャは次の形式にする必要があります。
出力プロシージャで、異常終了するようにソート ルーチンに指示するには、CALL PLI RETC(16) を使用します。