CL 命令的作用
CL (Control Language) 控制语言是用户与操作系统之间的主要接口。可以说用户管理和操作 AS/400 系统,均可以通过 CL 实现。用户在不同的工作站或客户端可以同时使用 CL,其输入方式有五种:
* 在命令行输入
* 在菜单画面选择
* 在 work with 菜单中,option 选项
* 在 CL 程序中执行
* 远程调用
前三种输入方式给用户提供一种交互式的操作方法,只执行一条命令;第四种方式给用户提供一种操作,并包含逻辑控制,可以完整地实现一项功能;第五种方式给用户提供在客户端直接执行主机操作的接口。
由于 CL 使用了统一的命名方法,提供 prompt 式的提示功能和具体到域值的在线帮助,以及自动生成命令参数的缺省值, 再加上有效性检查,从而使得 CL 的使用变得非常简单、方便和灵活。
CL 命令的参数
CL 使用了一种很科学,较为成功的命名方法。每条命令由命令名和一系列参数组成。命令名通常由动词加上接受动词的名词定义为目标Ob ject)组成,单词通常缩写为三个字母。
例如:
CL 命令 命令名
Send Message SNDMSG
Copy File CPYF
Work with Device Desripyions WRKDEVD
重点如果你记不住,没有关系,你记住其中一个基本的就行就行,比如MSG, 你可以用 GO CMDMSG
查看到所有的MSG相关的命令
还有一种就是你只记得一半:
CRTJRN*
CL 的参数由关键字和参数值组成,关键字通常和命令一样缩写,它用于说明参数的作用,在命令输入屏,按 F11 键,即可看到关键字。在命令行输入命令时,如果参数是按照固定的顺序输入,则可以省略关键字。
例如: SNDMSG MSG (HOLLEO) TOUSR (LENG)
命令名 关键字 参数值
大多数 CL 都是 针对目标而言,目标是一个占据了一定存储空间的实体,它包括自身属性及其数据特征的描述,系统可以对它进行操作。目标的属性包括名字、类型、长度、建立日期及其它属性。不同目标具有不同的属性描述,大部分属性是可以修改的,而不需要重新建立。目标的数据值是储存于目标中的信息集合,例如: 程序的值是组成程序的执行码,文件的值是组成文件的记录。
目标的类型很多,常用的几种包括:
* LIB 库
* FILE 文件
* MSGF 信息文件
* PGM 程序
* CMD 命令
* JOBQ 作业队列
* DTAQ 数据队列
* MSGQ 信息队列
* OUTQ 输出队列
* DTAARA 数据域
* JRN 日志
* JRNRCV 日志接受器
* USRPRF 用户简要表
* SBSD 子系统描述
* JOBD 作业描述
* LIND 线路描述
* CTLD 控制器描述
* DEVD 设备描述
一个具体目标是由目标名和目标类型来唯一标识的,不同的目标类型可以使用同一个目标名。目标名由用户指定,目标类型由生成它的命令决定。不同类型的目标具有不同的操作。例如:
CALL 命令只针对 *PGM 目标进行操作。
关于目标的操作,系统也进行了统一的规范,常用的几种包括:
* WRK 工作
* CRT 建立
* ADD 增加
* CHG 改变
* DLT 删除
* DSP 显示
* EDT 编辑
* CPY 拷贝
* MOV 移动
* RNM 变名
* SAV 备份
* RST 恢复
* RTV 获取
* GRT 授权
* DMP 转储
CL 编程
CL 程序的作用
CL 程序是由 CL 命令组成,这些命令被编译成可供随时调用的程序。使用 CL 程序的优点包括:
* CL 程序比单独输入和运行命令快,因为命令被编译成能够立即运行的形式。
* 有些功能需要多条 CL 命令一起完成。
* 参数可以传递给 CL 程序,CL 程序内部也接收变量的定义, 以适应特殊需要的程序操作。
* CL 程序能够像其它高级语言程序一样被测试和监控。
CL 程序可以应用到许多方面,包括:
* 通过 CL 程序完成单独输入 CL 命令所不能完成的功能,例如,人工或者定时提交批作用完成一项工作,如启动子系统, 进行文件备份,整顿系统资源。
* 给交互式或批处理的应用程序提供一个接口,使得在应用程序中直接进行系统操作或者获取系统参数。
* 在网络通信方面,CL 程序往往承担应用主控程序的角色。
CL 程序的结构
CL 程序是借助于 ADT 工具中的 SEU 输入的,在输入过程中,键入一条命令并按 F4 键,就会显示出这条命令的提示画面,方便用户输入相应的参数值。CL 源程序主要分为以下几个部分:
* 程序的开始和结束:
PGM PARM(&A &B) 开始 CL 程序
END PGM 结束程序
* 变量定义: DCL 定义变量
DCLF 定义文件
* CL 处理命令: CHGVAR 变量赋值
MONMSG 监控错误信息
SNDPGMMSG 传送程序信息
RTVJOBA 获取作业属性值
* 逻辑控制命令: IF THEN ELSE
DO ENDDO
GOTO
* 内部函数: % SST 取子串
* CAT 连接字符
* 程序控制命令: CALL 调用子程序
RETURN 返回调用程序
CL 程序的命令
CL 程序中仅可包含 CL 命令,由系统提供的大多数 CL 命令可用于 CL 程序,而有些 CL 命令是专门用在 CL 程序中的。 下面是一张用在 CL 程序中的部分命令清单,其中带有星号的表示该命令仅能用于 CL 程序内部。
变量的使用
* 变量说明,使用 DCL 命令来定义变量及其属性、长度和初值。标准格式如下:
* CHAR
DCL VAR (变量名) TYPE * DEC LEN (长度) VALUE(初值)
* LGL
使用 DCL 命令时,必须遵循的规则如下:
#CL 变量名必须以 & 开始,后跟字符不多于 10 个,& 后的第一个字符必须是字母,其余的可以是字母或数字。
#CL 变量值必须是:字符型最长为 9999 个字符;数值型为压缩十进制数,最长为 15 位,其中小数位最长为 9 位; 逻辑型为“0”或“1”,表示假或真。
#CL 变量的缺省初值为:字符型为空,数值型为 0,逻辑型为“0”。
#对于字符型和数值型,如果指定了初值而未指定长度,则缺省长度为初值长度。
* 变量值中小写字符的限制
用作变量的保留值必须用大写字母表示,特别是当它们用引号括起来的时候。例如:
DCL VAR(&LIB) TYPE(*CHAR) LEN(10) VALUE(’*LIBL’)
DLTPGM &LIB/MY PROG
注意:如果 VALUE 参数不使用引号,则小写是正确的。因为使用 SEU 编辑会自动转换成大写。
* 变量赋值,使用 CHGVAR 命令给变量赋值,其值可改变成:
#常量: CHGVAR VAR(&A) VALUE(0)
#变量: CHGVAR VAR(&A) VALUE(&B)
#计算量:CHGVAR VAR(&A) VALUE(&A+1)
#函数量:CHGVAR VAR(&A) VALUE(%SST(&B 1 5))
CHGVAR VAR(%SST(&A 1 5)) VALUE(&B)
赋值时应注意以下几点:
#对逻辑变量,被改变的值必须是一个逻辑值。
#对数值变量,只能赋予十进制数,或者数字字符变量(包括小数点和正负号)。
#对字符变量,既可接受字符,也可接受十进制数。赋十进制数时,该字符变量的值是右对齐,前导补零,负号放在最左边。
* CL 程序中注解的书写,在命令的头尾使用一对符号:/* 和*/。
如果一行写不下一条命令,使用 +。
CL 程序内部的逻辑控制
* 条件转移命令:
IF COND(条件) THEN(一条命令)
ELSE CMD(一条命令)
或者 IF COND(条件) THEN(DO)
.
ENDDO
ELSE CMD (DO)
.
ENDDO
* 无条件转移命令:GOTO LABEL
* 操作符:
逻辑的 *AND *OR *NOT
算术的 + - * /
字符的 *CAT *TCAT
关系的 *EQ *GT *LT *GE *LE *NE
* 监视信息命令:MONMSG
MONMSG MSGID(信息标识 1 … 信息标识 50)+ EXEC(CL命令)
系统对于CL命令执行错误所送出的信息都具有唯一的标识符,如果不进行监视,则系统会终断程序,自动显示错误信息。
系统资源的获取
* 日期格式转换命令:CVTDAT
CVTDAT DATE(被转换日期) TOVAR(转换后日期) FROMFMT(原格式) TOFMT(新格式) TOSEP(新分隔符)
其中:转换后日期的长度至少是:
#对儒略日期(如 YMD,DMY 或 JUL 格式),不使用分隔符为 5 个字符,使用分隔符为 6 个字符。
#对非儒略日期,不使用分隔符为 6 个字符,使用分隔符为8 个字符。 日期格式和分隔符可以通过按 F4 键选择。
* 检索系统值命令:RTVSYSVAL
RTVSYSVAL SYSVAL(系统值名)RTNVAR(CL变量名)
其中:系统值名可以通过按 F4 键选择,如:系统当前日期的系统值是 QDATE。变量名必须和系统值的类型匹配,对字符型和逻辑型系统值而言,变量名的长度必须相符,对数字型,则长度不小于系统值长度。
* 检索配置源命令:RTVCFGSRC
用于将现有配置的描述存放到源文件成员中
* 配置状态检索命令:RTVCFGSTS
用于获取各类配置描述的现行状态,放入 CL 变量。
* 检索网络属性的命令:RTVNETA
用于获取系统的网络属性,放入相应的 CL 变量。如:系统名SYSNAME,本地网络标识 LCLNETID。
* 检索作业属性命令:RTVJOBA
用于获取当前运行作业的属性,放入相应的 CL 变量。如:作业名 JOB,用户名 USER。
* 检索目标描述命令:RTVOBJD
用于获取指定目标的描述属性,放入相应的 CL 变量。
* 检索用户档案命令:RTVUSRPRF
用于获取指定用户的档案资料,放入相应的 CL 变量。
程序间的通讯
程序间的通讯是指不同程序之间数据或参数的传递和交流。这种通讯可以出现在不同种类的程序中。如:RPG 与 C 语言,也可以出现在不同机器上,如:PC 与 AS/400。针对OS/400 而言,通常程序间的通讯具有三种方式:
* CALL、RETURN 命令
* 数据队列通讯
* 数据域通讯
CALL 命令的使用
调用程序: CALL PGM(PGMA) PARM(&A &B)
被调用程序:PGM PARM(&C &D)
有关 CALL 命令使用的几点说明:
* 参数值可以是字符常量、数值常量、逻辑常量或 CL 常量,最多可达 40 个。
* 参数值以 CALL 命令中出现的顺序传送,这必须与被调用程序的参数顺序相匹配,变量名不一定相同。
* 被调程序中的接收参数必须说明,但接收值不受变量说明中初值的影响。
* 接收参数值的改变会反映到调用程序中,但常量传送不会改变。
* 字符常量通常以 32 个字节传送,数字常量以 15.5 长度压缩格式传送。
数据队列的程序通讯
数据队列(*DTAQ)是系统目标中的一种类型,当建立了这种目标后,一个程序可以发送数据给它,另一个程序再从中接收数据,从而达到程序之间的数据通讯。
数据队列的优点
* 数据队列是两个作业之间进行异步通讯的最快方法。相对数据库文件、消息队列或数据域而言,它需要较少的额外开销。
* 多个作业可以向相同的数据队列送数据和取数据,而数据队列的先进先出、后进先出或关键字顺序排列属性,能够保证数据送取的正确性。
* 在任何高级语言程序中,通过调用系统提供的程序,就可以对数据队列进行操作,而且操作方法灵活方便。数据队列的操作和使用包括两类:第一类使用 CL 命令;第二类调用系统程序。
CL 命令:
CRTDTAQ 建立数据队列
DLTDTAQ 删除数据队列
WRKDTAQ 工作数据队列
系统程序:
QSNDDTAQ 发送数据队列
QRCVDTAQ 接收数据队列
QCLRDTAQ 清除数据队列
QMHQRDQD 检索数据队列
数据队列的发送
需要将数据发送给数据队列,只要在程序中调用QSNDDTAQ 。在 CL 程序中,调用的格式如下:
CALL PGM(QSNDDTAQ) PARM(&QNAME &LIB &FLDLEN &FIELD &KEYLEN &KEY)
&QNAME: 是长度为10的字符型,它命名了数据队列,如:IN_Q。
&LIB: 是长度为10的字符型,它命名了数据队列所在的库,如:*LIBL。
&FLDLEN: 是长度为5的数字型,它规定了发送给数据队列的字符数,如:100。
&FIELD: 是长度为&FLDLEN的字符型,它包含了具体发送给数据队列的数据。
&KEYLEN: 是长度为3的数字型,它说明了传送给数据队列的关键字长度,如:6。
&KEY: 是长度为&KEYLEN的字符型,它包含了传送给数据队列的关键字数据。
注:后两个参数可以自选,如果说明了一个,则必须说明另一个。
数据队列的接收
需要从数据队列中接收数据,只要在程序中调用QRCVDTAQ 。在 CL 程序中,调用的格式如下:
CALL PGM(QRCVDTAQ) PARM(&QNAME &LIB &FLDLEN &FIELD &WAIT &ORDER KEYLEN &KEY &SNDRLEN &SNDR)
&QNAME: 是长度为10的字符型,它命名了数据队列。如: OUT_Q。
&LIB: 是长度为10的字符型,它命名了数据队列所在的库。如:*LIBL。
&FLDLEN: 是长度为5的数字型,它规定了发送给数据队列的字符数。
&FIELD: 是长度为&FLDLEN的字符型,它包含了从数据队列中接收到的具体数据。
&WAIT: 是长度为5的数字型,它说明了等待接收数据的时间。负数表示无限制的等待;零表示不等待;
正数示要等待的秒数,最大值是9999。这个参数只有在数据队列中无满足条件的数据时, 才起作
用。
&ORDER: 是长度为2的字符型,它说明了按关键字接收数据的条件。可用的字符值是:GT、LT、EQ、
GE、LE。
&KEYLEN: 是长度为3的数字型,它说明了接收数据队列的关键字长度。
&KEY: 是长度为&KEYLEN的字符型,它标识了用于从数据队列中接收数据的关键字变量。
&SNDRLEN:是长度为3的数字型,它规定了发送者标识的长度。
&SNDR: 是长度为&SNDRLEN 的字符型,它包含了发送者标识的数据。
注:后三个参数可以任选,但是&ORDER、&KEYLEN和&KEY 必须同时说明。
数据队列的清除
需要从数据队列中清除数据,只要在程序中调用 QCLRDTAQ 在 CL 程序中,调用的格式如下:
CALL PGM(QCLRDTAQ) PARMM(&QNAME &LIB)
数据队列的检索
需要检索一个数据队列的描述项,只要在程序中调用QMHQRDQD。在 CL 程序中,调用的格式如下:
CALL PGM(QMHQRDQD) PARM(&RCVR &RCVRLEN &FORMAT &DQNAME)
&RCVR: 是长度为&RCVRLEN的字符型,它标识了含有数据队列性的变量。
&RCVRLEN: 是长度为4的数字型,它说明了&RCVR长度。
&FORMAT: 是长度为8的字符型,它定义了接收模板的格式。
&DQNAME: 是长度为20的字符型,它标识了数据队列和所在库,前十个字符是队列名字,后十个字符是库名。
数据域的程序通讯
数据域(*DTAARA)是系统目标中的一种类型。当建立了这种目标后,可以用来存入数据,以便任何程序进行读取和修改。数据域的典型用途如下:
* 提供用于几个程序中的常数字段,易于共享和修改。如:标题、说明等。
* 在一个作业中提供一个传递信息的区域。
* 在一个作业中提供一个字段作为控制参数,以便容易地得到修改。
数据域的 CL 命令包括:
CRTDTAARA 建立数据域,长度不超过2000
CHGDTAARA 改变数据域,改变时数据域被锁定
DSPDTAARA 显示数据域,可以以十六进制方式显示
RTVDTAARA 检索数据域,检索值需要存入 CL 变量
DLTDTAARA 删除数据域
WRKDTAARA 工作数据域
测试功能
CL 程序的编译
CL 源程序必须经过编译,生成 *PGM 方可运行。建立程序的方法有两种:一是,使用 CL 命令 CRTCLPGM,二是,使用PDM 菜单选项 14,按 F4 键即可对命令参数进行选择。
系统编译的情况全部记录在编译清单中,通过 WRKSPLF 即可看到。编译过程中的错误被列在相应命令后面,以及文件的最后,方便用户查找。下列类型的错误将停止程序的建立:
* 值错
* 句法错
* 命令内部与参数间不符
* 有效性检查有错
CL 程序可以通过反编译命令 RTVCLSRC,重新建立 CL源程序。使用该命令时,必须满足建立编译程序的参数 ALWRTVSRC 为 *YES。 当源程序被反编后,任何注释信息不再重新产生,以下程序序言将被建立:
* 所有者名
* 源程序的最终修改日期
* 源程序的重建日期和时间
* 最初编译时的许可程序级
CL程序的编译
CL 程序的测试
对于 CL 程序在编译和运行中的错误,系统提供以下几种测试功能:
* 程序转储。 在 CL 源程序中输入命令 DMPCLPGM,运行后通过 WRKSPLF 即可看到转储内容。包括程序信息队列的全部信息和全部变量的数值。如果程序运行出错,出现提示画面时,输入 D 也可进行程序转储。
* 设置断点。第一步,启动测试环境,使用命令 STRDBG PGM (PGMA);第二步,设置断点,使用命令 ADDBKP STMT 1500) PGMVAR( ‘&A’ ‘&B’); 第三步,运行程序,显示断点信息;第四步,结束测试环境,使用命令 ENDDBG。
* 设置跟踪。跟踪是记录程序中语句执行顺序的过程。系统并不自动显示跟踪信息,而须使用命令 DSPTRCDTA 请求显示跟踪信息,信息包括语句执行的顺序和 ADDTRC 命令中指定的变量值。
例如:
Auto RGZPFM
STRCLPGM: PGM PARM(&LIBRARY)
DCL VAR(&LIBRARY) TYPE(*CHAR) LEN(10)
DCL VAR(&PERCENT) TYPE(*DEC) LEN(4 3)
DCLF FILE(QTEMP/WORKFILE) RCDFMT(QWHFDMBR)
DSPFD FILE(&LIBRARY/*ALL) TYPE(*MBR) +
OUTPUT(*OUTFILE) OUTFILE(QTEMP/WORKFILE)
NEXT: RCVF RCDFMT(QWHFDMBR)
MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(ENDCLPGM))
IF COND(&MBFILA *EQ ‘*PHY’) THEN(DO)
CHGVAR VAR(&PERCENT) VALUE(&MBNDTR / &MBNRCD)
MONMSG MSGID(MCH1211) EXEC(GOTO CMDLBL(NEXT))
IF COND(&PERCENT *GT .15) THEN(DO)
SBMJOB CMD(RGZPFM FILE(&MBLIB/&MBFILE) MBR(&MBNAME))
ENDDO
ENDDO
GOTO CMDLBL(NEXT)
ENDCLPGM: DLTF FILE(QTEMP/WORKFILE)
ENDPGM
常用CL命令
(1) 表示这些命令仅能用在CL过程中
系统功能 | 命令 | 命令功能 |
修改过程控制
| CALL (Call) | 调用一个程序 |
CALLPRC (Call Procedure) | 调用一个过程 | |
RETURN (Return) | 返回到引起程序或过程运行的下一条命令 | |
CL过程界限 | PGM (program) (1) | 指出CL过程源码的开始 |
ENDPGM (End Program) (1) | 指出CL过程源码的结束 | |
CL过程逻辑 | IF (If) (1) | 根据逻辑表达式的值执行命令 |
ELSE (Else) (1) | 对IF命令为假条件定义采取的行动 | |
DO (Do) (1) | 指出DO组的开始 | |
ENDDO (End Do) (1) | 指出DO组的结束 | |
GOTO (Go To) (1) | 转移到另外的命令 | |
CL过程变量 | CHGVAR (Change Variable) (1) | 修改CL变量的值 |
DCL (Declare) (1) | 说明一个变量 | |
替换 | CHGVAR (Change Variable) (1) | 修改CL变量的值 |
CVTDAT (Convert Date) (1) | 修改日期格式 | |
数据区 | CHGDTAARA (Change Data Area) | 修改数据区 |
CRTDTAARA (Create Data Area) | 生成一个数据区 | |
DLTDTAARA (Delete Data Area) | 删除一个数据区 | |
DSPDTAARA (Display Data Area) | 显示一个数据区 | |
RTVDTAARA (Retrieve Data Area) | 把数据区的内容复制到一个CL变量中 | |
文件 | ENDRCV (End Receive) (1)
| 取消由前面的RCVF,SNDF或SNDRCVF 命令对一个显示文件发出的输入请求. |
DCLF (Declare File) (1) | 说明一个显示文件或数据库文件 | |
RCVF (Receive File) (1) | 从显示文件和数据库文件中读记录 | |
RTVMBRD (Retrieve Member Description) (1) | 取得数据库文件成员的描述
| |
SNDF (Send File) (1) | 往显示文件中写记录 | |
SNDRCVF (Send/Reveive File)(1) | 往显示文件中写记录,在用户回答后读记录 | |
WAIT (Wait) (1)
| 等待从显示文件发出的SNDF,RCVF或SNDRVF命令接收文件 | |
信息 | MONMSG (Monitor Message)(1) | 监控送往程序队列的逃逸,状态和通知信息 |
RCVMSG (Receive Message)(1) | 把信息从信息队列复制到一个CL变量中 | |
RMVMSG (Remove Message)(1) | 从信息队列取消信息 | |
RTVMSG (Retrieve Message)(1)
| 把预先定义的信息从信息文件复制到CL变量中 | |
SNDPGMMSG(Send Program Message)(1) | 往信息队列发送程序信息
| |
SNDRPY (Send Reply)(1) | 给查询信息的发送者发送回答信息 | |
SNDUSRMSG(Send User Message)(1)
| 给显示工作站或系统操作员发送消息或查询信息 | |
混杂命令 | CHKOBJ (Check Object) | 检查目标是否存在及使用目标必须有的权限 |
PRTCMDUSG (Print Command Usage)
| 产生一个用在某组CL过程中的一组命令中的交叉引用表 | |
RTVCFGSRC (Retrieve Configuration Source)
| 对生成的已存在的配置目标建立一个CL命令源码且把它放在源文件成员中 | |
RTVCFGSTS(RetrieveConfiguration Status)(1)
| 从三个配置目标(线路,控制器和设备)中取得配置状态 | |
RTVJOBA (Retrieve Job Attributes) (1)
| 取得一个或多个作业属性的值且把它们放到CL变量中 | |
RTVSYSVAL (Retrieve System Value)(1) | 取得系统值并且把它放到一个CL变量中 | |
RTVUSRPRF (Retrieve User Profile)(1) | 取得用户文件属性并把它放到CL变量中 | |
程序生成命令 | CRTCLMOD (Create CL Module) | 生成一个CL模块 |
DLTMOD (Delete Module) | 删除一个模块 | |
DLTPGM (Delete Program) | 删除一个程序 | |
CRTBNDCL (Create Bound Control Language Program) | 生成一个联编的CL程序 | |
CRTPGM (Create Program) | 生成一个程序 | |
CRTSRVPGM(Create Service Program) | 生成一个服务程序 |
AS/400上用CL将SPLF转化为AS/400的PF
就是通过CPYSPLF的命令,你可以提前create一个字段134位的PF文件然后通过以下的CL去copy
PGM PARM(STRJOB STRUSR STRNBR)
DCL VAR(STRJOB) TYPE(*CHAR) LEN(10)
DCL VAR(STRUSR) TYPE(*CHAR) LEN(10)
DCL VAR(STRNBR) TYPE(*CHAR) LEN(6)
CPYSPLF FILE(DCPRTMF) TOFILE(TEST/MFPC) +
JOB(STRNBR/STRUSR/STRJOB) TOMBR(MFPC) +
MBROPT(*REPLACE)
DLTSPLF FILE(DCPRTMF)
JOB(STRNBR/STRUSR/STRJOB)
ENDPGM
如何用CL知道session或者杀死文件
在命令行输入WRKCFGSTS *DEV 后按ENTER确认
在以下屏幕中检查 的状态是否是ACTIVE,如果不是ACTIVE用选项9,VARY ON参数将他们改成ACTIVE。
如果是自己的User 死了WRKUSRJOB, 去看
物理文件Lock 及lock在CL的查看
1.锁的五种类型
(1) Exclusive(*EXCL): 只有该锁的路径选择过程(routing step)才可能使用该对象;
在其他任务中的路径选择过程不能存取该对象。
(2) Exclusive-allow-read(*EXCLRD): 占用该锁的路径选择过程可能读或更新该对象,
而其他任务中的路径选择过程只能读它。
(3) Shared-for-update(*SHRUPD): 占用该锁的路径选择过程以及在其他任务中的路径
选择过程是可以读或更新该对象。
(4) Shared-no-update(*SHRNUP): 占用该锁的路径选择过程只可以读该对象;而在其他
任务中的路径选择过程也是只读该对象。
(5) Shared-for-read(*SHRRD): 占用该锁的路径选择过程只可以读该对象;而在其他
任务中的路径选择过程是可以读或更新该对象。
2. 缺省情况下,CL和HLL(高级语言程序)程序只在输入(I)物理文件成员的数据上放置*SHRRD锁,并在只输出(O)和输入-输出(U)物理文件成员的数据上放置*SHRUPD锁。
后面这一句不是很理解,为什么O/U类型的文件不放*EXCLRD锁呢?个人理解应是只允许当前程序更新, 别的程序只能读。需要高手指教!
3. 显示对象(object)和记录(record)的锁有三个命令:
(1) wrkobjlck: 查看由所有任务在一个对象上使用的lock。
(2) dsprcdlck(display record locks): 查看一个物理文件中已锁定的记录.
(3) dspjob: 查看一个任务的所有外部锁,包括已使用的那些锁和该任务正等待使用的那些锁。
Journal管理
如何为一个物理文件创建一个journal
Create one journal rceiver
Create one journal
Start one PF for the journal
多个相关数据库操作的回滚ROLBK及COMIT操作
COMIT和ROLBK主要目的是为了数据的统一性, 一般用在要同时对几个数据库进行增,删,改, 确保几个数据库都能正确写入,删除,更新数据, 在程序(CL或RPG都可以, 其他语言不清楚)中, 只有执行了COMIT命令后,数据操作才真正被执行。 只要任何一个数据库的操作出错, 可以用ROLBK命令将之前的数据回档。这样的程序, 如果因为某种原因(如被其他用户强行终止, 短电…)而终止,系统会自动ROLLBACK。
对需要进行COMIT的文件的声明:
FFILENAMEIPEAF…L…I…DEVICE+…KEXIT++ENTRY+A…U
FFILENAMEUF E K DISK KCOMIT
数据库纪录的写入或者更新等都不变,有变动的就是根据实际的条件进行确认或者回滚。
CL0N01N02N03FACTOR1+++OPCDEFACTOR2+++RESULTLENDHHILOEQCOMMENTS++++
C ROLBK
CL0N01N02N03FACTOR1+++OPCDEFACTOR2+++RESULTLENDHHILOEQCOMMENTS++++
C COMIT
带有COMIT的RPG程序一般通过CL程序进行调用,在调用这个程序的时候有一些针对COMIT的操作,包括:
1、创建日志和日志收集器 CRTJRN 和CRTJRNRCV
2、把PF加入日志 STRJRNPF
3、用CL 执行STRCMTCTL和 ENDCMTCTL上面具体用法去查CL REFERENCE
这样任何对该文件的修改都会记日志,当碰到COMIT 命令时确认修改,碰到ROLBK放弃更新.关于后两步的部分代码如下:
STRJRNPF FILE(FILENAME1) JRN(JOURNAL)
STRJRNPF FILE(FILENAME2) JRN(JOURNAL)
STRCMTCTL LCKLVL(*CHG)
CALL PGM(PGMNAME) PARM(&PARM1 &PARM2)
ENDCMTCTL
ENDJRNPF FILE(FILENAME1) JRN(JOURNAL)
ENDJRNPF FILE(FILENAME2) JRN(JOURNAL)
计划批处理任务WRKJOBSCDE
在主画面的命令行上输入WRKJOBSCDE后按(ENTER或CTRL)
因为没有权限,在网上截个图,这里是在具体的一天的时间去做备份,也可以是By weekly或者每周三后者每周四,你可以自己选择,这个就是比如UAT的是我们需要在固定的时候跑批或者固定时间跑back up 的时候可以用到