Module 9: DB2 COBOL Programming
DB2 Program Structure
A DB2 COBOL program follows the standard COBOL division structure, with DB2-specific pieces added: INCLUDE SQLCA and DCLGEN copybooks in WORKING-STORAGE, cursor DECLAREs in the DATA DIVISION, and EXEC SQL statements with SQLCODE checks in the PROCEDURE DIVISION.
The divisions of a DB2 program
- IDENTIFICATION DIVISION: PROGRAM-ID as usual. Nothing DB2-specific here.
- ENVIRONMENT DIVISION: file and device descriptions as usual. DB2 tables need no SELECT/ASSIGN entries.
- DATA DIVISION, WORKING-STORAGE: EXEC SQL INCLUDE SQLCA END-EXEC first, then DCLGEN copybook INCLUDEs, then host variable declarations, then EXEC SQL DECLARE CURSOR statements.
- PROCEDURE DIVISION: program logic with EXEC SQL blocks (OPEN, FETCH, CLOSE, SELECT, INSERT, UPDATE, DELETE, COMMIT), checking SQLCODE after each one.
DCLGEN: generated declarations
- DCLGEN (Declarations Generator) is a DB2I facility that generates the SQL DECLARE TABLE statement and matching COBOL host variable declarations for a table.
- The output is stored as a copybook member and pulled in with EXEC SQL INCLUDE member-name END-EXEC.
- Using DCLGEN guarantees the host variables match the table definition exactly, avoiding -310 mismatches.
- Regenerate the DCLGEN copybook whenever the table definition changes (ALTER TABLE).
Standard paragraph flow
- MAIN-PARA drives the program: open the cursor, fetch in a loop until SQLCODE is not 0, close the cursor, COMMIT, STOP RUN.
- OPEN-PARA opens the cursor and stops the program if SQLCODE is not 0.
- FETCH-PARA fetches one row; on SQLCODE 0 process the row, on 100 end the loop, otherwise display the error and stop.
- CLOSE-PARA closes the cursor to release DB2 resources.
Example of a complete DB2 COBOL program skeleton:-
IDENTIFICATION DIVISION.
PROGRAM-ID. DB2PROG1.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL INCLUDE SQLCA END-EXEC.
EXEC SQL INCLUDE EMPROW END-EXEC.
EXEC SQL
DECLARE C1 CURSOR FOR
SELECT EMPNO, SALARY
FROM EMP
WHERE DEPTNO = :WS-DEPT
END-EXEC.
01 WS-DEPT PIC X(3) VALUE 'A01'.
01 WS-EMPNO PIC X(6).
01 WS-SALARY PIC S9(7)V9(2) COMP-3.
PROCEDURE DIVISION.
MAIN-PARA.
PERFORM OPEN-PARA.
PERFORM FETCH-PARA UNTIL SQLCODE NOT = 0.
PERFORM CLOSE-PARA.
EXEC SQL COMMIT END-EXEC.
STOP RUN.
OPEN-PARA.
EXEC SQL OPEN C1 END-EXEC.
IF SQLCODE NOT = 0
DISPLAY 'OPEN FAILED : ' SQLCODE
STOP RUN
END-IF.
FETCH-PARA.
EXEC SQL
FETCH C1 INTO :WS-EMPNO, :WS-SALARY
END-EXEC.
IF SQLCODE = 0
DISPLAY WS-EMPNO ' ' WS-SALARY
ELSE
IF SQLCODE = 100
DISPLAY 'END OF DATA'
ELSE
DISPLAY 'FETCH FAILED : ' SQLCODE
STOP RUN
END-IF
END-IF.
CLOSE-PARA.
EXEC SQL CLOSE C1 END-EXEC.
