RSP8C is an example of an RSP written to handle variable text sent to it from the client application. The code in this sample RSP follows.
IDENTIFICATION DIVISION. PROGRAM-ID. RSP8C ****************************************************************** * RSP8C - DOCTORED STORED PROCEDURE * * * * THIS SAMPLE STORED PROCEDURE WAS WRITTEN TO USE A VARIABLE * * TEXT PARAMETER OF UP TO 10,000 BYTES AND ECHOES IT BACK THRU * * A STANDARD OUTPUT PIPE IN 50 BYTE INCREMENTS. * * * * USE PROCEDURE WITH DATA RSP8C 'THIS IS A VERY BIG PARAMETER' * * * * THE VARIABLE TEXT DOESN'T HAVE TO BE DELIMITED WITH QUOTES OR * * DOUBLE QUOTES. * ******************************************************************
ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION.
******************************************************************
* POINTERS TO INPUT AND OUTPUT RECORD AREA. *
******************************************************************
01 WS-SAMPLE-POINTER.
10 WS-OUTPUT-POINTER USAGE IS POINTER.
******************************************************************
* SWITCHES FOR RECORD PROCESSING CONTROL. *
******************************************************************
01 WS-SWITCHES.
10 WS-ERROR-HAPPENED-SW PIC X(01) VALUE 'N'.
88 ERROR-HAPPENED VALUE 'Y'.
88 NO-ERROR-YET VALUE 'N'.
10 WS-OUTPUT-DONE-SW PIC X(01) VALUE 'N'.
88 OUTPUT-DONE VALUE 'Y'.
88 MORE-OUTPUT VALUE 'N'.
* THIS SWITCH IS USED FOR TESTING IF RPC CALL
77 RSPRPC-SWITCH PIC S9(4) COMP VALUE 0.
88 RPC-CALL VALUE 0.
01 COMMAREA-POINTER USAGE IS POINTER.
******************************************************************
* A NUMBER FOR INCREMENTING. *
******************************************************************
01 WS-VARIABLES.
05 WS-INCRINUM PIC 99 VALUE ZEROES.
05 VTABLE-CTR PIC S9(8) COMP VALUE 0.
05 WS-LEN-HOLD PIC 9(4) VALUE ZEROES.
01 MESSAGES.
05 ERROR1-MSG.
07 ERROR1-TEXT1 PIC X(19) VALUE
'ERROR WITH CALL TO '.
07 ERROR1-CALL PIC X(10) VALUE SPACES.
07 ERROR1-TEXT2 PIC X(14) VALUE
' - SPRC CODE: '.
07 ERROR1-SPRC PIC X(03) VALUE SPACES.
******************************************************************
* OUTPUT RECORD DESCRIPTION. *
******************************************************************
01 WS-OUTPUT-REC.
10 WS-OUT-MSG-AREA.
15 FILLER PIC X(07) VALUE 'REC#-> '.
15 WS-OUT-MSG-NUM PIC X(02) VALUE SPACES.
15 FILLER PIC X(01) VALUE ':'.
10 WS-OUT-SOME-DATA PIC X(50) VALUE SPACES.
01 WS-OUT-DATA-MSG.
10 FILLER PIC X(55) VALUE
'**--> THE FOLLOWING IS 50 BYTE BLOCKS OF VARIABLE TEXT '.
10 FILLER PIC X(05) VALUE 'RECVD'.
01 V-TABLE-BLOCKS.
10 V-TABLE-BLOCKS-T OCCURS 200 TIMES.
15 V-ROW PIC X(50) VALUE SPACES.
01 WS-VTABLE-REC.
10 WS-VTABLE-AREA.
15 FILLER PIC X(33) VALUE
'THIS IS THE LENGTH IN SPVARLEN : '.
15 WS-VTABLE-NUM PIC X(04) VALUE SPACES.
15 FILLER PIC X(03) VALUE SPACES.
LINKAGE SECTION.
**************************************************************
* THE LINKAGE SECTION DEFINES MASKS FOR DATA AREAS THAT ARE
* PASSED BETWEEN THIS PROGRAM AND MAINFRAMECONNECT.
**************************************************************
******************************************************************
* LINKAGE TO CALLING PROGRAM *
******************************************************************
01 DFHCOMMAREA.
05 NOT-USED PIC X(1).
05 DUMMY-AREA PIC X(1).
******************************************************************
* THIS IS THE ACTUAL SPAREA POINTER AND DEFINITION *
******************************************************************
01 LWKCOMMAREA.
COPY SPAREAC.
******************************************************************
* VARIABLE FOR ALL INCOMING VARIABLE TEXT PARAMETERS *
******************************************************************
01 INPUT-VALUE PIC X(10000).
01 WS-OUTPUT-RECORD.
10 WS-OUTPUT-DATA PIC X(60).
*================================================================* PROCEDURE DIVISION. *================================================================*
000-MAIN-PROCESSING.
PERFORM 100-INITIALIZE THRU 100-EXIT.
IF NO-ERROR-YET
PERFORM 500-PROCESS-I-O THRU 500-EXIT.
PERFORM 900-WRAP-UP THRU 900-EXIT.
EXEC CICS
RETURN
END-EXEC.
GOBACK.
000-EXIT.
EXIT.
100-INITIALIZE.
******************************************************
* IF THIS IS A RPC CALL, CALL RPSETUP TO INITIALIZE SPAREA
* AND OPEN SERVER (TRANSACTION ROUTER SERVICE)
* IF THIS IS A RSP CALL, SPAREA IS PASSED IN THE COMMAREA.
* (DIRECTCONNECT).
* FOR TRACING, MOVE 'Y' TO SPTRCOPT
******************************************************
MOVE EIBCALEN TO RSPRPC-SWITCH.
IF RPC-CALL
EXEC CICS GETMAIN
SET (COMMAREA-POINTER)
FLENGTH (LENGTH OF LWKCOMMAREA)
END-EXEC
SET ADDRESS OF LWKCOMMAREA TO COMMAREA-POINTER
MOVE 'Y' TO SPTRCOPT
CALL 'RPSETUP' USING SPAREA
ELSE
SET ADDRESS OF LWKCOMMAREA TO ADDRESS OF DFHCOMMAREA
MOVE 'Y' TO SPTRCOPT.
MOVE 'OK' TO SPSTATUS.
PERFORM 110-ESTABLISH-INPUT THRU 110-EXIT.
******************************************************************
* ALLOCATE A BLOCK OF STORAGE TO BE USED FOR THE DATA
* SET POINTER VARIABLE TO ADDRESS OF ALLOCATED STORAGE
******************************************************************
EXEC CICS
GETMAIN SET(WS-OUTPUT-POINTER)
LENGTH(60)
END-EXEC.
SET ADDRESS OF WS-OUTPUT-RECORD TO WS-OUTPUT-POINTER.
IF NO-ERROR-YET
PERFORM 120-OPEN-OUTPUT-PIPE THRU 120-EXIT.
100-EXIT.
EXIT.
110-ESTABLISH-INPUT.
IF SPVARLEN < 1
SET ERROR-HAPPENED TO TRUE
MOVE 'NO PARMS' TO ERROR1-CALL
PERFORM 800-ERROR-MESSAGE THRU 800-EXIT
GO TO 110-EXIT
ELSE
MOVE SPVARLEN TO WS-LEN-HOLD
MOVE WS-LEN-HOLD TO WS-VTABLE-NUM
MOVE WS-VTABLE-REC TO SPMSG
MOVE 'OK' TO SPSTATUS
*-------------------------------------------------------*
* MESSAGE WILL WRITE THE 100 BYTE SPMSG TO A MSG BUFFER,*
* WHICH WILL EVENTUALLY BE WRITTEN TO THE CLIENT *
* APPLICATION *
*-------------------------------------------------------*
CALL 'MESSAGE' USING SPAREA.
SET ADDRESS OF INPUT-VALUE TO SPVARTXT.
MOVE INPUT-VALUE (1:SPVARLEN) TO V-TABLE-BLOCKS.
IF V-ROW (1) = SPACES
SET ERROR-HAPPENED TO TRUE
MOVE 'SPACES ' TO ERROR1-CALL
PERFORM 800-ERROR-MESSAGE THRU 800-EXIT.
IF V-ROW (1) = LOW-VALUES
SET ERROR-HAPPENED TO TRUE
MOVE 'LOWVALUE' TO ERROR1-CALL
PERFORM 800-ERROR-MESSAGE THRU 800-EXIT.
110-EXIT.
EXIT.
120-OPEN-OUTPUT-PIPE.
MOVE 'STD' TO SPFORMAT.
MOVE 60 TO SPMAXLEN.
MOVE 'OUTPUT' TO SPMODE.
*-------------------------------------------------------*
* AN OPEN PIPE WILL SET UP THE COLUMN INFORMATION, WHICH*
* WILL EVENTUALLY BE SENT TO THE CLIENT APPLICATION *
*-------------------------------------------------------*
CALL 'OPENPIPE' USING SPAREA.
IF SPRC NOT = '000'
SET ERROR-HAPPENED TO TRUE
MOVE 'OPENPIPE' TO ERROR1-CALL
PERFORM 800-ERROR-MESSAGE THRU 800-EXIT.
120-EXIT.
EXIT.
500-PROCESS-I-O.
IF NO-ERROR-YET
PERFORM 540-PROCESS-DATA-RECS THRU 540-EXIT.
500-EXIT.
EXIT.
540-PROCESS-DATA-RECS.
******************************************************************
* OBTAIN VARIABLE TEXT SENT WITH PROGRAM. *
******************************************************************
MOVE 0 TO WS-INCRINUM.
PERFORM 542-SEND-RECORDS-HEADING THRU 542-EXIT.
IF NO-ERROR-YET
PERFORM 544-READ-WRITE-RECORDS THRU 544-EXIT
UNTIL OUTPUT-DONE OR ERROR-HAPPENED.
540-EXIT.
EXIT.
542-SEND-RECORDS-HEADING.
IF SPSTATUS = 'OK'
MOVE WS-OUT-DATA-MSG TO WS-OUTPUT-RECORD
MOVE 60 TO SPRECLEN
SET SPFROM TO ADDRESS OF WS-OUTPUT-RECORD
*-------------------------------------------------------*
* PUTPIPE SENDS A RESULT ROW TO THE OUTPUT BUFFER, WHICH*
* WHICH WILL EVENTUALLY BE WRITTEN TO THE CLIENT *
* APPLICATION *
*-------------------------------------------------------*
CALL 'PUTPIPE' USING SPAREA
IF SPRC NOT = '000'
SET ERROR-HAPPENED TO TRUE
MOVE 'PUTPIPE ' TO ERROR1-CALL
PERFORM 800-ERROR-MESSAGE THRU 800-EXIT
END-IF
END-IF.
542-EXIT.
EXIT.
544-READ-WRITE-RECORDS.
******************************************************************
* LOOP THROUGH VARIABLE TEXT TABLE AND SEND BACK TO CLIENT IN *
* 50-BYTE CHUNKS UNTIL ALL ARE RETURNED. *
******************************************************************
ADD 1 TO WS-INCRINUM,
VTABLE-CTR.
IF V-ROW (VTABLE-CTR) IS = SPACES
OR V-ROW (VTABLE-CTR) IS = LOW-VALUES
OR VTABLE-CTR > 200
IF VTABLE-CTR = 1
MOVE WS-INCRINUM TO WS-OUT-MSG-NUM
MOVE V-ROW (VTABLE-CTR) TO WS-OUT-SOME-DATA
MOVE WS-OUTPUT-REC TO WS-OUTPUT-RECORD
SET SPFROM TO ADDRESS OF WS-OUTPUT-RECORD
*-------------------------------------------------------*
* PUTPIPE SENDS A RESULT ROW TO THE OUTPUT BUFFER, *
* WHICH WILL EVENTUALLY BE WRITTEN TO THE CLIENT *
* APPLICATION *
*-------------------------------------------------------*
CALL 'PUTPIPE' USING SPAREA
IF SPRC NOT = '000'
SET ERROR-HAPPENED TO TRUE
MOVE 'PUTPIPE ' TO ERROR1-CALL
PERFORM 800-ERROR-MESSAGE THRU 800-EXIT
END-IF
END-IF
SET OUTPUT-DONE TO TRUE
ELSE
MOVE WS-INCRINUM TO WS-OUT-MSG-NUM
MOVE V-ROW (VTABLE-CTR) TO WS-OUT-SOME-DATA
MOVE WS-OUTPUT-REC TO WS-OUTPUT-RECORD
SET SPFROM TO ADDRESS OF WS-OUTPUT-RECORD
*-------------------------------------------------------*
* PUTPIPE SENDS A RESULT ROW TO THE OUTPUT BUFFER, WHICH*
* WILL EVENTUALLY BE SENT DOWN TO THE CLIENT APPLICATION*
*-------------------------------------------------------*
CALL 'PUTPIPE' USING SPAREA
IF SPRC NOT = '000'
SET ERROR-HAPPENED TO TRUE
SET OUTPUT-DONE TO TRUE
MOVE 'PUTPIPE ' TO ERROR1-CALL
PERFORM 800-ERROR-MESSAGE THRU 800-EXIT
END-IF
END-IF.
544-EXIT.
EXIT.
800-ERROR-MESSAGE.
******************************************************************
* SOMETHING FAILED, SO ISSUE AN ERROR MESSAGE AND GET OUT. *
******************************************************************
MOVE SPRC TO ERROR1-SPRC.
MOVE ERROR1-MSG TO SPMSG.
MOVE 'E' TO SPSTATUS.
*-------------------------------------------------------*
* MESSAGE WILL WRITE THE 100 BYTE SPMSG TO A MSG BUFFER,*
* WHICH WILL EVENTUALLY BE WRITTEN TO THE CLIENT *
* APPLICATION *
*-------------------------------------------------------*
CALL 'MESSAGE' USING SPAREA.
IF SPRC NOT = '000'
SET ERROR-HAPPENED TO TRUE.
800-EXIT.
EXIT.
900-WRAP-UP.
******************************************************************
* CLOSE PIPES - ISSUE STATUS. *
******************************************************************
IF NO-ERROR-YET
MOVE 'OUTPUT' TO SPMODE
*-------------------------------------------------------*
*CLOSEPIPE IS LIKE CLOSING A FILE, PLACES AN EOF MARKER*
*-------------------------------------------------------*
CALL 'CLOSPIPE' USING SPAREA
IF SPRC NOT = '000'
SET ERROR-HAPPENED TO TRUE
MOVE 'CLOSPIPE' TO ERROR1-CALL
PERFORM 800-ERROR-MESSAGE THRU 800-EXIT.
IF NO-ERROR-YET
MOVE 'OK' TO SPSTATUS
ELSE
MOVE 'E' TO SPSTATUS
MOVE 'MYERCODE' TO SPCODE
END-IF.
*-----------------------------------------------------------*
* CALLING STATUS WILL FLUSH ANY RESULTS AND/OR *
* MESSAGES FROM THE BUFFERS, TO THE CLIENT APPLICATION *
*-----------------------------------------------------------*
CALL 'STATUS' USING SPAREA.
IF SPRC NOT = '000'
SET ERROR-HAPPENED TO TRUE
MOVE 'STATUS ' TO ERROR1-CALL
PERFORM 800-ERROR-MESSAGE THRU 800-EXIT
END-IF.
********************************************************
* CLOSE OPEN SERVER
* IF THIS IS AN RPC CALL, PERFORM OPEN SERVER CLOSE
********************************************************
IF RPC-CALL
CALL 'RPDONE' USING SPAREA.
900-EXIT.
EXIT.