JCL - Xử lý có điều kiện

Hệ thống Nhập việc sử dụng hai cách tiếp cận để thực hiện xử lý có điều kiện trong JCL. Khi một công việc hoàn thành, một mã trả về được đặt dựa trên trạng thái thực hiện. Mã trả về có thể là một số từ 0 (thực hiện thành công) đến 4095 (khác 0 hiển thị điều kiện lỗi). Các giá trị quy ước phổ biến nhất là:

  • 0 = Bình thường - tất cả đều OK

  • 4 = Cảnh báo - lỗi hoặc vấn đề nhỏ.

  • 8 = Lỗi - lỗi hoặc vấn đề nghiêm trọng.

  • 12 = Lỗi nghiêm trọng - lỗi hoặc vấn đề lớn, kết quả không được tin cậy.

  • 16 = Lỗi thiết bị đầu cuối - vấn đề rất nghiêm trọng, không sử dụng kết quả.

Việc thực hiện bước công việc có thể được kiểm soát dựa trên mã trả về của (các) bước trước đó bằng cách sử dụng COND tham số và IF-THEN-ELSE cấu trúc, đã được giải thích trong hướng dẫn này.

Tham số COND

A CONDtham số có thể được mã hóa trong câu lệnh JOB hoặc EXEC của JCL. Nó là một bài kiểm tra trên mã trả về của các bước công việc trước đó. Nếu kiểm tra được đánh giá là đúng, thì việc thực hiện bước công việc hiện tại sẽ bị bỏ qua. Bỏ qua chỉ là bỏ sót bước công việc chứ không phải là chấm dứt bất thường. Có thể có nhiều nhất tám điều kiện được kết hợp trong một bài kiểm tra.

Cú pháp

Sau đây là cú pháp cơ bản của Tham số JCL COND:

COND=(rc,logical-operator)
or
COND=(rc,logical-operator,stepname)
or
COND=EVEN
or 
COND=ONLY

Đây là mô tả của các tham số được sử dụng:

  • rc : Đây là mã trả lại

  • logical-operator : Đây có thể là GT (Lớn hơn), GE (Lớn hơn hoặc Bằng), EQ (Bằng), LT (Nhỏ hơn), LE (Nhỏ hơn hoặc Bằng) hoặc NE (Không bằng).

  • stepname : Đây là bước công việc có mã trả về được sử dụng trong bài kiểm tra.

Hai điều kiện cuối cùng (a) COND = EVEN và (b) COND = ONLY, đã được giải thích bên dưới trong hướng dẫn này.

COND có thể được mã hóa bên trong câu lệnh JOB hoặc câu lệnh EXEC và trong cả hai trường hợp, nó hoạt động khác nhau như được giải thích bên dưới:

COND bên trong câu lệnh JOB

Khi COND được mã hóa trong câu lệnh JOB, điều kiện được kiểm tra cho mọi bước công việc. Khi điều kiện là đúng ở bất kỳ bước công việc cụ thể nào, nó sẽ bị bỏ qua cùng với các bước công việc theo sau nó. Sau đây là một ví dụ:

//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID,COND=(5,LE)
//*
//STEP10 EXEC PGM=FIRSTP  
//* STEP10 executes without any test being performed.

//STEP20 EXEC PGM=SECONDP 
//* STEP20 is bypassed, if RC of STEP10 is 5 or above. //* Say STEP10 ends with RC4 and hence test is false. //* So STEP20 executes and lets say it ends with RC16.

//STEP30 EXEC PGM=SORT
//* STEP30 is bypassed since 5 <= 16.

COND bên trong câu lệnh EXEC

Khi COND được mã hóa trong câu lệnh EXEC của một bước công việc và được cho là đúng, chỉ bước công việc đó bị bỏ qua và việc thực hiện được tiếp tục từ bước công việc tiếp theo.

//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01 EXEC PGM=SORT
//* Assuming STP01 ends with RC0.

//STP02 EXEC PGM=MYCOBB,COND=(0,EQ,STP01)
//* In STP02, condition evaluates to TRUE and step bypassed.

//STP03 EXEC PGM=IEBGENER,COND=((10,LT,STP01),(10,GT,STP02))
//* In STP03, first condition fails and hence STP03 executes. //* Since STP02 is bypassed, the condition (10,GT,STP02) in //* STP03 is not tested.

COND = EVEN

Khi COND = EVEN được mã hóa, bước công việc hiện tại được thực hiện, ngay cả khi bất kỳ bước nào trước đó kết thúc bất thường. Nếu bất kỳ điều kiện RC nào khác được mã hóa cùng với COND = EVEN, thì bước công việc sẽ thực hiện nếu không có điều kiện RC nào là đúng.

