ILOVEMAINFRAME 的个人资料I love mainframe日志列表 工具 帮助

日志


6月8日

IKJEFT01

IKJEFT01是一个TMP程序. (terminal monitor program).

可以执行clist,rexx,tso.e command命令等.

例1
SB01 EXEC PGM=IKJEFT01,DYNAMNBR=50
STEPLIB DD DISP=SHR,DSN=DSN.DSNLOAD
SYSTSPRT DD SYSOUT=*
SYSPRINT DD DSN=XXXX.XX.XXXX,DISP=(,CATLG),
DCB=(RECFM=FBA,LRECL=133,BLKSIZE=133),
SPACE=(CYL,(5,5)),UNIT=SPLD
SYSIN DD DSN=&&CTL,DISP=(OLD,DELETE)
SYSTSIN DD DSN=XXXX.IOCS.SQLLIB(DSNTEP2),DISP=SHR

XXXX.IOCS.SQLLIB
********************************* Top of Data **********************************
DSN SYSTEM(DSN)
RUN PROGRAM(DSNTEP2) PLAN(DSNTEP2) LIB(’DSN.RUNLIB.LOAD’)
******************************** Bottom of Data ********************************
SYSTSIN sysin控制参数 这里是一段CLIST程序

例2
在DB2使用中,DSN用来获取DB2在OS/390的Subsystem identifier,用来对DBRM进行BIND PLAN或者 BIND PACKAGE的,也能PLAN和PACKGAE进行RUN。

