Rational Developer for System z
Enterprise PL/I for z/OS, Version 3.8, プログラミング・ガイド

可変長レコードのソートの例

図 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)
 //*

Terms of use | Feedback

This information center is powered by Eclipse technology. (http://www.eclipse.org)