//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01 EXEC PGM=SORT
//* Assuming STP01 ends with RC0.

//STP02 EXEC PGM=MYCOBB,COND=(0,EQ,STP01)
//* In STP02, condition evaluates to TRUE and step bypassed.

//STP03 EXEC PGM=IEBGENER,COND=((10,LT,STP01),EVEN)
//* In STP03, condition (10,LT,STP01) evaluates to true, //* hence the step is bypassed.

COND = CHỈ

Khi COND = ONLY được mã hóa, bước công việc hiện tại được thực hiện, chỉ khi bất kỳ bước nào trước đó kết thúc bất thường. Nếu bất kỳ điều kiện RC nào khác được mã hóa cùng với COND = ONLY, thì bước công việc sẽ thực hiện nếu không có điều kiện RC nào là đúng và bất kỳ bước công việc nào trước đó không thành công bất thường.

//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01 EXEC PGM=SORT
//* Assuming STP01 ends with RC0.

//STP02 EXEC PGM=MYCOBB,COND=(4,EQ,STP01)
//* In STP02, condition evaluates to FALSE, step is executed //* and assume the step abends.

//STP03 EXEC PGM=IEBGENER,COND=((0,EQ,STP01),ONLY)
//* In STP03, though the STP02 abends, the condition //* (0,EQ,STP01) is met. Hence STP03 is bypassed.

Cấu trúc IF-THEN-ELSE

Một cách tiếp cận khác để kiểm soát quá trình xử lý công việc là sử dụng các cấu trúc IF-THEN-ELSE. Điều này mang lại sự linh hoạt hơn và cách xử lý có điều kiện thân thiện với người dùng.

Cú pháp

Sau đây là cú pháp cơ bản của Cấu trúc JCL IF-THEN-ELSE:

//name IF condition THEN
list of statements //* action to be taken when condition is true
//name ELSE 
list of statements //* action to be taken when condition is false
//name ENDIF

Sau đây là mô tả các thuật ngữ được sử dụng trong Cấu trúc IF-THEN-ELSE ở trên:

  • name : Đây là tùy chọn và tên có thể có từ 1 đến 8 ký tự chữ và số bắt đầu bằng bảng chữ cái, #, $ hoặc @.

  • Condition : Một điều kiện sẽ có định dạng: KEYWORD OPERATOR VALUE, Ở đâu KEYWORDScó thể là RC (Mã trả về), ABENDCC (Mã hoàn thành của hệ thống hoặc người dùng), ABEND, RUN (thực thi từng bước). AnOPERATOR có thể là toán tử logic (AND (&), OR (|)) hoặc toán tử quan hệ (<, <=,>,> =, <>).

Thí dụ

Sau đây là một ví dụ đơn giản cho thấy cách sử dụng IF-THEN-ELSE:

//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//PRC1   PROC
//PST1	   EXEC PGM=SORT
//PST2	   EXEC PGM=IEBGENER
//       PEND
//STP01  EXEC PGM=SORT 
//IF1    IF STP01.RC = 0 THEN
//STP02     EXEC PGM=MYCOBB1,PARM=123
//       ENDIF
//IF2    IF STP01.RUN THEN
//STP03a    EXEC PGM=IEBGENER
//STP03b    EXEC PGM=SORT
//       ENDIF
//IF3    IF STP03b.!ABEND THEN
//STP04     EXEC PGM=MYCOBB1,PARM=456
//       ELSE
//       ENDIF
//IF4    IF (STP01.RC = 0 & STP02.RC <= 4) THEN
//STP05     EXEC PROC=PRC1
//       ENDIF
//IF5    IF STP05.PRC1.PST1.ABEND THEN
//STP06     EXEC PGM=MYABD
//       ELSE
//STP07     EXEC PGM=SORT
//       ENDIF

Chúng ta hãy thử nhìn vào chương trình trên để hiểu chi tiết hơn:

  • Mã trả lại của STP01 được kiểm tra trong IF1. Nếu nó là 0, thì STP02 được thực thi. Ngược lại, quá trình xử lý chuyển đến câu lệnh IF tiếp theo (IF2).

  • Trong IF2, Nếu STP01 đã bắt đầu thực thi, thì STP03a và STP03b sẽ được thực thi.

  • Trong IF3, Nếu STP03b không TRÊN, thì STP04 được thực thi. Trong ELSE, không có câu lệnh nào. Nó được gọi là một câu lệnh NULL ELSE.

  • Trong IF4, nếu STP01.RC = 0 và STP02.RC <= 4 là TRUE, thì STP05 được thực thi.

  • Trong IF5, nếu bước proc PST1 trong PROC PRC1 trong bước công việc STP05 TRÊN, thì STP06 được thực thi. STP07 khác được thực thi.

  • Nếu IF4 đánh giá sai, thì STP05 không được thực thi. Trong trường hợp đó, IF5 không được kiểm tra và các bước STP06, STP07 không được thực hiện.

