JCL - ขั้นตอน

JCL Proceduresเป็นชุดคำสั่งภายใน JCL ที่จัดกลุ่มเข้าด้วยกันเพื่อทำหน้าที่เฉพาะ โดยปกติส่วนคงที่ของ JCL จะถูกเข้ารหัสในขั้นตอน ส่วนที่แตกต่างกันของงานถูกเข้ารหัสไว้ใน JCL

คุณสามารถใช้ขั้นตอนเพื่อให้เกิดการทำงานแบบขนานของโปรแกรมโดยใช้ไฟล์อินพุตหลายไฟล์ สามารถสร้าง JCL สำหรับไฟล์อินพุตแต่ละไฟล์และสามารถเรียกใช้โพรซีเดอร์เดียวพร้อมกันได้โดยส่งชื่อไฟล์อินพุตเป็นพารามิเตอร์สัญลักษณ์

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์พื้นฐานของการกำหนดโพรซีเดอร์ JCL:

//*
//Step-name EXEC procedure name

เนื้อหาของโพรซีเดอร์จะอยู่ใน JCL สำหรับโพรซีเดอร์ในสตรีม เนื้อหาจะถูกเก็บไว้ภายในสมาชิกอื่นของไลบรารีฐานสำหรับโพรซีเดอร์ที่ทำแค็ตตาล็อก บทนี้จะอธิบายขั้นตอนสองประเภทที่มีอยู่ใน JCL และสุดท้ายเราจะมาดูกันว่าเราสามารถซ้อนขั้นตอนต่างๆได้อย่างไร

ขั้นตอนการสตรีม

เมื่อโพรซีเดอร์ถูกเข้ารหัสภายในสมาชิก JCL เดียวกันจะเรียกว่า Instream Procedure ควรเริ่มต้นด้วยคำสั่ง PROC และลงท้ายด้วยคำสั่ง PEND

//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID
//*
//INSTPROC   PROC                //*START OF PROCEDURE
//PROC1		EXEC PGM=SORT
//SORTIN	DD DSN=&DSNAME,DISP=SHR
//SORTOUT	DD SYSOUT=*MYINCL
//SYSOUT	DD SYSOUT=*
//SYSIN		DD DSN=&DATAC LRECL=80
//           PEND               //*END OF PROCEDURE
//*
//STEP1      EXEC INSTPROC,DSNME=MYDATA.URMI.INPUT1,
//           DATAC=MYDATA.BASE.LIB1(DATA1)
//*
//STEP2      EXEC INSTPROC,DSNME=MYDATA.URMI.INPUT2
//           DATAC=MYDATA.BASE.LIB1(DATA1)
//*

ในตัวอย่างข้างต้นโพรซีเดอร์ INSTPROC ถูกเรียกใน STEP1 และ STEP2 โดยใช้ไฟล์อินพุตที่แตกต่างกัน พารามิเตอร์ DSNAME และ DATAC สามารถเข้ารหัสด้วยค่าที่แตกต่างกันในขณะที่เรียกโพรซีเดอร์และสิ่งเหล่านี้เรียกว่าsymbolic parameters. อินพุตที่แตกต่างกันไปยัง JCL เช่นชื่อไฟล์ดาต้าการ์ดค่า PARM ฯลฯ จะถูกส่งผ่านเป็นพารามิเตอร์สัญลักษณ์ไปยังโพรซีเดอร์

ในขณะที่เข้ารหัสพารามิเตอร์สัญลักษณ์ห้ามใช้ KEYWORDS, PARAMETERS หรือ SUB-PARAMETERS เป็นชื่อสัญลักษณ์ ตัวอย่าง: อย่าใช้ TIME = & TIME แต่ใช่คุณสามารถใช้ TIME = & TM ได้และถือว่าเป็นวิธีการเข้ารหัสสัญลักษณ์ที่ถูกต้อง

เรียกใช้พารามิเตอร์สัญลักษณ์ที่ผู้ใช้กำหนด JCL Symbols. มีสัญลักษณ์บางอย่างที่เรียกว่าsystem symbolsซึ่งใช้สำหรับการดำเนินการล็อกออนงาน สัญลักษณ์ระบบเดียวที่ใช้ในชุดงานโดยผู้ใช้ปกติคือ&SYSUID และใช้ในพารามิเตอร์ NOTIFY ในคำสั่ง JOB

ขั้นตอนการลงรายการบัญชี

เมื่อแยกโพรซีเดอร์ออกจาก JCL และเข้ารหัสในที่เก็บข้อมูลอื่นจะเรียกว่าไฟล์ Cataloged Procedure. คำสั่ง PROC ไม่จำเป็นต้องเขียนโค้ดในขั้นตอนการลงรายการบัญชี ต่อไปนี้เป็นตัวอย่างของ JCL ที่เรียกขั้นตอน CATLPROC:

