- JCL 教程
- JCL 首頁
- JCL - 概述
- JCL - 環境
- JCL - JOB 語句
- JCL - EXEC 語句
- JCL - DD 語句
- JCL - 基本庫
- JCL - 過程
- JCL - 條件處理
- JCL - 定義資料集
- JCL - 輸入/輸出方法
- JCL - 執行 COBOL 程式
- JCL - 實用程式
- JCL - 基本排序技巧
- JCL 有用資源
- JCL - 問答
- JCL - 快速指南
- JCL - 有用資源
- JCL - 討論
JCL - 基本排序技巧
下面說明了企業世界中可以使用實用程式實現的日常應用需求。
1. 一個檔案有 100 條記錄。需要將前 10 條記錄寫入輸出檔案。
//JSTEP020 EXEC PGM=ICETOOL //TOOLMSG DD SYSOUT=* //DFSMSG DD SYSOUT=* //IN1 DD DSN=MYDATA.URMI.STOPAFT,DISP=SHR //OUT1 DD SYSOUT=* //TOOLIN DD * COPY FROM(IN1) TO(OUT1) USING(CTL1) /* //CTL1CNTL DD * OPTION STOPAFT=10 /*
STOPAFT 選項將在讀取第 10 條記錄後停止讀取輸入檔案並終止程式。因此,10 條記錄被寫入輸出。
2. 輸入檔案對同一員工編號有一條或多條記錄。將唯一記錄寫入輸出。
//STEP010 EXEC PGM=SORT //SYSOUT DD SYSOUT=* //SORTIN DD DSN=MYDATA.URMI.DUPIN,DISP=SHR //SORTOUT DD SYSOUT=* //SYSIN DD * SORT FIELDS=(1,15,ZD,A) SUM FIELDS=NONE /*
SUM FIELDS=NONE 刪除在 SORT FIELDS 中指定的欄位上的重複項。在上面的示例中,員工編號位於欄位位置 1,15。輸出檔案將包含按升序排序的唯一員工編號。
3. 覆蓋輸入記錄內容。
//JSTEP010 EXEC PGM=SORT //SORTIN DD DSN= MYDATA.URMI.SAMPLE.MAIN,DISP=SHR //SORTOUT DD SYSOUT=* //SYSPRINT DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSIN DD * OPTION COPY INREC OVERLAY=(47:1,6) /*
在輸入檔案中,位置 1,6 中的內容被覆蓋到位置 47,6,然後複製到輸出檔案。為了在複製到輸出之前重寫輸入檔案中的資料,使用了 INREC OVERLAY 操作。
4. 向輸出檔案新增序列號。
//JSTEP010 EXEC PGM=SORT //SORTIN DD * data1 data2 data3 /* //SORTOUT DD SYSOUT=* //SYSPRINT DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSIN DD * OPTION COPY BUILD=(1:1,5,10:SEQNUM,4,ZD,START=1000,INCR=2) /*
輸出將是
data1 1000 data2 1002 data3 1004
在輸出的第 10 個位置新增 4 位序列號,從 1000 開始,每條記錄遞增 2。
5. 向輸出檔案新增頁首/頁尾。
//JSTEP010 EXEC PGM=SORT //SORTIN DD * data1 data2 data3 /* //SORTOUT DD SYSOUT=* //SYSPRINT DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSIN DD * SORT FIELDS=COPY OUTFIL REMOVECC, HEADER1=(1:C'HDR',10:X'020110131C'), TRAILER1=(1:C'TRL',TOT=(10,9,PD,TO=PD,LENGTH=9)) /*
輸出將是
HDR 20110131 data1 data2 data3 TRL 000000003
TOT 計算輸入檔案中的記錄數。HDR 和 TRL 作為頁首/頁尾的識別符號新增,它是使用者定義的,可以根據使用者的需求進行自定義。
6. 條件處理
//JSTEP010 EXEC PGM=SORT
//SORTIN DD *
data1select
data2
data3select
/*
//SORTOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSIN DD *
INREC IFTHEN=(WHEN=(6,1,CH,NE,C' '),BUILD=(1:1,15),
IFTHEN=(WHEN=(6,1,CH,EQ,C' '),BUILD=(1:1,5,7:C'EMPTY ')
OPTION COPY
/*
輸出將是
data1select data2 EMPTY data3select
根據檔案的第 6 個位置,輸出檔案的構建方式不同。如果第 6 個位置為空格,則將文字“EMPTY”附加到輸入記錄。否則,輸入記錄按原樣寫入輸出。
7. 備份檔案
//JSTEP001 EXEC PGM=IEBGENER //SYSPRINT DD SYSOUT=* //SYSIN DD * //SYSOUT DD SYSOUT=* //SORTOUT DD DUMMY //SYSUT1 DD DSN=MYDATA.URMI.ORIG,DISP=SHR //SYSUT2 DD DSN=MYDATA.URMI.BACKUP,DISP=(NEW,CATLG,DELETE), // DCB=*.SYSUT1,SPACE=(CYL,(50,1),RLSE)
IEBGENER 將 SYSUT1 中的檔案複製到 SYSUT2 中的檔案。請注意,SYSUT2 中的檔案採用與上述示例中 SYSUT1 相同的 DCB。
8. 檔案比較
//STEP010 EXEC PGM=SORT //MAIN DD * 1000 1001 1003 1005 //LOOKUP DD * 1000 1002 1003 //MATCH DD DSN=MYDATA.URMI.SAMPLE.MATCH,DISP=OLD //NOMATCH1 DD DSN=MYDATA.URMI.SAMPLE.NOMATCH1,DISP=OLD //NOMATCH2 DD DSN=MYDATA.URMI.SAMPLE.NOMATCH2,DISP=OLD //SYSOUT DD SYSOUT=* //SYSIN DD * JOINKEYS F1=MAIN,FIELDS=(1,4,A) JOINKEYS F2=LOOKUP,FIELDS=(1,4,A) JOIN UNPAIRED,F1,F2 REFORMAT FIELDS=(?,F1:1,4,F2:1,4) OPTION COPY OUTFIL FNAMES=MATCH,INCLUDE=(1,1,CH,EQ,C'B'),BUILD=(1:2,4) OUTFIL FNAMES=NOMATCH1,INCLUDE=(1,1,CH,EQ,C'1'),BUILD=(1:2,4) OUTFIL FNAMES=NOMATCH2,INCLUDE=(1,1,CH,EQ,C'2'),BUILD=(1:2,4) /*
JOINKEYS 指定比較兩個檔案的欄位。
REFORMAT FIELDS=? 將 'B'(匹配的記錄)、'1'(存在於檔案 1 中,但不存在於檔案 2 中)或 '2'(存在於檔案 2 中,但不存在於檔案 1 中)放在輸出構建的第 1 個位置。
JOIN UNPAIRED 對兩個檔案執行完全外部聯接。
輸出將是
MATCH File 1000 1003 NOMATCH1 File 1001 1005 NOMATCH2 File 1002
也可以使用 ICETOOL 實現相同的功能。
