図 54. 入出力処理ルーチンを使った可変長レコードのソート
//OPT14#11 JOB ...
//STEP1 EXEC IBMZCBG
//PLI.SYSIN DD *
/* PL/I EXAMPLE USING PLISRTD TO SORT VARIABLE-LENGTH
RECORDS */
EX1306: PROC OPTIONS(MAIN);
DCL RETURN_CODE FIXED BIN(31,0);
CALL PLISRTD (' SORT FIELDS=(11,14,CH,A) ',
' RECORD TYPE=V,LENGTH=(84,,,24,44) ',
/*NOTE THAT LENGTH IS MAX AND INCLUDES
4 BYTE LENGTH PREFIX*/
1048576
RETURN_CODE,
PUTIN,
PUTOUT);
SELECT(RETURN_CODE);
WHEN(0) PUT SKIP EDIT (
'SORT COMPLETE RETURN_CODE 0') (A);
WHEN(16) PUT SKIP EDIT (
'SORT FAILED, RETURN_CODE 16') (A);
WHEN(20) PUT SKIP EDIT (
'SORT MESSAGE DATASET MISSING ') (A);
OTHER PUT SKIP EDIT (
'INVALID RETURN_CODE = ', RETURN_CODE)
(A,F(2));
END /* SELECT */;
CALL PLIRETC(RETURN_CODE);
/*SET PL/I RETURN CODE TO REFLECT SUCCESS OF SORT*/
PUTIN: PROC RETURNS (CHAR(80) VARYING);
/*OUTPUT HANDLING ROUTINE*/
/*NOTE THAT VARYING MUST BE USED ON RETURNS ATTRIBUTE
WHEN USING VARYING LENGTH RECORDS*/
DCL STRING CHAR(80) VAR;
ON ENDFILE(SYSIN) BEGIN;
PUT SKIP EDIT ('END OF INPUT')(A);
CALL PLIRETC(8);
STRING = '';
GOTO ENDPUT;
END;
GET EDIT(STRING)(A(80));
I=INDEX(STRING||' ',' ')-1;/*RESET LENGTH OF THE*/
STRING = SUBSTR(STRING,1,I); /* STRING FROM 80 TO */
/* LENGTH OF TEXT IN */
/* EACH INPUT RECORD.*/
PUT SKIP EDIT(I,STRING) (F(2),X(3),A);
CALL PLIRETC(12);
ENDPUT: RETURN(STRING);
END;
PUTOUT:PROC(STRING);
/*OUTPUT HANDLING ROUTINE OUTPUT SORTED RECORDS*/
DCL STRING CHAR (*);
/*NOTE THAT FOR VARYING RECORDS THE STRING
PARAMETER FOR THE OUTPUT-HANDLING ROUTINE
SHOULD BE DECLARED ADJUSTABLE BUT CANNOT BE
DECLARED VARYING*/
PUT SKIP EDIT(STRING)(A); /*PRINT THE SORTED DATA*/
CALL PLIRETC(4);
END; /*ENDS PUTOUT*/
END;
/*
//GO.SYSIN DD *
003329HOOKER S.W. RIVERDALE, SATCHWELL LANE, BACONSFIELD
002886BOOKER R.R. ROTORUA, LINKEDGE LANE, TOBLEY
003077ROOKER & SON, LITTLETON NURSERIES, SHOLTSPAR
059334HOOK E.H. 109 ELMTREE ROAD, GANNET PARK, NORTHAMPTON
073872HOME TAVERN, WESTLEIGH
000931FOREST, IVER, BUCKS
/*
//GO.SYSPRINT DD SYSOUT=A
//GO.SORTOUT DD SYSOUT=A
//GO.SYSOUT DD SYSOUT=A
//GO.SORTWK01 DD UNIT=SYSDA,SPACE=(CYL,1)
//GO.SORTWK02 DD UNIT=SYSDA,SPACE=(CYL,1)
//*