IF-THEN-ELSE sẽ không được thực thi trong trường hợp kết thúc công việc bất thường chẳng hạn như người dùng hủy công việc, hết thời gian công việc hoặc tập dữ liệu được tham chiếu ngược đến một bước bị bỏ qua.

Đặt điểm kiểm tra

Bạn có thể đặt tập dữ liệu điểm kiểm tra bên trong chương trình JCL của mình bằng cách sử dụng SYSCKEOV, đó là một tuyên bố DD.

A CHKPTlà tham số được mã hóa cho bộ dữ liệu QSAM nhiều khối lượng trong một câu lệnh DD. Khi một CHKPT được mã hóa là CHKPT = EOV, một điểm kiểm tra được ghi vào tập dữ liệu được chỉ định trong câu lệnh SYSCKEOV ở cuối mỗi tập của tập dữ liệu nhiều tập đầu vào / đầu ra.

//CHKSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01     EXEC PGM=MYCOBB
//SYSCKEOV  DD DSNAME=SAMPLE.CHK,DISP=MOD
//IN1       DD DSN=SAMPLE.IN,DISP=SHR
//OUT1      DD DSN=SAMPLE.OUT,DISP=(,CATLG,CATLG)
//          CHKPT=EOV,LRECL=80,RECFM=FB

Trong ví dụ trên, một điểm kiểm tra được viết trong tập dữ liệu SAMPLE.CHK ở cuối mỗi tập của tập dữ liệu đầu ra SAMPLE.OUT.

Khởi động lại quá trình xử lý

Bạn có thể khởi động lại quá trình xử lý ether bằng cách tự động bằng cách sử dụng RD parameter hoặc hướng dẫn sử dụng RESTART parameter.

RD parameter được mã hóa trong câu lệnh JOB hoặc EXEC và nó giúp khởi động lại JOB / STEP tự động và có thể giữ một trong bốn giá trị: R, RNC, NR hoặc NC.

  • RD=R cho phép tự động khởi động lại và xem xét điểm kiểm tra được mã hóa trong tham số CHKPT của câu lệnh DD.

  • RD=RNC cho phép tự động khởi động lại, nhưng ghi đè (bỏ qua) tham số CHKPT.

  • RD=NRchỉ định rằng không thể tự động khởi động lại công việc / bước. Nhưng khi nó được khởi động lại theo cách thủ công bằng tham số RESTART, thì tham số CHKPT (nếu có) sẽ được xem xét.

  • RD=NC không cho phép khởi động lại tự động và xử lý điểm kiểm tra.

Nếu có yêu cầu khởi động lại tự động chỉ cho các mã abend cụ thể, thì nó có thể được chỉ định trong SCHEDxx thành viên của thư viện hệ thống IBM parmlib.

RESTART parameterđược mã hóa trong câu lệnh JOB hoặc EXEC và nó giúp khởi động lại thủ công JOB / STEP sau khi công việc thất bại. RESTART có thể được đi kèm với checkid, là checkpoint được viết trong tập dữ liệu được mã hóa trong câu lệnh SYSCKEOV DD. Khi một checkid được mã hóa, câu lệnh SYSCHK DD phải được mã hóa để tham chiếu đến tập dữ liệu điểm kiểm tra sau câu lệnh JOBLIB (nếu có), sau câu lệnh JOB.

//CHKSAMP JOB CLASS=6,NOTIFY=&SYSUID,RESTART=(STP01,chk5)
//*
//SYSCHK    DD DSN=SAMPLE.CHK,DISP=OLD
//STP01     EXEC PGM=MYCOBB
//*SYSCKEOV	DD DSNAME=SAMPLE.CHK,DISP=MOD
//IN1       DD DSN=SAMPLE.IN,DISP=SHR
//OUT1      DD DSN=SAMPLE.OUT,DISP=(,CATLG,CATLG)
//          CHKPT=EOV,LRECL=80,RECFM=FB

Trong ví dụ trên, chk5 là checkid, tức là STP01 được khởi động lại tại checkpoint5. Xin lưu ý rằng một câu lệnh SYSCHK được thêm vào và câu lệnh SYSCKEOV được nhận xét trong chương trình trước được giải thích trong phần Setting Checkpoint.