
Appendix D: CSARESCK Sample CSA
CSARESCK sample code
IDENTIFICATION DIVISION.
PROGRAM-ID. CSARESCK.
*****************************************************************
* SAMPLE CSA PROGRAM TO ILLUSTRATE ESTABLISHING A
* ConnectION TO SQL SERVER, EXECUTING A SQL REQUEST THAT HAS
* SEVERAL INSERT STATEMENTS - ONE OF WHICH IS BAD - AND THEN
* SCROLLING THROUGH THE GETMSG AND RESCHECK FEATURES TO DETER-
* MINE WHICH SQL COMMAND(S) RECEIVED AN ERROR.
*
* NOTE: THIS APPROACH FOR BATCHING SQL COMMANDS ONLY WORKS IN
* SITUATIONS WHERE SQL SERVER DOES NOT RECEIVE AN ERROR SEVERE
* ENOUGH TO CAUSE A ROLLBACK TRANSACTION (IN WHICH CASE THE CSA
* WILL ONLY RECEIVE ONE ERROR MESSAGE FOR THE ENTIRE BATCH OF
* COMMANDS). IF A ROLLBACK TRANSACTION DOES NOT OCCUR, THEN
* SQL SERVER WILL RETURN A SUCCESS/FAILURE MESSAGE FOR EACH OF
* THE BATCHED SQL COMMANDS.
*
* TRANSID IN PCT: CRES PROGRAM NAME IN PPT: CSARESCK
*****************************************************************
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
*****************************************************************
* POINTERS.
*****************************************************************
01 WS-POINTERS.
05 SPAREA-PTR POINTER.
05 SQLDA-PTR POINTER.
05 SQL-REQ-PTR POINTER.
*****************************************************************
* COUNTERS AND VARIOUS INTEGERS.
*****************************************************************
01 WS-VARIABLES.
05 CICSRC PIC S9(8) COMP VALUE +0.
05 RESCHECK-CNT PIC 9(3) VALUE ZEROES.
05 SPSTATUS-CNT PIC 9(3) VALUE ZEROES.
*****************************************************************
* ATTACHMENT DEFINITION NAME.
*****************************************************************
O1 ATTACH-NAME PIC X(08) VALUE 'MDIAWONG'.
*****************************************************************
* SWITCH FOR RESCHECK READS -
* THE IDEA IS TO KEEP CALLING RESCHECK UNTIL YOU'VE RECEIVED
* SPACES IN SPSTATUS TWICE IN A ROW - THEN YOU'RE DONE.
*****************************************************************
01 WS-SWITCHES.
03 WS-RESCHECK-DONE-SW PIC X VALUE 'N'.
88 RESCHECK-DONE VALUE 'Y'.
88 RESCHECK-NOT-DONE VALUE 'N'.
88 LAST-SPSTATUS-SPACES VALUE ' '.
*****************************************************************
* SQL STATEMENT TO EXECUTE.
*****************************************************************
01 MULTI-INSERT-STMT.
03 INSERT-1.
05 FILLER PIC X(30) VALUE
'INSERT INTO TESTABLE VALUES ('.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(03) VALUE '001'.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(02) VALUE ', '.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(16) VALUE
'RECORD NUMBER 01'.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(02) VALUE ', '.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(10) VALUE
'FIRST RECD'.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(04) VALUE ') '.
05 FILLER PIC X(1975) VALUE SPACES.
03 INSERT-2.
05 FILLER PIC X(30) VALUE
'INSERT INTO TESTABLE VALUES ('.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(03) VALUE '002'.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(02) VALUE ', '.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(16) VALUE
'RECORD NUMBER 02'.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(02) VALUE ', '.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(10) VALUE
'SECOND REC'.
05 FILLE PIC X(01) VALUE QUOTE.
05 FILLER PIC X(04) VALUE ') ; '.
03 INSERT-3-DUP.
05 FILLER PIC X(30) VALUE
'INSERT INTO TESTABLE VALUES ('.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(03) VALUE '002'.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(02) VALUE ', '.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(16) VALUE
'RECORD NUMBER 03'.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(02) VALUE ', '.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(10) VALUE
'THIRD RECD'.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(04) VALUE ') ; '.
03 INSERT-4.
05 FILLER PIC X(30) VALUE
'INSERT INTO TESTABLE VALUES ('.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(03) VALUE '004'.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(02) VALUE ', '.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(16) VALUE
'RECORD NUMBER 04'.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(02) VALUE ', '.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(10) VALUE
'FOURTH REC'.
'05 FILLER PIC X(01) VALUE QUOTE.
'05 FILLER PIC X(04) VALUE ') ; '.
03 INSERT-5-DUP.
05 FILLER PIC X(30) VALUE
'INSERT INTO TESTABLE VALUES ('.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(03) VALUE '004'.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(02) VALUE ', '.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(16) VALUE
'RECORD NUMBER 05'.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(02) VALUE ', '.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(10) VALUE
'FIFTH RECD'.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(04) VALUE ') ; '.
03 INSERT-6.
05 FILLER PIC X(30) VALUE
'INSERT INTO TESTABLE VALUES ('.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(03) VALUE '006'.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(02) VALUE ', '.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(16) VALUE
'RECORD NUMBER 06'.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(02) VALUE ', '.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(10) VALUE
'SIXTH RECD'.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(04) VALUE ') ; '.
03 INSERT-7-DUP.
05 FILLER PIC X(30) VALUE
'INSERT INTO TESTABLE VALUES ('.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(03) VALUE '006'.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(02) VALUE ', '.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(16) VALUE
'RECORD NUMBER 07'.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(02) VALUE ', '.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(10) VALUE
'7TH RECD'.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(04) VALUE ') ; '.
03 INSERT-8.
05 FILLER PIC X(30) VALUE
'INSERT INTO TESTABLE VALUES ('.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(03) VALUE '008'.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(02) VALUE ', '.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(16) VALUE
'RECORD NUMBER 08'.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(02) VALUE ', '.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(10) VALUE
'LAST RECD'.
05 FILLER PIC X(01) VALUE QUOTE.
05 FILLER PIC X(04) VALUE ') ; '.
*****************************************************************
* FLAGS.
*****************************************************************
01 WS-INIT-SPAREA-SW PIC X(01) VALUE '0'.
88 INIT-SPAREA-OK VALUE '1'.
88 INIT-SPAREA-BAD VALUE '0'.
01 WS-ATTACH-SW PIC X(01) VALUE '0'.
88 ATTACH-OK VALUE '1'.
88 ATTACH-BAD VALUE '0'.
*****************************************************************
* ERROR MESSAGES.
*****************************************************************
01 WS-STUB-ERROR-MSG.
03 FILLER PIC X(09)
VALUE 'CALL TO: '
03 WS-STUB-NAME PIC X(08) VALUE SPACES.
03 FILLER PIC X(18)
VALUE ' - RECEIVED SPRC: '
03 WS-STUB-SPRC PIC X(03) VALUE '000'.
03 FILLER PIC X(03) VALUE ' - '.
03 WS-STUB-SPMSG PIC X(100) VALUE SPACES.
01 WS-RESCHECK-LAST-MSG.
03 FILLER PIC X(30)
VALUE '- FINAL RESCHECK READ COUNT : '.
03 WS-RESCHECK-COUNT PIC 9(03) VALUE ZEROES.
01 WS-RESCHECK-MSG.
03 FILLER PIC X(33)
VALUE 'RESCHECK NON-BLANK STATUS - REC: '.
03 WS-RESCHECK-NUMBER PIC 9(03) VALUE ZEROES.
03 FILLER PIC X(16)
VALUE ' - SPSTATUS IS: '.
03 WS-SPSTATUS-OUT PIC X(02) VALUE SPACES.
03 FILLER PIC X(11)
VALUE ' - SPCODE: '.
03 WS-SPCODE-OUT PIC X(03) VALUE SPACES.
03 FILLER PIC X(09)
VALUE ' - SPRC: '.
03 WS-SPRC-OUT PIC X(03) VALUE SPACE.
03 FILLER PIC X(10)
VALUE ' - SPIND: '.
03 WS-SPIND-OUT PIC X(01) VALUE SPACE.
LINKAGE SECTION.
01 STORED-PROC-AREA.
COPY SPAREAC.
*****************************************************************
* SQL REQUEST BUFFER THAT WILL BE PASSED TO THE REMOTE SERVER VIA
* REQEXEC CALL. IT CONSISTS OF A HALFWORD LENGTH FIELD, AND THE
* ACTUAL REQUEST STATEMENT.
*****************************************************************
01 SQL-BUFFER.
03 SQL-LENGTH PIC S9(4) COMP.
03 SQL-REQUEST PIC X(3000).
*==============================================================*
PROCEDURE DIVISION.
*==============================================================*
0000-MAIN-PROCESSING.
PERFORM 1000-SPAREA-INIT.
IF INIT-SPAREA-OK
PERFORM 2000-ATTACH-TO-SERVER.
PERFORM 5000-EXEC-SQL-REQUEST
PERFORM 6000-RESCHECK-REARCH
UNTIL RESCHECK-DONE
PERFORM 7000-CLOSE-DETACH
PERFORM 9000-FINAL-COUNT
END-IF.
0000-GET-OUT-NOW.
EXEC CICS
RETURN
END-EXEC.
0000-EXIT.
EXIT.
*****************************************************************
* GET AN SPAREA, AND CALL CSA TO INITIALIZE IT.
*****************************************************************
1000-SPAREA-INIT.
EXEC CICS
DELETEQ TS QUEUE('CSEXQUE2') RESP(CICSRC)
END-EXEC.
EXEC CICS
GETMAIN SET(SPAREA-PTR)
LENGTH(LENGTH OF SPAREA)
NOSUSPEND
RESP(CICSRC)
END-EXEC.
IF CICSRC = DFHRESP(NORMAL)
SET ADDRESS OF STORED-PROC-AREA TO SPAREA-PTR
MOVE 'Y' TO SPTRCOPT
CALL 'CSSETUP' USING SPAREA
IF SPRC = '000'
SET INIT-SPAREA-OK TO TRUE
ELSE
MOVE 'CSSETUP' TO WS-STUB-NAME
PERFORM 6900-STUB-CALL-ERROR THRU 6900-EXIT
GO TO 0000-GET-OUT-NOW
END-IF
END-IF.
1000-EXIT.
EXIT.
*****************************************************************
* CALL CSA TO ATTACH TO REMOTE SERVER.
*****************************************************************
2000-ATTACH-TO-SERVER.
MOVE ATTACH-NAME TO SPATTACH.
CALL 'ATTACH' USING SPAREA.
IF SPRC = '000'
SET ATTACH-OK TO TRUE
ELSE
MOVE 'ATTACH' TO WS-STUB-NAME
PERFORM 6900-STUB-CALL-ERROR THRU 6900-EXIT
GO TO 0000-GET-OUT-NOW
END-IF.
2000-EXIT.
EXIT.
*****************************************************************
* EXECUTE THE SQL REQUEST AGAINST THE REMOTE SERVER.
*****************************************************************
5000-EXEC-SQL-REQUEST.
EXEC CICS
GETMAIN SET(SQL-REQ-PTR)
LENGTH(LENGTH OF SQL-BUFFER)
NOSUSPEND RESP(CICSRC)
END-EXEC.
SET ADDRESS OF SQL-BUFFER TO SQL-REQ-PTR.
SET SPSQL TO SQL-REQ-PTR.
IF CICSRC = DFHRESP(NORMAL)
MOVE MULTI-INSERT-STMT TO SQL-REQUEST
MOVE LENGTH OF MULTI-INSERT-STMT TO SQL-LENGTH
CALL 'REQEXEC' USING SPAREA
END-IF.
5000-EXIT.
EXIT.
*****************************************************************
* CHECK RESCHECK TO LOCATE SQL STATEMENT IN ERROR.
*****************************************************************
6000-RESCHECK-REARCH.
ADD 1 TO RESCHECK-CNT.
IF SPSTATUS NOT = ' '
MOVE 'N' TO WS-RESCHECK-DONE-SW
ADD 1 TO SPSTATUS-CNT
MOVE SPSTATUS-CNT TO WS-RESCHECK-NUMBER
MOVE SPSTATUS TO WS-SPSTATUS-OUT
MOVE SPCODE TO WS-SPCODE-OUT
MOVE SPRC TO WS-SPRC-OUT
MOVE SPIND TO WS-SPIND-OUT
EXEC CICS
WRITEQ TS QUEUE('CSEXQUE2')
FROM(WS-RESCHECK-MSG) NOSUSPEND
RESP(CICSRC)
END-EXEC
IF SPIND NOT = SPACES
PERFORM 6500-GET-MESSAGES UNTIL SPIND NOT = 'M'
END-IF
ELSE
IF LAST-SPSTATUS-SPACES
MOVE 'Y' TO WS-RESCHECK-DONE-SW
ELSE
MOVE ' ' TO WS-RESCHECK-DONE-SW
END-IF
END-IF.
IF NOT RESCHECK-DONE
CALL 'RESCHECK' USING SPAREA.
6000-EXIT.
EXIT.
*****************************************************************
* RETRIEVE ANY OUTSTANDING MESSAGES FOR A REQUEST.
*****************************************************************
6500-GET-MESSAGES.
CALL 'GETMSG' USING SPAREA.
IF SPMSG NOT = SPACES
EXEC CICS
WRITEQ TS QUEUE('CSEXQUE2')
FROM(SPMSG) NOSUSPEND
RESP(CICSRC)
END-EXEC
END-IF.
6500-EXIT.
EXIT.
*****************************************************************
* FORMAT AND WRITE STUB-CALL ERROR INFO TO TS QUEUE.
*****************************************************************
6900-STUB-CALL-ERROR.
MOVE SPRC TO WS-STUB-SPRC.
MOVE SPMSG TO WS-STUB-SPMSG.
EXEC CICS
WRITEQ TS QUEUE('CSEXQUE2')
FROM(WS-STUB-ERROR-MSG) NOSUSPEND
RESP(CICSRC)
END-EXEC.
6900-EXIT.
EXIT.
*****************************************************************
* FORMAT AND WRITE STUB-CALL ERROR INFO TO TS QUEUE.
*****************************************************************
7000-CLOSE-DETACH.
CALL 'DETACH' USING SPAREA.
IF SPRC NOT = '000'
MOVE 'DETACH' TO WS-STUB-NAME
PERFORM 6900-STUB-CALL-ERROR THRU 6900-EXIT
GO TO 0000-GET-OUT-NOW
END-IF.
7000-EXIT.
EXIT.
*****************************************************************
* SEND THE FINAL RESCHECK READ NUMBER TO TEMP STORAGE QUE
*****************************************************************
9000-FINAL-COUNT.
MOVE RESCHECK-CNT TO WS-RESCHECK-COUNT.
EXEC CICS
WRITEQ TS QUEUE('CSEXQUE2')
FROM(WS-RESCHECK-LAST-MSG) NOSUSPEND
RESP(CICSRC)
END-EXEC.
9000-EXIT.
EXIT.
*===============================================================*
* END OF PROGRAM.
*===============================================================*
|
Copyright © 2005. Sybase Inc. All rights reserved.
|
|
View this book as PDF 