JCL - Xác định tập dữ liệu

Tên tập dữ liệu chỉ định tên của tệp và nó được ký hiệu là DSN trong JCL. Tham số DSN đề cập đến tên tập dữ liệu vật lý của tập dữ liệu mới được tạo hoặc hiện có. Giá trị DSN có thể được tạo thành từ các tên phụ, mỗi tên có độ dài từ 1 đến 8 ký tự, được phân tách bằng dấu chấm và có tổng độ dài là 44 ký tự (chữ và số). Sau đây là cú pháp:

DSN=&name | *.stepname.ddname

Temporary datasetschỉ cần bộ nhớ trong khoảng thời gian công việc và sẽ bị xóa khi hoàn thành công việc. Các tập dữ liệu như vậy được biểu diễn dưới dạngDSN=&name hoặc đơn giản là không có DSN được chỉ định.

Nếu tập dữ liệu tạm thời được tạo bởi một bước công việc sẽ được sử dụng trong bước công việc tiếp theo, thì nó được tham chiếu là DSN=*.stepname.ddname. Đây được gọi làBackward Referencing.

Kết nối các tập dữ liệu

Nếu có nhiều hơn một tập dữ liệu có cùng định dạng, chúng có thể được nối và chuyển làm đầu vào cho chương trình trong một tên DD duy nhất.

//CONCATEX JOB CLASS=6,NOTIFY=&SYSUID
//*
//STEP10    EXEC PGM=SORT
//SORTIN    DD DSN=SAMPLE.INPUT1,DISP=SHR
//          DD DSN=SAMPLE.INPUT2,DISP=SHR
//          DD DSN=SAMPLE.INPUT3,DISP=SHR
//SORTOUT   DD DSN=SAMPLE.OUTPUT,DISP=(,CATLG,DELETE),
//          LRECL=50,RECFM=FB

Trong ví dụ trên, ba tập dữ liệu được nối và chuyển làm đầu vào cho chương trình SORT với tên SORTIN DD. Các tệp được hợp nhất, sắp xếp trên các trường khóa được chỉ định và sau đó được ghi vào một tệp đầu ra duy nhất SAMPLE.OUTPUT trong tên SORTOUT DD.

Ghi đè tập dữ liệu

Trong một JCL được chuẩn hóa, chương trình sẽ được thực thi và các tập dữ liệu liên quan của nó được đặt trong một thủ tục được lập danh mục, được gọi trong JCL. Thông thường, cho mục đích thử nghiệm hoặc để khắc phục sự cố, có thể cần phải sử dụng các bộ dữ liệu khác với các bộ dữ liệu được chỉ định trong quy trình đã phân loại. Trong trường hợp đó, tập dữ liệu trong thủ tục có thể được ghi đè trong JCL.

//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID
//*
//JSTEP1    EXEC CATLPROC,PROG=CATPRC1,DSNME=MYDATA.URMI.INPUT
//          DATAC=MYDATA.BASE.LIB1(DATA1)
//STEP1.IN1 DD DSN=MYDATA.OVER.INPUT,DISP=SHR
//*
//* The cataloged procedure is as below:
//*
//CATLPROC PROC PROG=,BASELB=MYCOBOL.BASE.LIB1
//*
//STEP1     EXEC PGM=&PROG
//STEPLIB   DD DSN=&BASELB,DISP=SHR
//IN1       DD DSN=MYDATA.URMI.INPUT,DISP=SHR
//OUT1      DD SYSOUT=*
//SYSOUT    DD SYSOUT=*
//SYSIN     DD MYDATA.BASE.LIB1(DATA1),DISP=SHR
//*
//STEP2     EXEC PGM=SORT

Trong ví dụ trên, tập dữ liệu IN1 sử dụng tệp MYDATA.URMI.INPUT trong PROC, tệp này được ghi đè trong JCL. Do đó, tệp đầu vào được sử dụng trong quá trình thực thi là MYDATA.OVER.INPUT. Xin lưu ý rằng tập dữ liệu được gọi là STEP1.IN1. Nếu chỉ có một bước trong JCL / PROC, thì tập dữ liệu có thể được tham chiếu chỉ với tên DD. Tương tự, nếu có nhiều hơn một bước trong JCL, thì tập dữ liệu sẽ được ghi đè thành JSTEP1.STEP1.IN1.

//SAMPINST  JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID
//*
//STEP      EXEC CATLPROC,PROG=CATPRC1,DSNME=MYDATA.URMI.INPUT
//          DATAC=MYDATA.BASE.LIB1(DATA1)
//STEP1.IN1 DD DSN=MYDATA.OVER.INPUT,DISP=SHR
//          DD DUMMY
//          DD DUMMY
//*

Trong ví dụ trên, trong số ba tập dữ liệu được nối trong IN1, tập dữ liệu đầu tiên được ghi đè trong JCL và phần còn lại được giữ nguyên như hiện tại trong PROC.

Xác định GDG trong JCL

Nhóm dữ liệu thế hệ (GDG) là nhóm các tập dữ liệu có liên quan với nhau bằng một tên chung. Tên chung được gọi là cơ sở GDG và mỗi tập dữ liệu được liên kết với cơ sở được gọi là phiên bản GDG.

