RSP4C is an example of a COBOL II RSP written to handle keyword variables sent to it from the client application.
IDENTIFICATION DIVISION.
PROGRAM-ID. RSP4C.
******************************************************************
* RSP4C - DOCTORED STORED PROCEDURE *
* *
* THIS SAMPLE STORED PROCEDURE WAS WRITTEN TO USE A "STD" *
* OUTPUT PIPE AND KEYWORDS FOR ILLUSTRATION. IT REQUIRES AT *
* LEAST ONE KEYWORD/VALUE BE PASSED TO IT WHEN INVOKED.
*
* *
* USE PROCEDURE RSP4C &FIRSTKEYWORD=FIRSTVALUE ; *
* *
* THIS PROGRAM IS SET UP TO ACCEPT KEYWORDS OF UP TO 15 CHARS *
* IN LENGTH AND UP TO 28 CHARS FOR THE KEYWORD VALUES. ALL *
* KEYWORDS, KEYWORD VALUES, WILL BE RETURNED *
* THROUGH THE OUTPUT PIPE AS VERIFICATION. *
* *
* ALSO: 2 SPECIAL KEYWORDS ARE SET UP TO TEST ERROR MESSAGING *
* THE ERROR CONDITIONS SEND 'E' TO SPSTATUS *
* - ONE USING "MESSAGE" AND ONE USING "STATUS". *
* &ERRORMSG : 'E' TO SPSTATUS, MSG TO SPMSG, CALLS 'MESSAGE' *
* &MESSAGE : 'OK'TO SPSTATUS, MSG TO SPMSG, CALLS 'MESSAGE' *
* &STATUSMSG : 'E' TO SPSTATUS, MSG TO SPCODE, CALLS 'STATUS' *
* &STATNEMSG : 'OK'TO SPSTATUS, MSG TO SPCODE, CALLS 'STATUS' *
* *
******************************************************************
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
******************************************************************
* POINTERS TO INPUT AND OUTPUT RECORD AREA. *
******************************************************************
01 WS-POINTERS.
10 WS-OUTPUT-POINTER USAGE IS POINTER.
******************************************************************
* SWITCHES FOR RECORD PROCESSING CONTROL. *
******************************************************************
01 WS-SWITCHES.
10 WS-ERROR-MSG-SW PIC X(01) VALUE 'N'.
88 SEND-TEST-ERROR-MSG VALUE 'Y'.
88 NO-MSG-REQUIRED VALUE 'N'.
10 WS-ERROR-STATUS-MSG-SW PIC X(01) VALUE 'N'.
88 SEND-TEST-ERR-STATUS-MSG VALUE 'Y'.
88 NO-STATUS-REQUIRED VALUE 'N'.
10 WS-NOERR-STATUS-MSG-SW PIC X(01) VALUE 'N'.
88 SEND-NOERROR-STATUS-MSG VALUE 'Y'.
88 NO-ERROR-REQUIRED VALUE 'N'.
10 WS-ERROR-HAPPENED-SW PIC X(01) VALUE 'N'.
88 ERROR-HAPPENED VALUE 'Y'.
88 NO-ERROR-YET VALUE 'N'.
******************************************************************
* A NUMBER FOR INCRIMENTING. *
******************************************************************
01 WS-VARIABLES.
05 WS-INCRINUM PIC 99 VALUE ZEROES.
05 WS-DIS-NUM PIC 9(4) VALUE ZEROES.
05 VTABLE-CTR PIC S9(8) COMP VALUE 1.
05 ERROR-CHECK PIC X(15) VALUE
'&ERRORMSG '.
05 STATUS-CHECK PIC X(15) VALUE
'&STATUSMSG '.
05 STATNE-CHECK PIC X(15) VALUE
'&STATNEMSG '.
05 MESSNE-CHECK PIC X(15) VALUE
'&MESSAGE '.
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-OUT-KEYWORD-MSG.
10 FILLER PIC X(55) VALUE
'**--> THE FOLLOWING IS A LIST OF THE KEYWORDS SENT. '.
01 H-TABLE-NAME.
10 H-TABLE-NAME-T OCCURS 15 TIMES.
15 H-T-NAME PIC X.
01 H-TABLE-VALUE.
10 H-TABLE-VALUE-T OCCURS 28 TIMES.
15 H-T-VALUE PIC X.
01 WS-KEYWORD-REC.
10 WS-KEY-MSG-AREA.
15 FILLER PIC X(07) VALUE 'KEYW-> '.
15 WS-KEY-MSG-NUM PIC X(02) VALUE SPACES.
15 FILLER PIC X(01) VALUE ':'.
10 WS-KEYWORD-OUT PIC X(15) VALUE SPACES.
10 FILLER PIC X(02) VALUE '= '.
10 WS-KEY-VALUE-OUT.
15 FILLER PIC X(24) VALUE SPACES.
15 WS-KEY-VAL-LEN PIC X(04) VALUE SPACES.
* 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.
LINKAGE SECTION.
01 DFHCOMMAREA.
05 NOT-USED PIC X(1).
******************************************************************
* THIS IS THE ACTUAL SPAREA POINTER AND DEFINITION *
******************************************************************
01 LWKCOMMAREA.
COPY SPAREAC.
**************************************************************
* THIS IS THE MASK FOR THE KEYWORD VARIABLE TABLE THAT THE
* MAINFRAMECONNECT WILL CREATE FOR YOUR RSP TO PROCESS.
**************************************************************
01 KEYWORD-VTABLE.
10 VTABLE-SIZE PIC S9(8) COMP.
10 VTABLE-ENTRY OCCURS 0 TO 50 TIMES
DEPENDING ON VTABLE-SIZE
INDEXED BY VTABLE-INDEX.
15 VTABLE-NAME USAGE IS POINTER.
15 VTABLE-VALUE USAGE IS POINTER.
15 VTABLE-NAME-LENGTH PIC S9(4) COMP.
15 VTABLE-VALUE-LENGTH PIC S9(4) COMP.
**************************************************************
* THESE ARE THE DATA VARIABLES THAT THE KEYWORDS AND THE
* KEYWORD VALUES WILL BE PLACED INTO FOR ACCESS BY THE RSP.
* IN THIS CASE THE LENGTHS WERE SET TO 15 FOR KEYWORDS AND
* 28 FOR THE KEYWORD VALUE FOR TESTING PURPOSES.
**************************************************************
01 TABLE-NAME PIC X(15).
01 TABLE-VALUE PIC X(28).
01 LS-OUTPUT-REC.
10 LS-OUTPUT-DATA PIC X(55).
*============================================================*
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
CALL 'RPSETUP' USING SPAREA
ELSE
SET ADDRESS OF LWKCOMMAREA TO ADDRESS OF DFHCOMMAREA.
******************************************************
MOVE 'OK' TO SPSTATUS.
******************************************************************
* 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(55)
END-EXEC.
SET ADDRESS OF LS-OUTPUT-REC TO WS-OUTPUT-POINTER.
PERFORM 120-OPEN-OUTPUT-PIPE THRU 120-EXIT.
100-EXIT.
EXIT.
120-OPEN-OUTPUT-PIPE.
******************************************************************
* OPEN THE OUTPUT PIPE. *
******************************************************************
MOVE 'STD' TO SPFORMAT.
MOVE 55 TO SPMAXLEN.
MOVE 'OUTPUT' TO SPMODE.
*-------------------------------------------------------*
* AN OPEN PIPE WILL SET UP THE COLUMN INFORMATION, WHICH*
* WILL EVENTUALLY BE SENT TO THE CLIENT....... *
*-------------------------------------------------------*
CALL 'OPENPIPE' USING SPAREA.
******************************************************************
* IF OPEN FAILED, THEN ISSUE AN ERROR MESSAGE. *
******************************************************************
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.
PERFORM 510-KEYWORD-INPUT-CHECK THRU 510-EXIT.|
IF NO-ERROR-YET
PERFORM 520-PROCESS-KEYWORDS THRU 520-EXIT.
500-EXIT.
EXIT.
510-KEYWORD-INPUT-CHECK.
******************************************************************
* MAKE SURE AT LEAST ONE KEYWORD WAS SENT ALONG WITH PROGRAM *
******************************************************************
MOVE 0 TO WS-INCRINUM.
IF SPVARTAB = NULL
PERFORM 700-LOAD-KEYWORD-ERROR THRU 700-EXIT
GO TO 510-EXIT.
IF VTABLE-SIZE NOT > 0
PERFORM 700-LOAD-KEYWORD-ERROR THRU 700-EXIT
GO TO 510-EXIT.
SET ADDRESS OF KEYWORD-VTABLE TO SPVARTAB.
510-EXIT.
EXIT.
520-PROCESS-KEYWORDS.
PERFORM 522-SEND-KEYWORD-HEADING THRU 522-EXIT.
IF NO-ERROR-YET
PERFORM 524-READ-WRITE-KEYWORDS THRU 524-EXIT.
IF NO-ERROR-YET
PERFORM 548-TEST-FOR-ERR-KEY THRU 548-EXIT.
520-EXIT.
EXIT.
522-SEND-KEYWORD-HEADING.
MOVE WS-OUT-KEYWORD-MSG TO LS-OUTPUT-REC.
MOVE 55 TO SPRECLEN.
SET SPFROM TO ADDRESS OF LS-OUTPUT-REC.
*-------------------------------------------------------*
* 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
MOVE 'PUTPIPE ' TO ERROR1-CALL
PERFORM 800-ERROR-MESSAGE THRU 800-EXIT.
522-EXIT.
EXIT.
524-READ-WRITE-KEYWORDS.
******************************************************************
* OBTAIN THE KEYWORD VARIABLES AND DISPLAY THEM DOWN OUTPUT PIPE *
* THE KEYWORD VALUE LENGTH (VTABLE-VALUE-LENGTH(VTABLE-INDEX)) *
* PASSED FROM MAINFRAMECONNECT WILL BE PLACED AT THE LAST FOUR *
* BYTES OF THE KEYWORD VALUE DISPLAY. THIS WILL DEMONSTATE THE *
* WAY MAINFRAMECONNECT DETERMINES THE LENGTH OF THE KEYWORD *
* VALUE MAY NOT MATCH EXACTLY WHAT WAS SENT BECAUSE THE COUNTING *
* STOPS AT THE FIRST SPACE IF THE DATA IS NOT DELIMITED. *
* NOTE THAT THIS DOES NOT MEAN ONLY PART OF THE KEYWORD VALUE *
* DATA WAS SENT - IT ONLY MEANS THE COUNTING STOPS AT THE SPACE *
******************************************************************
PERFORM WITH TEST AFTER
VARYING VTABLE-INDEX FROM 1 BY 1
UNTIL VTABLE-SIZE = VTABLE-INDEX
SET ADDRESS OF TABLE-NAME TO VTABLE-NAME(VTABLE-INDEX)
MOVE TABLE-NAME TO H-TABLE-NAME
MOVE VTABLE-NAME-LENGTH(VTABLE-INDEX)
TO VTABLE-CTR
ADD 1 TO VTABLE-CTR
PERFORM UNTIL VTABLE-CTR > 16
MOVE SPACE TO H-T-NAME (VTABLE-CTR)
ADD 1 TO VTABLE-CTR
END-PERFORM
MOVE H-TABLE-NAME TO WS-KEYWORD-OUT
IF WS-KEYWORD-OUT = ERROR-CHECK
MOVE 'Y' TO WS-ERROR-MSG-SW
END-IF
IF WS-KEYWORD-OUT = STATUS-CHECK
MOVE 'Y' TO WS-ERROR-STATUS-MSG-SW
END-IF
IF WS-KEYWORD-OUT = STATNE-CHECK
MOVE 'Y' TO WS-NOERR-STATUS-MSG-SW
END-IF
IF WS-KEYWORD-OUT = MESSNE-CHECK
MOVE 'THIS IS YOUR NON ERROR MESSAGE TEXT.'
TO SPMSG
MOVE '14' TO SPCODE
CALL 'MESSAGE' USING SPAREA
END-IF
SET ADDRESS OF TABLE-VALUE
TO VTABLE-VALUE(VTABLE-INDEX)
MOVE TABLE-VALUE TO H-TABLE-VALUE
MOVE VTABLE-VALUE-LENGTH(VTABLE-INDEX)
TO VTABLE-CTR, WS-DIS-NUM
ADD 1 TO VTABLE-CTR
PERFORM UNTIL VTABLE-CTR > 29
MOVE SPACE TO H-T-VALUE (VTABLE-CTR)
ADD 1 TO VTABLE-CTR
END-PERFORM
MOVE H-TABLE-VALUE TO WS-KEY-VALUE-OUT
MOVE WS-DIS-NUM TO WS-KEY-VAL-LEN
ADD 1 TO WS-INCRINUM
MOVE WS-INCRINUM TO WS-KEY-MSG-NUM
MOVE WS-KEYWORD-REC TO LS-OUTPUT-REC
SET SPFROM TO ADDRESS OF LS-OUTPUT-REC
MOVE 55 TO SPRECLEN
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-PERFORM.
524-EXIT.
EXIT.
548-TEST-FOR-ERR-KEY.
******************************************************************
* TEST FOR ERROR MESSAGE REQUESTED - SEND ONE IF SO. *
******************************************************************
IF SEND-TEST-ERROR-MSG
MOVE 'N' TO WS-ERROR-MSG-SW
MOVE 'THIS IS YOUR ERROR MESSAGE TEXT.'
TO SPMSG
MOVE 'ERR54321' TO SPCODE
*-------------------------------------------------------*
* 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.
548-EXIT.
EXIT.
700-LOAD-KEYWORD-ERROR.
******************************************************************
* IF AT LEAST ONE KEYWORD IS NOT SUPPLIED - SEND MSG AND STOP. *
******************************************************************
SET ERROR-HAPPENED TO TRUE.
MOVE '* ERROR - NO KEYWORDS SENT' 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.
700-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 SEND-TEST-ERR-STATUS-MSG
OR ERROR-HAPPENED
MOVE 'N' TO WS-ERROR-MSG-SW
MOVE 'THIS IS YOUR STATUS MESSAGE TEXT.'
TO SPMSG
MOVE '-321' TO SPCODE
MOVE 'E' TO SPSTATUS
ELSE
IF SEND-NOERROR-STATUS-MSG
MOVE 'N' TO WS-ERROR-MSG-SW
MOVE 'THIS IS YOUR STATUS NOERROR TEXT.'
TO SPMSG
MOVE '12' TO SPCODE
MOVE 'OK' TO SPSTATUS
ELSE
MOVE 'OK' TO SPSTATUS
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.
| Copyright © 2005. Sybase Inc. All rights reserved. |
|
|