JCL - การประมวลผลตามเงื่อนไข
ระบบป้อนงานใช้สองวิธีในการประมวลผลแบบมีเงื่อนไขใน JCL เมื่องานเสร็จสิ้นรหัสส่งคืนจะถูกตั้งค่าตามสถานะของการดำเนินการ รหัสส่งคืนอาจเป็นตัวเลขระหว่าง 0 (การดำเนินการสำเร็จ) ถึง 4095 (ที่ไม่ใช่ศูนย์แสดงเงื่อนไขข้อผิดพลาด) ค่าทั่วไปที่พบบ่อยที่สุดคือ:
0 = ปกติ - ตกลงทั้งหมด
4 = คำเตือน - ข้อผิดพลาดหรือปัญหาเล็กน้อย
8 = ข้อผิดพลาด - ข้อผิดพลาดหรือปัญหาที่สำคัญ
12 = ข้อผิดพลาดที่รุนแรง - ข้อผิดพลาดหรือปัญหาที่สำคัญผลลัพธ์ไม่ควรเชื่อถือได้
16 = Terminal error - ปัญหาร้ายแรงมากอย่าใช้ผลลัพธ์
การดำเนินการขั้นตอนงานสามารถควบคุมได้ตามรหัสส่งคืนของขั้นตอนก่อนหน้าโดยใช้ COND พารามิเตอร์และ IF-THEN-ELSE สร้างซึ่งได้อธิบายไว้ในบทช่วยสอนนี้
พารามิเตอร์ COND
ก CONDสามารถเข้ารหัสพารามิเตอร์ในคำสั่ง JOB หรือ EXEC ของ JCL เป็นการทดสอบโค้ดส่งคืนของขั้นตอนงานก่อนหน้านี้ หากการทดสอบได้รับการประเมินว่าเป็นจริงการดำเนินการขั้นตอนงานปัจจุบันจะถูกข้าม การข้ามเป็นเพียงการละเว้นขั้นตอนงานและไม่ใช่การเลิกจ้างที่ผิดปกติ สามารถมีเงื่อนไขได้สูงสุดแปดเงื่อนไขในการทดสอบเดียว
ไวยากรณ์
ต่อไปนี้เป็นไวยากรณ์พื้นฐานของพารามิเตอร์ JCL COND:
COND=(rc,logical-operator)
or
COND=(rc,logical-operator,stepname)
or
COND=EVEN
or
COND=ONLY
นี่คือคำอธิบายของพารามิเตอร์ที่ใช้:
rc : นี่คือรหัสส่งคืน
logical-operator : อาจเป็น GT (มากกว่า), GE (มากกว่าหรือเท่ากับ), EQ (เท่ากับ), LT (น้อยกว่า), LE (น้อยกว่าหรือเท่ากับ) หรือ NE (ไม่เท่ากับ)
stepname : นี่คือขั้นตอนงานที่ใช้รหัสส่งคืนในการทดสอบ
สองเงื่อนไขสุดท้าย (a) COND = แม้และ (b) COND = เท่านั้นได้อธิบายไว้ด้านล่างในบทช่วยสอนนี้
COND สามารถเข้ารหัสได้ทั้งในคำสั่ง JOB หรือคำสั่ง EXEC และในทั้งสองกรณีจะทำงานแตกต่างกันดังที่อธิบายไว้ด้านล่าง:
COND ภายในคำสั่ง JOB
เมื่อมีการเข้ารหัส COND ในคำสั่ง JOB เงื่อนไขจะถูกทดสอบสำหรับทุกขั้นตอนของงาน เมื่อเงื่อนไขเป็นจริงในขั้นตอนงานใดขั้นตอนหนึ่งระบบจะข้ามไปพร้อมกับขั้นตอนงานที่ตามมา ต่อไปนี้เป็นตัวอย่าง:
//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 ภายในคำสั่ง EXEC
เมื่อ COND ถูกเข้ารหัสในคำสั่ง EXEC ของขั้นตอนงานและพบว่าเป็นจริงขั้นตอนงานนั้นเท่านั้นที่จะถูกข้ามและการดำเนินการจะดำเนินต่อจากขั้นตอนงานถัดไป
//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 = แม้
เมื่อมีการเข้ารหัส COND = EVEN ขั้นตอนงานปัจจุบันจะถูกดำเนินการแม้ว่าขั้นตอนก่อนหน้านี้จะยุติลงอย่างผิดปกติก็ตาม หากมีการเข้ารหัสเงื่อนไข RC อื่น ๆ พร้อมกับ COND = EVEN ขั้นตอนงานจะดำเนินการหากไม่มีเงื่อนไข RC ใดเป็นจริง
//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 = เท่านั้น
เมื่อมีการเข้ารหัส COND = ON เท่านั้นขั้นตอนงานปัจจุบันจะถูกดำเนินการเฉพาะเมื่อขั้นตอนก่อนหน้านี้ยุติอย่างผิดปกติ หากมีการเข้ารหัสเงื่อนไข RC อื่น ๆ พร้อมด้วย COND = ONLY ขั้นตอนงานจะดำเนินการหากไม่มีเงื่อนไข RC ใดเป็นจริงและขั้นตอนงานก่อนหน้านี้ล้มเหลวอย่างผิดปกติ
//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.
IF-THEN-ELSE สร้าง
อีกวิธีหนึ่งในการควบคุมการประมวลผลงานคือการใช้โครงสร้าง IF-THEN-ELSE สิ่งนี้ให้ความยืดหยุ่นมากขึ้นและวิธีการประมวลผลตามเงื่อนไขที่เป็นมิตรกับผู้ใช้
ไวยากรณ์
ต่อไปนี้เป็นไวยากรณ์พื้นฐานของ JCL IF-THEN-ELSE Construct:
//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
ต่อไปนี้เป็นคำอธิบายของข้อกำหนดที่ใช้ใน IF-THEN-ELSE Construct ด้านบน:
name : นี่เป็นทางเลือกและชื่อสามารถมีอักขระที่เป็นตัวเลขและตัวอักษรได้ 1 ถึง 8 ตัวโดยขึ้นต้นด้วยตัวอักษร #, $ หรือ @
Condition : เงื่อนไขจะมีรูปแบบ: KEYWORD OPERATOR VALUE, ที่ไหน KEYWORDSสามารถเป็น RC (Return Code), ABENDCC (System หรือรหัสการเติมข้อมูลของผู้ใช้), ABEND, RUN (ขั้นตอนที่เริ่มดำเนินการ) อันOPERATOR สามารถเป็นตัวดำเนินการเชิงตรรกะ (AND (&), OR (|)) หรือตัวดำเนินการเชิงสัมพันธ์ (<, <=,>,> =, <>)
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างง่ายๆที่แสดงการใช้ 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
ลองดูโปรแกรมด้านบนเพื่อทำความเข้าใจในรายละเอียดเพิ่มเติมเล็กน้อย:
รหัสส่งคืนของ STP01 ถูกทดสอบใน IF1 ถ้าเป็น 0 แสดงว่า STP02 ถูกเรียกใช้งาน มิฉะนั้นการประมวลผลจะไปที่คำสั่ง IF ถัดไป (IF2)
ใน IF2 ถ้า STP01 เริ่มดำเนินการแล้ว STP03a และ STP03b จะถูกเรียกใช้งาน
ใน IF3 ถ้า STP03b ไม่ ABEND แสดงว่า STP04 จะดำเนินการ ใน ELSE ไม่มีงบ เรียกว่าคำสั่ง NULL ELSE
ใน IF4 ถ้า STP01.RC = 0 และ STP02.RC <= 4 เป็น TRUE จะดำเนินการ STP05
ใน IF5 ถ้า PST1 ขั้นตอน proc ใน PROC PRC1 ในขั้นตอนงาน STP05 ABEND จะดำเนินการ STP06 อื่น STP07 ถูกเรียกใช้งาน
หาก IF4 ประเมินว่าเป็นเท็จ STP05 จะไม่ถูกดำเนินการ ในกรณีนั้นจะไม่มีการทดสอบ IF5 และขั้นตอน STP06, STP07 จะไม่ถูกดำเนินการ
IF-THEN-ELSE จะไม่ถูกดำเนินการในกรณีที่มีการยกเลิกงานอย่างผิดปกติเช่นผู้ใช้ยกเลิกงานหมดเวลางานหรือชุดข้อมูลถูกอ้างอิงย้อนหลังไปยังขั้นตอนที่ข้ามไป
การตั้งค่าจุดตรวจ
คุณสามารถตั้งค่าชุดข้อมูลจุดตรวจภายในโปรแกรม JCL ของคุณโดยใช้ SYSCKEOV, ซึ่งเป็นคำสั่ง DD
ก CHKPTคือพารามิเตอร์ที่เข้ารหัสสำหรับชุดข้อมูล QSAM แบบหลายวอลุ่มในคำสั่ง DD เมื่อ CHKPT ถูกเข้ารหัสเป็น CHKPT = EOV จุดตรวจจะถูกเขียนไปยังชุดข้อมูลที่ระบุในคำสั่ง SYSCKEOV ที่ส่วนท้ายของแต่ละโวลุ่มของชุดข้อมูลหลายโวลุ่มอินพุต / เอาต์พุต
//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
ในตัวอย่างข้างต้นจุดตรวจจะถูกเขียนในชุดข้อมูล SAMPLE.CHK ที่ส่วนท้ายของแต่ละโวลุ่มของชุดข้อมูลเอาต์พุต SAMPLE.OUT
เริ่มการประมวลผลใหม่
คุณสามารถรีสตาร์ทการประมวลผลอีเธอร์โดยใช้วิธีอัตโนมัติโดยใช้ไฟล์ RD parameter หรือคู่มือโดยใช้ RESTART parameter.
RD parameter ถูกเข้ารหัสในคำสั่ง JOB หรือ EXEC และช่วยในการรีสตาร์ท JOB / STEP อัตโนมัติและสามารถเก็บค่าหนึ่งในสี่ค่า: R, RNC, NR หรือ NC
RD=R อนุญาตให้รีสตาร์ทอัตโนมัติและพิจารณาจุดตรวจที่เข้ารหัสในพารามิเตอร์ CHKPT ของคำสั่ง DD
RD=RNC อนุญาตให้รีสตาร์ทอัตโนมัติ แต่แทนที่ (ละเว้น) พารามิเตอร์ CHKPT
RD=NRระบุว่างาน / ขั้นตอนไม่สามารถเริ่มต้นใหม่โดยอัตโนมัติ แต่เมื่อรีสตาร์ทด้วยตนเองโดยใช้พารามิเตอร์ RESTART พารามิเตอร์ CHKPT (ถ้ามี) จะได้รับการพิจารณา
RD=NC ปิดการใช้งานการรีสตาร์ทอัตโนมัติและการประมวลผลจุดตรวจ
หากมีข้อกำหนดในการรีสตาร์ทอัตโนมัติสำหรับรหัสหยุดเฉพาะเท่านั้นก็สามารถระบุได้ในไฟล์ SCHEDxx สมาชิกของไลบรารี parmlib ระบบ IBM
RESTART parameterถูกเข้ารหัสในคำสั่ง JOB หรือ EXEC และช่วยในการรีสตาร์ท JOB / STEP ด้วยตนเองหลังจากงานล้มเหลว RESTART สามารถมาพร้อมกับ checkid ซึ่งเป็นจุดตรวจที่เขียนในชุดข้อมูลที่เข้ารหัสในคำสั่ง SYSCKEOV DD เมื่อมีการเข้ารหัส checkid คำสั่ง SYSCHK DD ควรถูกเข้ารหัสเพื่ออ้างอิงชุดข้อมูลจุดตรวจหลังจากคำสั่ง JOBLIB (ถ้ามี) อื่น ๆ หลังจากคำสั่ง 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
ในตัวอย่างข้างต้น chk5 คือ checkid กล่าวคือ STP01 ถูกรีสตาร์ทที่จุดตรวจ 5 โปรดทราบว่ามีการเพิ่มคำสั่ง SYSCHK และคำสั่ง SYSCKEOV ถูกแสดงความคิดเห็นในโปรแกรมก่อนหน้านี้ที่อธิบายไว้ในส่วนการตั้งค่าจุดตรวจ