
Appendix B: MODELRSP DB2 Output Pipe Sample RSP
MODELRSP DB2
output pipe sample code
IDENTIFICATION DIVISION.
PROGRAM-ID. MODELRSP.
AUTHOR. SYBASE ICD.
DATE-WRITTEN. SEPTEMBER 15, 1993.
*****************************************************************
* MODELRSP - SAMPLE TO ILLUSTRATE SQLDA USAGE. *
* *
* THIS SAMPLE STORED PROCEDURE HAS A LOT OF INTERNAL *
* DOCUMENTATION TO HELP EXPLAIN AND ILLUSTRATE THE PROPER *
* USAGE OF THE SQLDA FOR A DB2 OUTPUT PIPE. A ROW IS SET UP *
* FOR ALL DATATYPES AND ALL WILL BE SET TO ALLOW NULLS. *
* *
*****************************************************************
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 FILLER PIC X(27) VALUE
'WORKING-STORAGE STARTS HERE'.
01 COMMAREA-POINTER USAGE IS POINTER.
01 SQLDA-POINTER USAGE IS POINTER.
01 EMPLOYEE-DATA-POINTER USAGE IS POINTER.
01 INDICATOR-VAR-POINTER USAGE IS POINTER.
01 SQLDA-SIZE PIC S9(8) COMP.
01 WS-LITERALS.
05 WS-STATUS PIC X(06) VALUE 'STATUS'.
05 WS-MESSAGE PIC X(07) VALUE 'MESSAGE'.
05 WS-COMMIT PIC X(06) VALUE 'COMMIT'.
05 WS-ROLLBACK PIC X(08) VALUE 'ROLLBACK'.
05 WS-OPENPIPE PIC X(08) VALUE 'OPENPIPE'.
05 WS-PUTPIPE PIC X(07) VALUE 'PUTPIPE'.
05 WS-GETPIPE PIC X(07) VALUE 'GETPIPE'.
05 WS-CLOSPIPE PIC X(08) VALUE 'CLOSPIPE'.
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.
05 ERROR2-MSG.
07 ERROR2-TEXT2 PIC X(46) VALUE SPACES.
05 WS-LONG-VARCHAR-TEXT.
07 FILLER PIC X(50) VALUE
'THIS IS A LINE OF VERY LONG TEXT TO DEMONSTRATE TH'.
07 FILLER PIC X(50) VALUE
'AT A LONG VARCHAR DATATYPE CAN BE SENT DOWN A DB2 '.
07 FILLER PIC X(50) VALUE
'OUTPUT PIPE WITH NO PROBLEMS, WORRIES, OR CONSTERN'.
07 FILLER PIC X(50) VALUE
'ATION, AS LONG AS ONE REMEMBERS THAT LARGE AMOUNTS'.
07 FILLER PIC X(50) VALUE
' OF DATA WILL ALWAYS HAVE AN ELEMENT OF UNEXPECTED'.
07 FILLER PIC X(50) VALUE
'NESS. EVEN SO, USE SYBASE FOR ALL YOUR SOLUTIONS.'.
******************************************************************
* DESCRIPTION OF THE MODEL SQLDA *
******************************************************************
*
* SQLTYPES USED IN SQLDA:
* VALUE DATA TYPE NULLS ALLOWED
* ======= =================== =============
* 384/385 DATE NO/YES
* 388/389 TIME NO/YES
* 392/393 TIMESTAMP NO/YES
* 448/449 CHAR VARIABLE LENG NO/YES
* 452/453 CHAR FIXED LENGTH NO/YES
* 456/457 CHAR LONG VARIABLE NO/YES
* 480/481 FLOATING-POINT NO/YES
* 484/485 DECIMAL NO/YES
* 496/497 LARGE INTEGER NO/YES
* 500/501 SMALL INTEGER NO/YES
********************************************************
* NOTE: ALL DATATYPES IN THIS EXAMPLE ARE DEFINED AS NULLABLE
********************************************************
*------------------------------------------------------------*
* MODEL-SQLDA IS USED TO HOLD THE COLUMN DESCRIPTIONS IN *
* WORKING STORAGE. THIS IS DONE THIS WAY BECAUSE YOU CANNOT *
* USE VALUE CLAUSES IN A COBOL LINKAGE SECTION.... *
*------------------------------------------------------------*
01 MODEL-SQLDA.
* - EYE CATCHER - MUST ALWAYS SAY 'SQLDA '.
03 MS-SQLAID PIC X(08) VALUE 'SQLDA '.
* - SIZE OF SQLDA = 16 + (44 * SQLN VALUE)
03 MS-SQLDABC PIC S9(8) COMP VALUE 500.
* - NUMBER OF SQLVAR OCCURENCES
* - MUST MATCH VALUE OF MS-SQLD
03 MS-SQLN PIC S9(4) COMP VALUE 11.
* - NUMBER OF SQLVAR OCCURENCES ACTUALLY USED
* - MUST MATCH VALUE OF MS-SQLN
03 MS-SQLD PIC S9(4) COMP VALUE 11.
03 MS-COL01.
* - 1ST COLUMN DATATYPE = FIXED CHAR (LENGTH 1 - 256)
05 MS-COL01-SQLTYPE PIC S9(4) COMP VALUE 453.
05 MS-COL01-SQLLEN PIC S9(4) COMP VALUE 5.
* - SQLDATA WILL BE SET TO ADDRESS OF DATA FIELD
05 MS-COL01-SQLDATA USAGE IS POINTER.
* - SQLIND WILL BE SET TO ADDRESS OF A S9(4) COMP FIELD
* - WHEN COMP FIELD'S VALUE IS LESS THAN ZERO THEN
* - COLUMN IS NULL - ONLY USED WHEN COLUMN IS NULLABLE
05 MS-COL01-SQLIND USAGE IS POINTER VALUE NULL.
* - SQLNAMEL IS THE LENGTH OF THE COLUMN NAME
05 MS-COL01-SQLNAMEL PIC S9(4) COMP VALUE 10.
* - SQLNAME IS ALWAYS 30 IN LENGTH
05 MS-COL01-SQLNAME PIC X(30) VALUE 'FIXED_CHAR'.
03 MS-COL02.
* - 2ND COLUMN DATATYPE = DATE (LENGTH ALWAYS 10)
05 MS-COL02-SQLTYPE PIC S9(4) COMP VALUE 385.
05 MS-COL02-SQLLEN PIC S9(4) COMP VALUE 10.
05 MS-COL02-SQLDATA USAGE IS POINTER.
05 MS-COL02-SQLIND USAGE IS POINTER VALUE NULL.
05 MS-COL02-SQLNAMEL PIC S9(4) COMP VALUE 4.
05 MS-COL02-SQLNAME PIC X(30) VALUE 'DATE'.
03 MS-COL03.
* - 3RD COLUMN DATATYPE = VARIABLE LENGTH CHAR (1-256)
05 MS-COL03-SQLTYPE PIC S9(4) COMP VALUE 449.
05 MS-COL03-SQLLEN PIC S9(4) COMP VALUE 30.
05 MS-COL03-SQLDATA USAGE IS POINTER
05 MS-COL03-SQLIND USAGE IS POINTER VALUE NULL.
05 MS-COL03-SQLNAMEL PIC S9(4) COMP VALUE 7.
05 MS-COL03-SQLNAME PIC X(30) VALUE 'VARCHAR'.
03 MS-COL04.
* - 4TH COL - DATATYPE = SMALL INTEGER (LENGTH ALWAYS 2)
* - CORRESPONDING PIC S9(4) COMP - UP TO 5 DIGITS.
05 MS-COL04-SQLTYPE PIC S9(4) COMP VALUE 501.
05 MS-COL04-SQLLEN PIC S9(4) COMP VALUE 2.
05 MS-COL04-SQLDATA USAGE IS POINTER.
05 MS-COL04-SQLIND USAGE IS POINTER VALUE NULL.
05 MS-COL04-SQLNAMEL PIC S9(4) COMP VALUE 9.
05 MS-COL04-SQLNAME PIC X(30) VALUE 'SMALL_INT'.
03 MS-COL05.
* - 5TH COL - DATATYPE = PACKED DECIMAL
05 MS-COL05-SQLTYPE PIC S9(4) COMP VALUE 485.
*--------------------------------------------------------------*
* - NOTE: FOR PACKED DECIMAL DATATYPES ONLY!!!!! *
* - LENGTH IS DECIMAL TRANSLATION OF HEX "PPSS" *
* (PRECISION AND SCALE) *
* - WHERE "PP" = NUMBER OF TOTAL DIGITS *
* - AND "SS" = NUMBER OF DIGITS TO RIGHT OF DECIMAL *
* - S9(3)V99 COMP-3 WOULD BE X'0502' OR IN DEC '1282' *
* - S9(11)V99 COMP-3 WOULD BE X'0D02' OR IN DEC '3330' *
* - SQLLEN = (PP * 256) + SS *
* - 1282=5*256+2==> FOR S9(3)V99 *
*--------------------------------------------------------------*
05 MS-COL05-SQLLEN PIC S9(4) COMP VALUE +1282.
05 MS-COL05-SQLDATA USAGE IS POINTER.
05 MS-COL05-SQLIND USAGE IS POINTER VALUE NULL.
05 MS-COL05-SQLNAMEL PIC S9(4) COMP VALUE 10.
05 MS-COL05-SQLNAME PIC X(30) VALUE 'PACKED_DEC'.
03 MS-COL06.
* - 6TH COL - DATATYPE = TIME (LENGTH ALWAYS 8) 'HH.MM.SS'
05 MS-COL06-SQLTYPE PIC S9(4) COMP VALUE 389.
05 MS-COL06-SQLLEN PIC S9(4) COMP VALUE 8.
05 MS-COL06-SQLDATA USAGE IS POINTER.
05 MS-COL06-SQLIND USAGE IS POINTER VALUE NULL.
05 MS-COL06-SQLNAMEL PIC S9(4) COMP VALUE 4.
05 MS-COL06-SQLNAME PIC X(30) VALUE 'TIME'.
03 MS-COL07.
* - 7TH COL - DATATYPE = TIMESTAMP (LENGTH 19 OR 26)
* - PIC X(19) VALUE 'YYYY-MM-DD:HH:MM:SS'
* - PIC X(26) VALUE 'YYYY-MM-DD:HH:MM:SS:NNNNNN'
05 MS-COL07-SQLTYPE PIC S9(4) COMP VALUE 393.
05 MS-COL07-SQLLEN PIC S9(4) COMP VALUE 26.
05 MS-COL07-SQLDATA USAGE IS POINTER.
05 MS-COL07-SQLIND USAGE IS POINTER VALUE NULL.
05 MS-COL07-SQLNAMEL PIC S9(4) COMP VALUE 9.
05 MS-COL07-SQLNAME PIC X(30) VALUE 'TIMESTAMP'.
03 MS-COL08.
* - 8TH COL - DATATYPE = FLOAT (COMP-1 LENGTH ALWAYS 4)
* - SINGLE PRECISION FLOAT (COMP-1 LENGTH ALWAYS 4)
05 MS-COL08-SQLTYPE PIC S9(4) COMP VALUE 481.
05 MS-COL08-SQLLEN PIC S9(4) COMP VALUE 4.
05 MS-COL08-SQLDATA USAGE IS POINTER.
05 MS-COL08-SQLIND USAGE IS POINTER VALUE NULL.
05 MS-COL08-SQLNAMEL PIC S9(4) COMP VALUE 10.
05 MS-COL08-SQLNAME PIC X(30) VALUE 'FLOATING_P'.
03 MS-COL09.
* - 9TH COL - DATATYPE = FLOAT (COMP-2 LENGTH ALWAYS 8)
* - DOUBLE PRECISION FLOAT (COMP-2 LENGTH ALWAYS 8)
05 MS-COL09-SQLTYPE PIC S9(4) COMP VALUE 481.
05 MS-COL09-SQLLEN PIC S9(4) COMP VALUE 8.
05 MS-COL09-SQLDATA USAGE IS POINTER.
05 MS-COL09-SQLIND USAGE IS POINTER VALUE NULL.
05 MS-COL09-SQLNAMEL PIC S9(4) COMP VALUE 10.
05 MS-COL09-SQLNAME PIC X(30) VALUE 'DBL_FLOATP'.
03 MS-COL10.
* -10TH COL - DATATYPE = LARGE INTEGER (LENGTH ALWAYS 4)
* - CORRESPONDING PIC S9(8) COMP - UP TO 10 DIGITS.
05 MS-COL10-SQLTYPE PIC S9(4) COMP VALUE 497.
05 MS-COL10-SQLLEN PIC S9(4) COMP VALUE 4.
05 MS-COL10-SQLDATA USAGE IS POINTER.
05 MS-COL10-SQLIND USAGE IS POINTER VALUE NULL.
05 MS-COL10-SQLNAMEL PIC S9(4) COMP VALUE 7.
05 MS-COL10-SQLNAME PIC X(30) VALUE 'INTEGER'.
03 MS-COL11.
* - 11TH COL DATATYPE = LONG VARIABLE LENGTH CHAR (1-32K)
05 MS-COL11-SQLTYPE PIC S9(4) COMP VALUE 457.
05 MS-COL11-SQLLEN PIC S9(4) COMP VALUE 300.
05 MS-COL11-SQLDATA USAGE IS POINTER.
05 MS-COL11-SQLIND USAGE IS POINTER VALUE NULL.
05 MS-COL11-SQLNAMEL PIC S9(4) COMP VALUE 8.
05 MS-COL11-SQLNAME PIC X(30) VALUE 'LVARCHAR'.
* THIS SWITCH IS USED FOR TESTING IF RPC CALL
77 RSPRPC-SWITCH PIC S9(4) COMP VALUE 0.
88 RPC-CALL VALUE 0.
LINKAGE SECTION.
**************************************************************
* THE LINKAGE SECTION DEFINES MASKS FOR DATA AREAS
* THAT ARE EITHER PASSED TO THE PROGRAM IN THE CASE OF THE
* COMMAREA OR CREATED BY THE PROGRAM IN THE CASE OF THE SQLDA
* AND DATA FIELDS.
*
* UNLIKE WORKING-STORAGE, STORAGE ASSOCIATED WITHIN THE LINKAGE
* SECTION IS AVAILABLE TO OTHER PROGRAMS BY PASSING ADDRESSES
* AND USING MASKS.
*
* IT IS IMPORTANT TO NOTE, THAT EVEN THOUGH THE DEFINES IN
* THE LINKAGE SECTION LOOK EXACTLY LIKE THOSE IN WORKING
* STORAGE, NO SPACE IS ASSOCIATED WITH THESE DEFINES IN LINKAGE
* UNTIL IT IS "GETMAINED".
**************************************************************
01 DFHCOMMAREA.
05 NOT-USED PIC X(1).
******************************************************************
* THIS IS THE ACTUAL SPAREA POINTER AND DEFINITION *
******************************************************************
01 LWKCOMMAREA.
COPY SPAREAC.
******************************************************************
* NULL INDICATOR VARIABLES - SET TO -1 IF NULL; 0 IF NOT NULL. *
* ONLY REQUIRED FOR COLUMNS DEFINED AS ALLOWING NULLS! *
******************************************************************
01 INDICATOR-VARIABLES.
10 FIXED-CHAR-IND PIC S9(4) COMP.
10 DATE-OUT-IND PIC S9(4) COMP.
10 VAR-CHAR-IND PIC S9(4) COMP.
10 SMALL-INT-IND PIC S9(4) COMP.
10 PACKED-DEC-IND PIC S9(4) COMP.
10 TIME-OUT-IND PIC S9(4) COMP.
10 TIMESTAMP-IND PIC S9(4) COMP.
10 FLOAT-SGL-IND PIC S9(4) COMP.
10 FLOAT-DBL-IND PIC S9(4) COMP.
10 LARGE-INT-IND PIC S9(4) COMP.
10 LARGE-VCHAR-IND PIC S9(4) COMP.
******************************************************************
* DESCRIPTION OF THE EMPLOYEE DATA *
******************************************************************
* NOTE THAT VARCHAR AND LONG-VARCHAR FIELDS ARE PRECEDED BY *
* A TWO-BYTE COMP LENGTH FIELD. SQLDA KNOWS NOT TO INCLUDE THE *
* EXTRA TWO BYTES IN THE LENGTH OF THE DATA. WANT TO SEE YOUR *
* REGION COME DOWN? TRY LEAVING THE LENGTH FIELD OUT... *
* THE FIRST TWO BYTES OF YOUR DATA WILL BE USED TO CALC THE *
* LENGTH OF YOUR DATA AND CICS WILL START TO EAT ITSELF... *
******************************************************************
01 EMPLOYEE-DATA.
10 FIXED-CHAR PIC X(05).
10 DATE-OUT PIC X(10).
10 VAR-CHAR.
15 VCHAR-LENGTH PIC S9(4) COMP.
15 VCHAR-DATA PIC X(30).
10 SMALL-INT PIC S9(4) USAGE COMP.
10 PACKED-DEC PIC S999V99 USAGE COMP-3.
10 TIME-OUT PIC X(08).
10 TIMESTAMP PIC X(26).
10 FLOAT-SGL COMP-1.
10 FLOAT-DBL COMP-2.
10 LARGE-INT PIC S9(8) USAGE COMP.
10 LARGE-VAR-CHAR.
15 L-VCHAR-LENGTH PIC S9(4) COMP.
15 L-VCHAR-DATA PIC X(300).
*----------------------------------------------------------------*
* SQLDA - THIS IS USED AS A PLACE HOLDER IN THE COMMUNICATION *
* AREA FOR THE COLUMN VALUES DESCRIBED IN THE MODEL- *
* SQLDA. THIS IS DONE BECAUSE SYBASE USES POINTERS TO *
* PASS DATA AND ADDRESS IN COBOL CAN ONLY BE SET IN THE *
* LINKAGE SECTION.......... *
*----------------------------------------------------------------*
01 SQLDA.
03 SQLDAID PIC X(8).
03 SQLDABC PIC S9(8) COMP.
03 SQLN PIC S9(4) COMP.
03 SQLD PIC S9(4) COMP.
03 SQLVARN OCCURS 11.
05 SQLTYPE PIC S9(4) COMP.
05 SQLLEN PIC S9(4) COMP.
05 SQLDATA USAGE IS POINTER.
05 SQLIND USAGE IS POINTER.
05 SQLNAMEL PIC S9(4) COMP.
05 SQLNAME PIC X(30).
*-------------------------------------------------------*
PROCEDURE DIVISION.
*-------------------------------------------------------*
EXEC CICS HANDLE CONDITION
INVREQ(9999-RETURN-TO-CALLER)
END-EXEC.
0000-MAIN-PROCESSING.
PERFORM 1000-INITIALIZATION THRU 1000-EXIT.
PERFORM 5000-PROCESS-DATA THRU 5000-EXIT.
PERFORM 9000-WRAP-UP THRU 9000-EXIT.
EXEC CICS
RETURN
END-EXEC.
GOBACK.
*-------------------------------------------------------*
1000-INITIALIZATION.
*-------------------------------------------------------*
PERFORM 1050-SPAREA-SETUP THRU 1050-EXIT.
PERFORM 1100-TEST-SQLDA THRU 1100-EXIT.
PERFORM 1200-GET-STORAGE THRU 1200-EXIT.
PERFORM 1300-SET-ADDRESSES THRU 1300-EXIT.
PERFORM 1400-OPEN-OUTPUT-PIPE THRU 1400-EXIT.
1000-EXIT.
EXIT.
*-------------------------------------------------------*
1050-SPAREA-SETUP.
*-------------------------------------------------------*
******************************************************
* 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.
1050-EXIT.
EXIT.
1100-TEST-SQLDA.
*-------------------------------------------------------*
******************************************************
* CALCULATE THE CORRECT SQLDA SIZE INTO "SQLDA-SIZE"
MULTIPLY MS-SQLN BY 44 GIVING SQLDA-SIZE.
ADD +16 TO SQLDA-SIZE.
MOVE SQLDA-SIZE TO MS-SQLDABC.
******************************************************
* CHECK TO MAKE SURE THE CALCULATED SIZE EQUALS ACTUAL SIZE
* IF IT DOESN'T THEN A SQLDA FIELD IS MISSING OR ONE
* OF THE SQLDA FIELDS HAS THE WRONG PICTURE SIZE.
IF (LENGTH OF MODEL-SQLDA) NOT EQUAL SQLDA-SIZE
MOVE 'SQLDA/SQLN SIZE IN ERROR' TO ERROR2-TEXT2
PERFORM 9810-ERROR-MSG THRU 9810-EXIT
GO TO 9999-RETURN-TO-CALLER.
1100-EXIT.
EXIT.
1200-GET-STORAGE.
*-------------------------------------------------------*
******************************************************
* ALLOCATE A BLOCK OF STORAGE TO BE USED FOR THE SQLDA
* SET POINTER VARIABLE TO ADDRESS OF ALLOCATED STORAGE
* USE FLENGTH TO ALLOCATE STORAGE ABOVE THE 16M LINE
EXEC CICS GETMAIN
SET (SQLDA-POINTER)
FLENGTH (LENGTH OF SQLDA)
END-EXEC.
******************************************************
* ASSOCIATE THE LINKAGE SQLDA MASK TO THE ALLOCATED STORAGE
* BY SETTING THE MASK ADDRESS TO THE ADDRESS OF THE STORAGE
SET ADDRESS OF SQLDA TO SQLDA-POINTER.
******************************************************
* ALLOCATE A BLOCK OF STORAGE TO BE USED FOR THE DATA
* SET POINTER VARIABLE TO ADDRESS OF ALLOCATED STORAGE
EXEC CICS GETMAIN
SET(EMPLOYEE-DATA-POINTER)
FLENGTH(LENGTH OF EMPLOYEE-DATA)
END-EXEC.
SET ADDRESS OF EMPLOYEE-DATA TO EMPLOYEE-DATA-POINTER.
******************************************************
* ALLOCATE A BLOCK OF STORAGE TO BE USED FOR NULL INDICATORS
* ONLY REQUIRED FOR COLUMNS DEFINED AS ALLOWING NULLS
* SET POINTER VARIABLE TO ADDRESS OF ALLOCATED STORAGE
EXEC CICS GETMAIN
SET(INDICATOR-VAR-POINTER)
FLENGTH(LENGTH OF INDICATOR-VARIABLES)
END-EXEC.
SET ADDRESS OF INDICATOR-VARIABLES TO INDICATOR-VAR-POINTER.
1200-EXIT.
EXIT.
1300-SET-ADDRESSES.
*-------------------------------------------------------*
*********************************************************
* SET THE POINTER VARIABLES IN THE LINKAGE SECTION SQLDA TO
* THE ADDRESSES OF THE DATA LOCATIONS ALSO IN THE LINKAGE
* SECTION IE: THE DATA FIELDS IN EMPLOYEE-DATA
*
* THESE ADDRESSES MUST BE ADDRESSES ASSOCIATED WITH VARIABLES
* DEFINED IN THE LINKAGE SECTION BECAUSE THE OPEN SERVER API
* PROGRAM MUST BE ABLE TO ACCESS THIS STORAGE.
*
* THE MODEL-SQLDA IS MOVED TO THE SQLDA TO INITIALIZE
* THE COLUMN TYPES AND SIZES.........
*********************************************************
MOVE MODEL-SQLDA TO SQLDA.
SET SQLDATA(1) TO ADDRESS OF FIXED-CHAR.
SET SQLDATA(2) TO ADDRESS OF DATE-OUT.
SET SQLDATA(3) TO ADDRESS OF VAR-CHAR.
SET SQLDATA(4) TO ADDRESS OF SMALL-INT.
SET SQLDATA(5) TO ADDRESS OF PACKED-DEC.
SET SQLDATA(6) TO ADDRESS OF TIME-OUT.
SET SQLDATA(7) TO ADDRESS OF TIMESTAMP.
SET SQLDATA(8) TO ADDRESS OF FLOAT-SGL.
SET SQLDATA(9) TO ADDRESS OF FLOAT-DBL.
SET SQLDATA(10) TO ADDRESS OF LARGE-INT.
SET SQLDATA(11) TO ADDRESS OF LARGE-VAR-CHAR.
****************************************************
* SET SQLIND TO ADDRESS OF NULL INDICATOR FIELDS
* FOR ANY COLUMN DEFINED AS NULLABLE
****************************************************
SET SQLIND(1) TO ADDRESS OF FIXED-CHAR-IND.
SET SQLIND(2) TO ADDRESS OF DATE-OUT-IND.
SET SQLIND(3) TO ADDRESS OF VAR-CHAR-IND.
SET SQLIND(4) TO ADDRESS OF SMALL-INT-IND.
SET SQLIND(5) TO ADDRESS OF PACKED-DEC-IND.
SET SQLIND(6) TO ADDRESS OF TIME-OUT-IND.
SET SQLIND(7) TO ADDRESS OF TIMESTAMP-IND.
SET SQLIND(8) TO ADDRESS OF FLOAT-SGL-IND.
SET SQLIND(9) TO ADDRESS OF FLOAT-DBL-IND.
SET SQLIND(10) TO ADDRESS OF LARGE-INT-IND.
SET SQLIND(11) TO ADDRESS OF LARGE-VCHAR-IND.
1300-EXIT.
EXIT.
*-------------------------------------------------------*
1400-OPEN-OUTPUT-PIPE.
*-------------------------------------------------------*
*-------------------------------------------------------*
* AN OPEN PIPE WILL SET UP THE COLUMN INFORMATION, *
* WHICH WILL EVENTUALLY BE SENT TO THE CLIENT....... *
*-------------------------------------------------------*
MOVE 'OUTPUT' TO SPMODE.
MOVE 'DB2' TO SPFORMAT.
SET SPSQLDA TO ADDRESS OF SQLDA.
CALL 'OPENPIPE' USING SPAREA.
IF SPRC IS NOT EQUAL TO '000'
MOVE WS-OPENPIPE TO ERROR1-CALL
PERFORM 9800-PIPE-ERROR-MSG THRU 9800-EXIT
GO TO 9999-RETURN-TO-CALLER.
1400-EXIT.
EXIT.
*-------------------------------------------------------*
5000-PROCESS-DATA.
*-------------------------------------------------------*
PERFORM 5300-LOAD-A-ROW THRU 5300-EXIT.
PERFORM 5500-SEND-A-ROW THRU 5500-EXIT.
PERFORM 5400-LOAD-A-NULL-ROW THRU 5400-EXIT.
PERFORM 5500-SEND-A-ROW THRU 5500-EXIT.
5000-EXIT.
EXIT.
*-------------------------------------------------------*
5300-LOAD-A-ROW.
*-------------------------------------------------------*
*-------------------------------------------------------*
* COLUMN DATA IS HARDCODED FOR THIS EXAMPLE. *
*-------------------------------------------------------*
MOVE '00100' TO FIXED-CHAR.
MOVE '1993-09-16' TO DATE-OUT.
MOVE 30 TO VCHAR-LENGTH.
MOVE 'A ROSE BY ANY OTHER..' TO VCHAR-DATA.
MOVE 123 TO SMALL-INT.
MOVE 123.45 TO PACKED-DEC.
MOVE '11.35.25' TO TIME-OUT.
MOVE '1993-10-31:10:34:24' TO TIMESTAMP.
MOVE 1.00345 TO FLOAT-SGL.
MOVE 0.0023544 TO FLOAT-DBL.
MOVE 1234567 TO LARGE-INT.
MOVE 300 TO L-VCHAR-LENGTH.
MOVE WS-LONG-VARCHAR-TEXT TO L-VCHAR-DATA.
***************************************************
* MOVE ZERO TO NULL INDICATOR FIELDS TO INDICATE NOT NULL
MOVE 0 TO FIXED-CHAR-IND.
MOVE 0 TO DATE-OUT-IND.
MOVE 0 TO VAR-CHAR-IND.
MOVE 0 TO SMALL-INT-IND.
MOVE 0 TO PACKED-DEC-IND.
MOVE 0 TO TIME-OUT-IND.
MOVE 0 TO TIMESTAMP-IND.
MOVE 0 TO FLOAT-SGL-IND.
MOVE 0 TO FLOAT-DBL-IND.
MOVE 0 TO LARGE-INT-IND.
MOVE 0 TO LARGE-VCHAR-IND.
5300-EXIT.
EXIT.
*-------------------------------------------------------*
5400-LOAD-A-NULL-ROW.
*-------------------------------------------------------*
***************************************************
* MOVE -1 TO NULL INDICATOR FIELDS TO INDICATE NULL
* LEFTOVER DATA IN DATA FIELDS WILL BE IGNORED
MOVE -1 TO FIXED-CHAR-IND.
MOVE -1 TO DATE-OUT-IND.
MOVE -1 TO VAR-CHAR-IND.
MOVE -1 TO SMALL-INT-IND.
MOVE -1 TO PACKED-DEC-IND.
MOVE -1 TO TIME-OUT-IND.
MOVE -1 TO TIMESTAMP-IND.
MOVE -1 TO FLOAT-SGL-IND.
MOVE -1 TO FLOAT-DBL-IND.
MOVE -1 TO LARGE-INT-IND.
MOVE -1 TO LARGE-VCHAR-IND.
5400-EXIT.
EXIT.
*-------------------------------------------------------*
5500-SEND-A-ROW.
*-------------------------------------------------------*
*-------------------------------------------------------*
* PUTPIPE SENDS A RESULT ROW TO THE OUTPUT BUFFER, WHICH*
* WILL EVENTUALLY BE SENT DOWN TO THE CLIENT.... *
*-------------------------------------------------------*
CALL 'PUTPIPE' USING SPAREA.
IF SPRC IS NOT EQUAL TO '000'
MOVE WS-PUTPIPE TO ERROR1-CALL
PERFORM 9800-PIPE-ERROR-MSG THRU 9800-EXIT
GO TO 9999-RETURN-TO-CALLER.
5500-EXIT.
EXIT.
*-------------------------------------------------------*
9000-WRAP-UP.
*-------------------------------------------------------*
PERFORM 9200-CLOSE-PIPE THRU 9200-EXIT.
PERFORM 9900-ALL-DONE THRU 9900-EXIT.
* IF THIS IS AN RPC CALL, PERFORM OPEN SERVER CLOSE
IF RPC-CALL
PERFORM 9950-RPDONE THRU 9950-EXIT.
9000-EXIT.
EXIT.
*-------------------------------------------------------*
9200-CLOSE-PIPE.
*-------------------------------------------------------*
*-------------------------------------------------------*
*CLOSEPIPE IS LIKE CLOSING A FILE, PLACES AN EOF MARKER*
*-------------------------------------------------------*
CALL 'CLOSPIPE' USING SPAREA.
IF SPRC IS NOT EQUAL TO '000'
MOVE WS-CLOSPIPE TO ERROR1-CALL
PERFORM 9800-PIPE-ERROR-MSG THRU 9800-EXIT
GO TO 9999-RETURN-TO-CALLER.
9200-EXIT.
EXIT.
*-------------------------------------------------------*
9800-PIPE-ERROR-MSG.
*-------------------------------------------------------*
********************************************************
* IF NO ERRORS, MOVE 'OK' TO SPSTATUS BEFORE CALLING MESSAGE.
* IF ERRORS, MOVE 'E' TO SPSTATUS.
* EITHER WAY MOVE A MESSAGE UP TO A 100 CHAR INTO SPMSG
********************************************************
*-------------------------------------------------------*
* MESSAGE WILL WRITE THE 100 BYTE SPMSG TO A MSG BUFFER,*
* WHICH WILL EVENTUALLY BE WRITTEN TO THE CLIENT... *
*-------------------------------------------------------*
MOVE SPRC TO ERROR1-SPRC.
MOVE ERROR1-MSG TO SPMSG.
MOVE 'E' TO SPSTATUS.
CALL 'MESSAGE' USING SPAREA.
9800-EXIT.
EXIT.
*-------------------------------------------------------*
9810-ERROR-MSG.
*-------------------------------------------------------*
*-------------------------------------------------------*
* MESSAGE WILL WRITE THE 100 BYTE SPMSG TO A MSG BUFFER,*
* WHICH WILL EVENTUALLY BE WRITTEN TO THE CLIENT... *
*-------------------------------------------------------*
MOVE ERROR2-MSG TO SPMSG.
MOVE 'E' TO SPSTATUS.
CALL 'MESSAGE' USING SPAREA.
9810-EXIT.
EXIT.
*-------------------------------------------------------*
9900-ALL-DONE.
*-------------------------------------------------------*
*************************************************************
* IF NO ERRORS, MOVE 'OK' TO SPSTATUS BEFORE CALLING STATUS*
* IF ERRORS, MOVE 'E' TO SPSTATUS BEFORE CALLING STATUS *
* CAN MOVE UP TO 8 CHARS INTO SPCODE (SPMSG IS IGNORED) *
* BUT EITHER WAY ALWAYS CALL STATUS AFTER CLOSPIPE *
* CALLING STATUS WILL AUTOMATIC CLOSE ANY OPEN PIPES *
* *
* CALLING STATUS WILL ALSO FLUSH ANY RESULTS AND/OR *
* MESSAGES FROM THE BUFFERS, TO THE CLIENT *
*************************************************************
MOVE 'OK' TO SPSTATUS.
CALL 'STATUS' USING SPAREA.
9900-EXIT.
EXIT.
*-------------------------------------------------------*
9950-RPDONE.
*-------------------------------------------------------*
********************************************************
* CLOSE OPEN SERVER
* IF THIS IS AN RPC CALL, PERFORM OPEN SERVER CLOSE
********************************************************
CALL 'RPDONE' USING SPAREA.
9950-EXIT.
EXIT.
*-------------------------------------------------------*
9999-RETURN-TO-CALLER.
*-------------------------------------------------------*
*******************************************************
* FOR EMERGENCY BAIL-OUT
CALL 'RPDONE' USING SPAREA.
EXEC CICS
RETURN
END-EXEC.
9999-EXIT.
EXIT.
Copyright © 2005. Sybase Inc. All rights reserved.
|
|
View this book as PDF 