在IKJEFT01中输入执行语句应该写在 SYSTSIN里
BIND的时候:
//DBRMLIB DD DSN=XXX.XXX.XXX,DISP=SHR
//SYSTSIN DD*
DSN SYSTEM(Subsystem identifier)
BIND PLAN(PLAN-name) MEMBER(DBRM-name) ACT(REP) ISO(CS)
END
/*

RUN的时候 :
//SYSTSIN DD *
DSN SYSTEM(Subsystem identifier)
RUN PROGRAM(DB2PGM-name) PLAN(PLAN-name) -
LIBRARY(’DATASET-name of DB2PGM’)
END
/*

对于abend情况的处理,可以用IKJEFT1A,IKJEFT1B

6月5日

IEBUPDTE

IEBUPDATE 这个 UTILITY 最常见的用法是用来在分区数据集中创建多个 member,或者更新这些 member 中的数据。虽然 IEBUPDATE 能够用来处理给中类型的数据,但是主要用途还是创建或者维护JCL的过程库或者汇编语言的宏程序库。今天,这个 UTILITY 大多用来做程序产品的发布和维护了。很少被普通 TSO 用户使用。

这里有一个很基本的例子用来往 MY.PROCLIB 中添加两个 JCL 的过程的 MEMBER。运用 ISPF 也许能够很方便的完成这些事情,但是如果我们假设这个 JOB 已经在磁带上了,那么很显然就会比 ISPF 操作更加有效。

//OGDEN10 JOB 1,BILL,MSGCLASS=X
// EXEC PGM=IEBUPDTE
//SYSPRINT DD SYSOUT=*
//SYSUT1 DD DISP=OLD,DSN=MY.PROCLIB
//SYSUT2 DD DISP=OLD,DSN=MY.PROCLIB
//SYSIN DD DATA
./ ADD LIST=ALL,NAME=MYJOB1
//STEP1 EXEC=BILLX1
//PRINT DD SYSOUT=A
// (more JCL for MYJOB1)
//SYSUDUMP DD SYSOUT=* (last JCL for MYJOB1)
./ REPL LIST=ALL,NAME=LASTJOB
//LIST EXEC PGM=BILLLIST
// (more JCL for this procedure)
//* LAST JCL STATEMENT FOR LASTJOB
./ ENDUP
/*

对这个例子进行一下说明:

  • 这是一个更新数据集的过程,所以 SYSUT1 和 SYSUT2 都指向了同一个数据集。如果指向不同的话,那么就会是一个先复制然后再更新的过程。
  • 从SYSIN DD DATA 的格式来看,输入流的前两列会有 // 表示,它并不会被 JCL 语句打断。输入流的结尾会有 /* 的标识。IEBUPDATE 的 UTILITY 控制语句由 ./ 来引导。
  • 一个名为 MYJOB1 的 MEMBER 被加入到 MY.PROCLIB 中。而且这个 MEMEBER 并不需要已经存在。而已经存在的 MEMBER LASTJOB 就会被新的内容替换掉。
另外,IEBUPDATE 这个 UTILITY 还能够根据控制语句中的序列号来添加或者替换相应的 MEMBER。这也是针对 JCL 语句或者源语句中那些数字序列的所剩不多的用法。
最后我们需要再次重申 IEBUPDATE 最有代表性的用法是用作程序的发布和维护。比方说,如果需要给客户的程序库中添加25个 JCL 过程,我们只需要将这25个过程作为一个程序包用 IEBUPDATE 导入。这样做的一个好处是由于所有的产品都使用一种源程序格式,客户就可以很方便的在使用之前进行审核。

6月3日

IDCAMS

IDCAMS 其实算不上是一个记录在 z/OS UTILITY 手册中的常规组件。IDCAMS 更主要的用途是用来创建和使用 VSAM 数据集。它还有一些其他功能,比如更新 CATALOG。但是和它联系最紧密的还是 VSAM。IDCAMS 的复杂的功能还是留给大家自己看手册,我们还是讲些最基本的用法。

下面是一个很有代表性的 IDCAMS 的例子:
//OGDEN12 JOB 1,BILL,MSGCLASS=X
//DEL EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DELETE OGDEN.DATA.VSAM CLUSTER
/*
//LOAD EXEC PGM=IDCAMS
//SYSPRINT DD *
//DATAIN DD DISP=OLD,DSN=OGDEN.SORTOUT
//SYSIN DD *
DEFINE CLUSTER (NAME (OGDEN.DATA.VSAM) -
VOLUMES(WORK02) CYLINDERS(1 1) -
RECORDSIZE (72 100) KEYS(9 8) INDEXED)
REPRO INFILE(DATAIN) OUTDATASET(OGDEN.DATA.VSAM) ELIMIT(200)
/*

这个程序里面有两个 JOB STEP。第一步,删除在第二步将会创建的 DATASET。这是一个清除的功能。如果这个 DATASET 并不存在的话,这一步将会被忽略掉。

第二步中进行了执行了两个功能。用 DEFINE CLUSTER 命令创建一个VSAM 数据集;然后用 REPRO 命令将一个顺序数据集的内容导入。VSAM 数据集被创建在 WORK02 卷上,主空间为一个 CYLINDER,第二分配空间也是一个 CYLINDER。由于 VSAM 数据集大多使用变长的数据,所以该数据集被定义为平均 72 个字节,最大为 100字节。每个记录的 9 个自己的偏移量的首 8 个字节被设置为主键。ELIMIT 参数定义了 REPRO 操作中在终止运行之前允许忽略的错误次数。

很多 IDCAMS 的函数中中能够使用 TSO 命令,比方说 DEFINE CLUSTER 就是 TSO 命令。但是一般情况下我们不建议在 IDCMAS 中使用很复杂的命令,那样的话遇到的错误也会是很复杂的。一般我们查看和或者检查 IDCAMS 的命令和产生的消息都需要到 SDSF 中检查该 JOB 的输出结果。

6月2日

IEBDG

IEBDG 这个 UTILLITY 可以在指定的 DATASET 中在不同的区域生成不同样式的数据。IEBDG 是一个很具有代表性的生成测试数据的 UTILITY。能够生成各式各样的区块数据,并且还能够对其进行进行形状上的改动,比方说做成波浪形。另外,IEBDG 还支持输入式数据并覆盖制定区域的操作。

下面我们举一个最简单的例子:

//OGDEN7 JOB 1,BILL,MSGCLASS=X
// EXEC PGM=IEBDG
//SYSPRINT DD SYSOUT=*
//OUT DD DISP=(NEW,CATLG),DSN=OGDEN.TEST.DATA,UNIT=3390,
// VOL=SER=WORK01,SPACE=(CYL,(10,1)),
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=8000)
//SYSIN DD *
DSD OUTPUT=(OUT)
FD NAME=FIELD1,LENGTH=30,FORMAT=AL,ACTION=RP
FD NAME=FIELD2,LENGTH=10,PICTURE=10,'TEST DATA '
FD NAME=FIELD3,LENGTH=10,FORMAT=RA
CREATE QUANTITY=90000,NAME=(FIELD1,FIELD2,FIELD3)
END
/*

这个JOB生成了一个叫做 OGDEN.TEST.DATA 的有90000条数据的DATASET。在 第一个 DD 里面的 DCB 参数中制定了每一条数据占80字节,控制声明段制定了一共有3个区域的数据占据了前50个字节的空间。剩下的空余位置,IEBDG 会默认将其设置为二进制的0,在 DATASET 中显示“.”。

我们指定的3个区域分别是:

字母字段,30个字节长,承叠进的波纹显示;
第二个区域放入的是固定的文字“TEST DATA ”,10个字节长;
第三个区域时随机产生10个字节长的的二进制数据。

这个例子是最简单的对 IEBDG 的用法的描述,IEBDG 还可以生成更加复杂的样式,这里就不再举例说明了。

5月31日

IEBGENER

IEBGENER 这个 utility 拷贝一个顺序数据集到另一个。(记住:分区数据集中的 member 可以被用作一个顺序数据集。)这个 utility 同样还能做一些数据的过滤,可以改变 LRECL 和 BLKSIZE,产生记录,以及几个其他的功能。然后,它被用的最多的是简单拷贝数据集,下面是一个典型的例子:

//OGDEN2 JOB 1,BILL,MSGCLASS=X
// PGM=IEBGENER
//SYSIN DD DUMMY
//SYSPRINT DD SYSOUT=X
//SYSUT1 DD DISP=SHR,DSN=BILL.SEQ.DATA
//SYSUT2 DD DISP=(NEW,CATLG),DSN=BILL.COPY.DATA,UNIT=3390,
// VOL=SER=WORK02,SPACE=(TRK,3,3))

IEBGENER 需要四个 DD 语句。SYSIN DD 语句是用来读取控制参数,用于简单情况,就不需要控制参数,这时候可以用 DD DUMMY 来代替。SYSPRINT 语句用于打印 IEBGENER 信息。SYSUT1 语句用于输入而SYSUT2 语句用于输出。这个例子读取一个现有的数据集然后把它拷贝到另一个新的数据集中。

如果输出的数据集是新的并且没有指定 DCB 参数,IEBGENER 就会赋予它和输入数据集一样的 DCB 的参数。(DCB 参数包括 LRECL,RECFM 和 BLKSIZE)

另一个常用的例子是:

//OGDEN2 JOB 1,BILL,MSGCLASS=X
// PGM=IEBGENER
//SYSIN DD DUMMY
//SYSPRINT DD SYSOUT=X
//SYSUT2 DD DISP=OLD,DSN=BILL.TEST.DATA
//SYSUT1 DD *
 This is in-stream data. It can be as long
 as you like. It appears to an application as
 LRECL=80, RECFM=F, BLKSIZE=80. You would
 want to have the SYSUT2 data set allocated with
 a better blocksize.
/*

这个例子假设 BILL.TEST.DATA 这个数据集已经被创建了,这个作业将会用 SYSUT1 输入流中的数据重写它,因为输出的数据集已经存在,IEBGENER 将使用它现有的 DCB 属性。

IEBGENER 是提供给 z/OS 的最基本拷贝或者 list 的程序,它在 OS/360 第一个发行版本就存在了。

5月30日

IEFBR14

这个程序的唯一功能是提供一个0的返回码,它被用作一个“执行 JCL ”的安全的媒介。执行 JCL 的书法并不是一个非常准确的术语,但是这里能够很好的传达想法。如下面的例子:

//OGDEN1 JOB 1,BILL,MSGCLASS=X
// EXEC PGM=IEFBR14
//A DD DSN=OGDEN.LIB.CNTL,DISP=(NEW,CATLG),VOL=SER=WORK02,
// UNIT=3390,SPACE=(CYL,(3,1,25)
//B DD DSN=OGDEN.OLD.DATA,DISP=(OLD,DELETE)

尽管被执行的程序(IEFBR14)并没有做任何事情,但是这还是一个非常有用的作业。当准备运行这个作业的时候,initiator 分配了数据集 OGDEN.LIB.CNTL 并保持到作业完成。它同时在作业完成时删除了数据集 OGDEN.OLD.DATA。在这个作业中 DD 的名字 A 和 B 其实没有任何意义,但是这里被使用是因为 DD 语句的语法要求每个 DD 都要有的名字。

你完全可以通过 ISPF 来完成新增一个数据集和删除另一个数据集。但是这些 JCL 代码可能会被作为一个很大顺序执行 batch 作业的一个部分。

注释:IEFBR14 名字的来历也非常有意思,早期 IBM 开发 OS/360 的一个团队使用 IEF 作为他们所有模块的前缀。在汇编语言中,BR 的意思是跳到(Branch)寄存器中的地址,而跳到通用寄存器14的地址是结束一个程序的标准方法。尽管这不是什么机灵的名字,实际上所有献身于 z/OS 的用户都能非常容易记的 IEFBR14。

IEFBR14 不是一个 utility,从这个意义上来说他不应该包含到 Utilities 的手册上。然后没有任何其他特别的分类可以包含这个有用的程序,所以我们专制地把它放到 Utility 的分类中。

下一个 utility:IEBGENER

什么是 JCL

JCL(Job Control Language,作业控制语言)是描述运行在 IBM 大型机上的 z/OS 和 z/VM 操作系统中的作业(执行单元)的语言。大型机操作系统给以在电脑上启动的所有作业分配时间和空间资源。作业依次被分解为作业步。作业是无需用户交互的操作(例如,打印作业)的后台执行单元(有时称 Batch)。另外,操作系统管理着交互的(前台的,Online)用户请求,这些请求初始化了执行单元。一般来说,前台操作被赋予了比后台操作更高的优先级。

一本IBM的手册把整套JCL语言比作餐馆的点菜的订单。整个订单就像是作业。在后台厨房,厨师把订单分解开来,作出每一道菜(作业步)。当作业步都完成时,整顿饭就做好了(但每道菜必须按指定的顺序来做,就像某些作业步是依赖于其他一些已经执行了的作业步一样)。

JCL 语句主要描述了需要访问的输入数据集,将要被创建或修改的输出数据集,需要为这个作业分配哪些资源,以及要使用这些输入输出数据集来运行的程序。一个作业的 JCL 语句集将会以数据集的形式存储下来,并且能够通过交互启动它。z/OS 提供了一个交互式的像菜单一样的接口 ISPF,可以用它来初始化和管理作业。

JCL 语句主要分为三部分:

  • JOB — 给系统提供作业名,它可能含有帐号信息和其他参数
  • EXEC — 要去执行的程序名,在一个作业可能含有多个 EXEC 语句,在同一个作业中的 EXEC 语句叫做作业步(Job Step)
  • DD — 数据集定义(Data Definition)定义了 EXEC 语句中的执行程序的输入和输出数据集。这个语句链接到一个数据集或者 I/O 设备或者是程序中 DDNAME 中定义的数据集,DD 语句是和一个特定作业步相关。
在 z/OS 中,操作系统中用来处理 JCL 的那部分被称作作业入口子系统(JES)。总共有两个版本,JES2 和后来的一个带有附加功能的版本 JES3。

JCL 的语法是比较简单,如果你有什么不明白的地方你可以给我们留言,我们会尽力回答你们的问题。
接下来的关于 JCL 文章,我们会主要介绍 JCL 的 Utilities,第一个我们会介绍的是 IEFBR104