//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID
//*
//STEP EXEC CATLPROC,PROG=CATPRC1,DSNME=MYDATA.URMI.INPUT
//          DATAC=MYDATA.BASE.LIB1(DATA1)

ที่นี่ขั้นตอน CATLPROC อยู่ในรายการ MYCOBOL.BASE.LIB1 PROG, DATAC และ DSNAME ถูกส่งผ่านเป็นพารามิเตอร์สัญลักษณ์ไปยังโพรซีเดอร์ CATLPROC

//CATLPROC PROC PROG=,BASELB=MYCOBOL.BASE.LIB1
//*
//PROC1     EXEC PGM=&PROG
//STEPLIB   DD DSN=&BASELB,DISP=SHR
//IN1       DD DSN=&DSNAME,DISP=SHR
//OUT1      DD SYSOUT=*
//SYSOUT    DD SYSOUT=*
//SYSIN     DD DSN=&DATAC
//*

ภายในขั้นตอนพารามิเตอร์สัญลักษณ์ PROG และ BASELB จะถูกเข้ารหัส โปรดทราบว่าพารามิเตอร์ PROG ภายในโพรซีเดอร์ถูกแทนที่ด้วยค่าใน JCL และด้วยเหตุนี้ PGM จึงรับค่า CATPRC1 ในระหว่างการดำเนินการ

ขั้นตอนที่ซ้อนกัน

การเรียกโพรซีเดอร์จากภายในโพรซีเดอร์เรียกว่า a nested procedure. ขั้นตอนสามารถซ้อนกันได้ถึง 15 ระดับ การซ้อนสามารถอยู่ในสตรีมหรือแค็ตตาล็อกได้อย่างสมบูรณ์ เราไม่สามารถเขียนโค้ดขั้นตอนในสตรีมได้

//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID
//*
//SETNM     SET DSNM1=INPUT1,DSNM2=OUTPUT1
//INSTPRC1  PROC               //* START OF PROCEDURE 1
//STEP1        EXEC PGM=SORT,DISP=SHR
//SORTIN       DD DSN=&DSNM1,DISP=SHR
//SORTOUT      DD DSN=&DSNM2,DISP=(,PASS)
//SYSOUT       DD SYSOUT=*
//SYSIN        DD DSN=&DATAC
//*
//STEP2        EXEC PROC=INSTPRC2,DSNM2=MYDATA.URMI.OUTPUT2
//          PEND               //* END OF PROCEDURE 1
//*
//INSTPRC2  PROC               //* START OF PROCEDURE 2
//STEP1        EXEC PGM=SORT
//SORTIN       DD DSN=*.INSTPRC1.STEP1.SORTOUT
//SORTOUT      DD DSN=&DSNM2,DISP=OLD
//SYSOUT       DD SYSOUT=*
//SYSIN        DD DSN=&DATAC
//          PEND               //* END OF PROCEDURE 2
//*
//JSTEP1    EXEC INSTPRC1,DSNM1=MYDATA.URMI.INPUT1,
//          DATAC=MYDATA.BASE.LIB1(DATA1)
//*

ในตัวอย่างข้างต้น JCL เรียกโพรซีเดอร์ INSTPRC1 ใน JSTEP1 และโพรซีเดอร์ INSTPRC2 ถูกเรียกภายในโพรซีเดอร์ INSTPRC1 ที่นี่เอาต์พุตของ INSTPRC1 (SORTOUT) จะถูกส่งผ่านเป็นอินพุต (SORTIN) ไปยัง INSTPRC2

SET statementใช้เพื่อกำหนดสัญลักษณ์ที่ใช้กันทั่วไปในขั้นตอนหรือขั้นตอนงาน เริ่มต้นค่าก่อนหน้าในชื่อสัญลักษณ์ ต้องมีการกำหนดก่อนการใช้ชื่อสัญลักษณ์ใน JCL เป็นครั้งแรก

ลองดูคำอธิบายด้านล่างเพื่อทำความเข้าใจเพิ่มเติมเกี่ยวกับโปรแกรมข้างต้น:

  • พารามิเตอร์ SET เริ่มต้น DSNM1 = INPUT1 และ DSNM2 = OUTPUT1

  • เมื่อเรียก INSTPRC1 ใน JSTEP1 ของ JCL, DSNM1 = MYDATA.URMI.INPUT1 และ DSNM2 = OUTPUT1 กล่าวคือค่าเริ่มต้นในคำสั่ง SET จะถูกรีเซ็ตด้วยค่าที่กำหนดในขั้นตอน / ขั้นตอนงานใด ๆ

  • เมื่อเรียก INSTPRC2 ในขั้นตอนที่ 2 ของ INSTPRC1, DSNM1 = MYDATA.URMI.INPUT1 และ DSNM2 = MYDATA.URMI.OUTPUT2