Ví dụ: MYDATA.URMI.SAMPLE.GDG là tên cơ sở GDG. Các tập dữ liệu được đặt tên là MYDATA.URMI.SAMPLE.GDG.G0001V00, MYDATA.URMI.SAMPLE.GDG.G0002V00, v.v. Phiên bản mới nhất của GDG được gọi là MYDATA.URMI.SAMPLE.GDG (0), các phiên bản trước được gọi là (-1), (-2), v.v. Phiên bản tiếp theo được tạo trong một chương trình được tham chiếu là MYDATA.URMI.SAMPLE.GDG (+1) trong JCL.

Tạo / Thay đổi GDG trong JCL

Các phiên bản GDG có thể có các thông số DCB giống nhau hoặc khác nhau. Một DCB mô hình ban đầu có thể được định nghĩa để được sử dụng bởi tất cả các phiên bản, nhưng nó có thể bị ghi đè khi tạo phiên bản mới.

//GDGSTEP1 EXEC PGM=IDCAMS
//SYSPRINT DD  SYSOUT=*
//SYSIN    DD  *
           DEFINE GDG(NAME(MYDATA.URMI.SAMPLE.GDG)   -
           LIMIT(7)                           -
           NOEMPTY                            -
           SCRATCH)
/*
//GDGSTEP2 EXEC PGM=IEFBR14
//GDGMODLD DD  DSN=MYDATA.URMI.SAMPLE.GDG,
//         DISP=(NEW,CATLG,DELETE),
//         UNIT=SYSDA,
//         SPACE=(CYL,10,20),
//         DCB=(LRECL=50,RECFM=FB)
//

Trong ví dụ trên, tiện ích IDCAMS xác định cơ sở GDG trong GDGSTEP1 với các tham số dưới đây được truyền vào câu lệnh SYSIN DD:

  • NAME chỉ định tên tập dữ liệu vật lý của cơ sở GDG.

  • LIMIT chỉ định số lượng phiên bản tối đa mà cơ sở GDG có thể chứa.

  • EMPTY hủy danh mục tất cả các thế hệ khi đạt đến LIMIT.

  • NOEMPTY hủy danh mục thế hệ gần đây nhất.

  • SCRATCH vật lý xóa thế hệ khi nó chưa được lập danh mục.

  • NOSCRATCH không xóa tập dữ liệu, tức là, nó có thể được tham chiếu bằng cách sử dụng các tham số UNIT và VOL.

Trong GDGSTEP2, tiện ích IEFBR14 chỉ định các tham số DD mô hình sẽ được sử dụng bởi tất cả các phiên bản.

IDCAMS có thể được sử dụng để thay đổi các tham số định nghĩa của GDG như tăng LIMIT, thay đổi EMPTY thành NOEMPTY, v.v. và các phiên bản liên quan của nó bằng cách sử dụng lệnh SYSIN là ALTER MYDATA.URMI.SAMPLE.GDG LIMIT(15) EMPTY.

Xóa GDG trong JCL

Sử dụng tiện ích IEFBR14, chúng tôi có thể xóa một phiên bản GDG.

//GDGSTEP3   EXEC PGM=IEFBR14
//GDGDEL     DD  DSN=MYDATA.URMI.SAMPLE.GDG(0),
//           DISP=(OLD,DELETE,DELETE)

Trong ví dụ trên, phiên bản mới nhất của MYDATA.URMI.SAMPLE.GDG bị xóa. Xin lưu ý rằng tham số DISP khi hoàn thành công việc bình thường được mã hóa là DELETE. Do đó, tập dữ liệu sẽ bị xóa khi công việc hoàn thành việc thực thi.

IDCAMS có thể được sử dụng để xóa GDG và các phiên bản liên quan của nó bằng lệnh SYSIN DELETE(MYDATA.URMI.SAMPLE.GDG) GDG FORCE/PURGE.

  • FORCExóa các phiên bản GDG và cơ sở GDG. Nếu bất kỳ phiên bản GDG nào được đặt với ngày hết hạn vẫn chưa hết hạn, thì những phiên bản đó sẽ không bị xóa và do đó cơ sở GDG được giữ lại.

  • PURGE xóa các phiên bản GDG và cơ sở GDG bất kể ngày hết hạn.

Sử dụng GDG trong JCL

Trong ví dụ sau, phiên bản MYDATA.URMI.SAMPLE.GDG mới nhất được sử dụng làm đầu vào cho chương trình và phiên bản mới của MYDATA.URMI.SAMPLE.GDG được tạo làm đầu ra.

//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01   EXEC PGM=MYCOBB
//IN1     DD DSN=MYDATA.URMI.SAMPLE.GDG(0),DISP=SHR
//OUT1    DD DSN=MYDATA.URMI.SAMPLE.GDG(+1),DISP=(,CALTG,DELETE)
//        LRECL=100,RECFM=FB

Ở đây, nếu GDG đã được gọi bằng tên thực như MYDATA.URMI.SAMPLE.GDG.G0001V00, thì nó dẫn đến việc thay đổi JCL mỗi lần trước khi thực thi. Việc sử dụng (0) và (+1) sẽ tự động thay thế phiên bản GDG để thực thi.