CICS provides various mechanisms for storing and sharing data between programs and transactions. Data areas allow applications to persist information across task boundaries and enable communication between different CICS components.
Temporary Storage Queues are named data areas that can be created, accessed, updated, and deleted by CICS programs. They are ideal for passing data between different transactions or storing intermediate results.
123456789101112131415WORKING-STORAGE SECTION. 01 TS-QUEUE. 10 TS-QID PIC X(8) VALUE 'ORDDATA'. PROCEDURE DIVISION. * Write to temporary storage EXEC CICS WRITEQ TS QUEUE(TS-QID) FROM(WS-ORDER-HEADER) LENGTH(LENGTH OF WS-ORDER-HEADER) RESP(WS-RESPONSE) END-EXEC. IF WS-RESPONSE NOT = DFHRESP(NORMAL) PERFORM HANDLE-TS-ERROR END-IF.
Transient Data Queues are used for sequential data processing and interface with external systems. They can be intrapartition (within CICS) or extrapartition (to JES or other systems).
12345678910111213141516WORKING-STORAGE SECTION. 01 TRANS-DATA-QUEUE PIC X(16) VALUE 'ORDER-QUEUE'. PROCEDURE DIVISION. * Write transaction data EXEC CICS WRITEQ TD QUEUE(TRANS-DATA-QUEUE) FROM(WS-TRANSACTION-RECORD) LENGTH(LENGTH OF WS-TRANSACTION-RECORD) RESP(WS-RESPONSE) END-EXEC. IF WS-RESPONSE = DFHRESP(NORMAL) DISPLAY 'Transaction queued successfully' ELSE PERFORM HANDLE-QUEUE-ERROR END-IF.
Shared data areas provide a way for multiple tasks to access common data with optional locking mechanisms. They are useful for maintaining configuration data, counters, or shared state.
12345678910111213EXEC CICS GET DATABASE DB(WS-DB-ID) DSNAME('CICSDATA.COUNTER') SET(BUFPTR) LENGTH(BUFLEN) RESP(WS-RESPONSE) END-EXEC. * Update shared counter ADD WS-INCREMENT TO COUNTER-VALUE (BUFPTR) EXEC CICS UPDATE DATABASE DB(WS-DB-ID) RESP(WS-RESPONSE) END-EXEC.
Write data to a temporary storage queue:
1234567891011121314151617181920* Write a single record EXEC CICS WRITEQ TS QUEUE(WS-QUEUE-ID) FROM(WS-RECORD-DATA) LENGTH(WS-RECORD-LENGTH) RESP(WS-RESPONSE) END-EXEC. * Write multiple records PERFORM VARYING WS-SUB FROM 1 BY 1 UNTIL WS-SUB > WS-RECORD-COUNT EXEC CICS WRITEQ TS QUEUE(WS-QUEUE-ID) FROM(WS-TABLE-ENTRY(WS-SUB)) RESP(WS-RESPONSE) END-EXEC IF WS-RESPONSE NOT = DFHRESP(NORMAL) DISPLAY 'TS write failed for record ' WS-SUB PERFORM HANDLE-TS-ERROR END-IF END-PERFORM.
Read data from temporary storage queues:
12345678910111213141516171819202122* Read all records sequentially MOVE ZERO TO WS-RECORD-NUMBER. PERFORM UNTIL WS-TS-END EXEC CICS READQ TS QUEUE(WS-QUEUE-ID) INTO(WS-RECORD-BUFFER) LENGTH(WS-RECORD-LENGTH) ITEM(WS-RECORD-NUMBER) RESP(WS-RESPONSE) RESP2(WS-RESPONSE2) END-EXEC. EVALUATE WS-RESPONSE WHEN DFHRESP(NORMAL) ADD 1 TO WS-RECORD-NUMBER PERFORM PROCESS-RECORD WHEN DFHRESP(END) SET WS-TS-END TO TRUE WHEN DFHRESP(END) DISPLAY 'TS read error: ' WS-RESPONSE2 SET WS-TS-END TO TRUE END-EVALUATE END-PERFORM.
Work with specific items on TSQ:
123456789101112131415161718192021222324* Read last item (most recent) EXEC CICS READQ TS QUEUE(WS-QUEUE-ID) INTO(WS-LAST-RECORD) ITEM(0) RESP(WS-RESPONSE) END-EXEC. * Update existing item EXEC CICS REWRITEQ TS QUEUE(WS-QUEUE-ID) FROM(WS-UPDATED-RECORD) ITEM(WS-ITEM-NUMBER) RESP(WS-RESPONSE) END-EXEC. * Delete specific item EXEC CICS READQ TS QUEUE(WS-QUEUE-ID) DELETE ITEM(WS-ITEM-NUMBER) RESP(WS-RESPONSE) END-EXEC. * Delete entire queue EXEC CICS DELETEQ TS QUEUE(WS-QUEUE-ID) RESP(WS-RESPONSE) END-EXEC.
Choose queue names that clearly indicate purpose and scope:
Always clean up temporary storage:
12345678910111213PROCEDURE DIVISION USING WS-TRANS-ID. PERFORM INITIALIZE-WORK-AREA PERFORM PROCESS-BUSINESS-LOGIC PERFORM CLEANUP-AREA CLEANUP-AREA. * Clean up any temporary queues created EXEC CICS DELETEQ TS QUEUE(WS-TEMP-QUEUE-ID) RESP(WS-RESPONSE) END-EXEC. * Ignore errors if queue doesn't exist EXEC CICS RETURN END-EXEC.
Always check response codes and implement appropriate error handling:
1234567891011121314151617181920EXEC CICS READQ TS QUEUE(WS-QUEUE-ID) INTO(WS-RECORD-BUFFER) LENGTH(WS-RECORD-LENGTH) RESP(WS-RESPONSE) RESP2(WS-RESPONSE2) END-EXEC. EVALUATE WS-RESPONSE WHEN DFHRESP(QIDERR) DISPLAY 'Queue ' WS-QUEUE-ID ' does not exist' PERFORM CREATE-QUEUE-IF-NEEDED WHEN DFHRESP(LENGERR) DISPLAY 'Data area too small, required length: ' WS-RESPONSE2 PERFORM ALLOCATE-LARGER-BUFFER WHEN DFHRESP(END) DISPLAY 'End of data reached' SET WS-PROCESSING-COMPLETE TO TRUE WHEN DFHRESP(NORMAL) PERFORM PROCESS-RECORD END-EVALUATE.
Design efficient data structures for TSQ usage:
12345678WORKING-STORAGE SECTION. 01 WS-TS-RECORD. 10 WS-RECORD-ID PIC 9(6). 10 WS-TIMESTAMP PIC X(26). 10 WS-DATA-FIELD PIC X(200). 10 WS-FILLER PIC X(10). 01 WS-TS-BUFFER PIC X(1000) VALUE SPACES.
TSQs can use main storage (high-speed) or auxiliary storage (disk):
1234567891011* Create in auxiliary storage (default) EXEC CICS WRITEQ TS QUEUE(WS-QUEUE-ID) FROM(WS-RECORD-DATA) AUXILIARY END-EXEC. * Create in main storage (for small, frequently accessed data) EXEC CICS WRITEQ TS QUEUE(WS-SMALL-QUEUE-ID) FROM(WS-SHORT-DATA) MAIN END-EXEC.
Create TSQs that are recoverable across system restarts:
123456789EXEC CICS WRITEQ TS QUEUE(WS-QUEUE-ID) FROM(WS-RECORD-DATA) RID(WS-RID-AREA) RESP(WS-RESPONSE) END-EXEC. IF WS-RESPONSE = DFHRESP(NORMAL) * RID provides restart recovery capability END-IF.
Process data within the same CICS region:
12345EXEC CICS WRITEQ TD QUEUE('INPROC') FROM(WS-TRANS-RECORD) LENGTH(LENGTH OF WS-TRANS-RECORD) RESP(WS-RESPONSE) END-EXEC.
Send data to JES for external processing:
12345EXEC CICS WRITEQ TD QUEUE('OUTPROC') FROM(WS-EXTRNL-RECORD) LENGTH(LENGTH OF WS-EXTRNL-RECORD) RESP(WS-RESPONSE) END-EXEC.
TDQs must be defined in CSD before use:
1234CEDA DEFINE TDQUEUE(ORDER-Q) GROUP(PROD-GROUP) IN(INTRA) OUT(EXTRA) * In = intrapartition, Out = extrapartition
Work with shared data areas:
123456789101112131415161718192021* Get exclusive access to shared data EXEC CICS GET DATABASE DB(WS-DB-ID) DSNAME('SHARED.CONFIG') SET(BUFPTR) LENGTH(BUFLEN) RESP(WS-RESPONSE) END-EXEC. * Update the shared configuration IF WS-RESPONSE = DFHRESP(NORMAL) MOVE 'UPDATED' TO CONFIG-STATUS (BUFPTR) EXEC CICS UPDATE DATABASE DB(WS-DB-ID) RESP(WS-RESPONSE) END-EXEC. END-IF * Release the shared data EXEC CICS FREE DATABASE DB(WS-DB-ID) RESP(WS-RESPONSE) END-EXEC.
Queue ID error - the queue doesn't exist or name is invalid:
1234IF WS-RESPONSE = DFHRESP(QIDERR) DISPLAY 'Queue ' WS-QUEUE-ID ' not found' PERFORM CREATE-DEFAULT-QUEUE END-IF.
Queue zero error - trying to access item 0 when queue is empty:
1234IF WS-RESPONSE = DFHRESP(QZERR) DISPLAY 'Queue is empty or item does not exist' PERFORM HANDLE-EMPTY-QUEUE END-IF.
Data length error - target area too small or source too large:
1234IF WS-RESPONSE = DFHRESP(LENGERR) DISPLAY 'Length error: RESP2=' WS-RESPONSE2 PERFORM ALLOCATE-PROPER-SIZE-BUFFER END-IF.
Optimize performance based on usage patterns:
Monitor available storage pool sizes:
12CEMT INQUIRE STORAGE POOL * Shows current usage and available space
Use CICS Explorer to monitor queues:
Use CEMT for queue administration:
1234CEMT INQUIRE TSQUEUE(*) STATUS(DISABLED) CEMT INQUIRE TSQUEUE(MYQUEUE) CEMT DISCARD TSQUEUE(TEMP-QUEUE) CEMT DISCARD TSQUEUE(ALL-DEFINED)