CICS的临时存储队列操作
CICS临时存储(CICS Temporary Storage)以一组队列(CICS Temporary Storage Queues或简称TS Queues)的形式实现。说是“队列”,其实不是严格数据结构意义上的FIFO队列,而是一个对数据记录(Record)标识(Identify)并顺序存储的机构,以供CICS-COBOL程序访问。
每个队列都有一个队列名queue name或队列数据标识data-id唯一识别。通常队列创建用户可以用其程序的EIBTRMID(终端号terminal-id)作为队列名的一部分以保证所创队列不重名。
每个加入队列的记录都被系统赋予一个记录号item number,从1开始。这不是数据记录本身的一部分。应用程序能用记录号顺序或随机访问队列中的数据。
一组队列可以存储在一个名叫temporary storage file或DFHTEMP的VSAM顺序文件中或在主存储Main Storage中。
1. 用于写临时存储的CICS-EXEC命令
EXEC CICS WRITEQ TS {QUEUE | QNAME}(队列名称) // 花括号表示这其中两个词都可用,队列名称长1~16字符 FROM(对应要写的COBOL数据变量名称) [ITEM(含记录号的COBOL变量) REWRITE] // 这个是用来更新一个已有记录的 [NUMITEMS(用于承载此次操作后队列长度的COBOL变量)] [MAIN | AUXILIARY] // 指定是否在主存储还是在DFHTEMP中 END-EXEC
因此,对于添加一个记录(如果指定的队列不存在,CICS会自动创建一个这个名称的队列):
EXEC CICS WRITEQ TS QUEUE(TS-QUEUE-NAME) FROM(TS-QUEUE-RECORD) END-EXEC.
对于更改一个记录(如果指定的队列不存在,会发QIDERR异常条件;如果指定的记录不存在,会发ITEMERR异常条件):
EXEC CICS WRITEQ TS QUEUE(TS-QUEUE-NAME) FROM(TS-QUEUE-RECORD) ITEM(TS-ITEM-NUMBER) REWRITE RESP(RESPONSE-CODE) END-EXEC.
2. 用于读临时存储的CICS-EXEC命令
EXEC CICS READQ TS {QUEUE | QNAME}(队列名称) INTO(承载读得记录的COBOL变量) [ITEM(含记录号的COBOL变量或常量) | NEXT] // 如果选NEXT则读下一条记录 [NUMITEMS(用于承载队列长度的COBOL变量)] END-EXEC
于是,对于读一个指定记录(随机读取):
EXEC CICS READQ TS QUEUE(TS-QUEUE-NAME) INTO(TS-QUEUE-RECORD) ITEM(TS-ITEM-NUMBER) RESP(RESPONSE-CODE) END-EXEC.读取下一条记录(顺序读取):
EXEC CICS READQ TS QUEUE(TS-QUEUE-NAME) INTO(TS-QUEUE-RECORD) NEXT END-EXEC.无论顺序还是随机读取,如果指定队列不存在,抛出QIDERR异常条件;如果随机读取中的记录号不存在,抛出ITEMERR异常条件。
由于CICS系统中任务对队列的访问都可能造成顺序读取的位置异常,所以使用顺序读取应该用CICS ENQ锁守住队列。
3. 删除队列的CICS-EXEC命令
EXEC CICS DELETEQ TS {QUEUE | QNAME}(队列名称) END-EXEC
如果队列不存在抛QIDERR异常条件。如果不删除队列,则队列无限期地在那儿。CICS临时存储没有提供删除个别记录的功能,故只能删除整个队列。
一个实例是可以用于CICS伪会话事务(Pseudo-conversational Transactions)中保存跨调用的数据(取代通信区,Communication Area)。例如可以用这个临时存储的设施临时存放一个任务在响应用户请求时从VSAM中读取的准备操作的用户数据;当程序返回给用户确认,然后在另一次调用中具体执行这个用户请求时,再读一次VSAM记录和临时区间记录比照,如果相等则执行,否则则说明记录以改不能继续。这个例子中每次只关心一条记录,所以多次执行会在区域中残存很多记录,程序要负责在事务开始和结束时创建和清理这个临时数据。