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 實現相同的功能。

廣告

© . All rights reserved.