JCL - Thủ tục

Các JCL Procedureslà tập hợp các câu lệnh bên trong JCL được nhóm lại với nhau để thực hiện một chức năng cụ thể. Thông thường, phần cố định của JCL được mã hóa trong một quy trình. Phần khác nhau của Công việc được mã hóa trong JCL.

Bạn có thể sử dụng một thủ tục để thực hiện song song một chương trình bằng cách sử dụng nhiều tệp đầu vào. Một JCL có thể được tạo cho mỗi tệp đầu vào và một thủ tục đơn lẻ có thể được gọi đồng thời bằng cách chuyển tên tệp đầu vào dưới dạng tham số tượng trưng.

Cú pháp

Sau đây là cú pháp cơ bản của định nghĩa thủ tục JCL:

//*
//Step-name EXEC procedure name

Nội dung của thủ tục được lưu giữ trong JCL cho một thủ tục trong luồng. Nội dung được giữ trong một thành viên khác của thư viện cơ sở cho một thủ tục được biên mục. Chương này sẽ giải thích hai loại thủ tục có sẵn trong JCL và cuối cùng chúng ta sẽ xem cách chúng ta có thể lồng các thủ tục khác nhau.

Thủ tục trực tuyến

Khi thủ tục được mã hóa trong cùng một thành viên JCL, nó được gọi là Thủ tục trực tuyến. Nó phải bắt đầu bằng câu lệnh PROC và kết thúc bằng câu lệnh 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)
//*

Trong ví dụ trên, thủ tục INSTPROC được gọi trong STEP1 và STEP2 bằng cách sử dụng các tệp đầu vào khác nhau. Các tham số DSNAME và DATAC có thể được mã hóa bằng các giá trị khác nhau trong khi gọi thủ tục và chúng được gọi làsymbolic parameters. Các đầu vào khác nhau cho JCL như tên tệp, thẻ dữ liệu, giá trị PARM, v.v., được chuyển dưới dạng tham số tượng trưng cho các thủ tục.

Trong khi mã hóa các tham số tượng trưng, ​​không sử dụng TỪ KHÓA, THAM SỐ hoặc THAM SỐ SUB làm tên tượng trưng. Ví dụ: Không sử dụng TIME = & TIME nhưng có, bạn có thể sử dụng TIME = & TM và nó được coi là một cách mã hóa biểu tượng đúng.

Các tham số ký hiệu do người dùng xác định được gọi là JCL Symbols. Có một số ký hiệu được gọi làsystem symbols, được sử dụng để thực hiện công việc đăng nhập. Biểu tượng hệ thống duy nhất được người dùng bình thường sử dụng trong các công việc hàng loạt là&SYSUID và điều này được sử dụng trong tham số NOTIFY trong câu lệnh JOB.

Quy trình lập danh mục

Khi thủ tục được tách ra khỏi JCL và được mã hóa trong một kho dữ liệu khác, nó được gọi là Cataloged Procedure. Một câu lệnh PROC không bắt buộc phải được mã hóa trong một quy trình được phân loại. Sau đây là một ví dụ về JCL nơi nó gọi thủ tục CATLPROC:

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

Ở đây, thủ tục CATLPROC được lập danh mục trong MYCOBOL.BASE.LIB1. PROG, DATAC và DSNAME được chuyển dưới dạng các tham số tượng trưng cho thủ tục 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
//*

Trong quy trình, các tham số biểu tượng PROG và BASELB được mã hóa. Xin lưu ý rằng tham số PROG trong quy trình bị ghi đè bởi giá trị trong JCL và do đó PGM nhận giá trị CATPRC1 trong khi thực thi.

Thủ tục lồng nhau

Gọi một thủ tục từ bên trong một thủ tục được gọi là nested procedure. Các thủ tục có thể được lồng vào nhau lên đến 15 cấp độ. Việc làm tổ có thể hoàn toàn trong luồng hoặc theo danh mục. Chúng tôi không thể mã hóa một thủ tục trong luồng trong một thủ tục được lập danh mục.

//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)
//*

Trong ví dụ trên, JCL gọi thủ tục INSTPRC1 trong JSTEP1 và thủ tục INSTPRC2 đang được gọi trong thủ tục INSTPRC1. Tại đây, đầu ra của INSTPRC1 (SORTOUT) được chuyển làm đầu vào (SORTIN) thành INSTPRC2.

A SET statementđược sử dụng để xác định các ký hiệu thường được sử dụng qua các bước hoặc thủ tục công việc. Nó khởi tạo các giá trị trước đó trong các tên biểu tượng. Nó phải được xác định trước khi sử dụng tên ký hiệu đầu tiên trong JCL.

Hãy xem phần mô tả bên dưới để hiểu thêm một chút về chương trình trên:

  • Tham số SET khởi tạo DSNM1 = INPUT1 và DSNM2 = OUTPUT1.

  • Khi INSTPRC1 được gọi trong JSTEP1 của JCL, DSNM1 = MYDATA.URMI.INPUT1 và DSNM2 = OUTPUT1., Tức là, giá trị khởi tạo trong câu lệnh SET được đặt lại với giá trị được đặt trong bất kỳ bước / thủ tục công việc nào.

  • Khi INSTPRC2 được gọi trong BƯỚC2 của INSTPRC1, DSNM1 = MYDATA.URMI.INPUT1 và DSNM2 = MYDATA.URMI.OUTPUT2.