DB2 Application Programming
DB2 Application Programming
FD required
No DD card needed
DD card needed
SQL in application
Embedded SQL
Static
Dynamic
Types of SQL
SQL Type
DCL
SQL Statements
GRANT & REVOKE
DDL
DML
DYNAMIC SQL
DISTRIBUTED
CONNECT, RELEASE
STO PROC
DEFINITION CONTROL
INCLUDE
EMBEDDING CONTROL
TRANSACTION CONTROL
ASSIGNMENT
ERROR HANDLING
WHENEVER
Get Diagnostics
Provides additional information
EXAMPLE:
GET DIAGNOSTICS :RC = ROW_COUNT
Row number
Server name
Authorization id
Authentication type
Host variable
Area of storage allocated
Must be prefixed with colon
EXEC SQL
SELECT EMPNO,
SALARY
INTO
:HOSTVAR-EMPNO,
:HOSTVAR-SALARY
FROM EMP
WHERE EMPNO = :HOSTVAR-EMP
END-EXEC.
DCLDEPT.
10 DEPTNO
10 DEPTNAME.
49 DEPTNAME-LEN
49 DEPTNAME-TEXT
10 MGRNO
10 ADMRDEPT
10 LOCATION
EXEC SQL
SELECT
FROM
INTO
WHERE
END-EXEC.
PIC X(3) .
PIC
PIC
PIC
PIC
PIC
Null indicator
What is null?
Handle null value of a db2 column
Code immediately after the column name variable
01
EMP-INDICATORS.
10 SALARY-IND PIC S9(4) USAGE COMP.
EXEC SQL
SELECT
INTO
FROM
WHERE
END-EXEC.
EMPNO, SALARY
:EMPNO,
:SALARY: SALARY-IND
EMP
EMPNO = '000100
Null indicator
Possible values
0, -2, -1
Contains original length of column in case of truncation
Null indicator structure
01
EXEC SQL
SELECT DEPTNO, DEPTNAME, MGRNO, ADMRDEPT, LOCATION
FROM DEPT
INTO :DCLDEPT: DEPT-IND
WHERE DEPTNO = ' A00
END-EXEC.
Sqlcode -305
REAL or FLOAT(n)
COMP-1
DOUBLE PRECISION,
or FLOAT(n)
COMP-2
DECIMAL(i+d,d) or NUMERIC(i+d,d)
SMALLINT
S9(4) COMP
INTEGER
S9(9) COMP
CHAR(n)
X(N)
VARCHAR(n)
01 VAR-TYPE
49 VAR-NAME
49 VAR-LEN
PIC X(N)
PIC 9(4) COMP
Cursors
Process a set of rows
Statements
Declare
Open
Fetch
Close
Cursors
EXEC SQL
DECLARE C1 CURSOR FOR
SELECT
DEPTNO, DEPTNAME, MGRNO
FROM
DEPT
WHERE
ADMRDEPT = : ADMRDEPT
END-EXEC.
EXEC SQL
OPEN C1
END-EXEC.
EXEC SQL
FETCH C1
INTO : DEPTNO,
: DEPTNAME,
: MGRNO
END-EXEC.
EXEC SQL
CLOSE C1
END-EXEC.
Cursors
EXEC SQL
DECLARE C1 CURSOR FOR
SELECT DEPTNO, DEPTNAME, MGRNO
FROM
DEPT
WHERE
ADMRDEPT = :ADMRDEPT
FOR UPDATE OF MGRNO
END-EXEC.
EXEC SQL
OPEN C1
END-EXEC.
EXEC SQL
FETCH C1
INTO : DEPTNO,
: DEPTNAME,
: MGRNO
END-EXEC.
Cursors
EXEC SQL
UPDATE DEPT
SET MGRNO = ' 000060
WHERE CURRENT OF C1
END-EXEC.
EXEC SQL
CLOSE C1
END-EXEC.
SQL Codes
-501 Cursor not open on fetch
-502 Opening a cursor which is already open
Types of cursors
Scrollable cursors
Scroll forward/Backward
Types
Sensitive Updatable, Changed data access
Insensitive Not updatable, No changed data
access
Types of cursors
Keywords
Next
Prior
First
Last
Current
Absolute (n)
Relative (n)
Types of cursors
DECLARE CSR1 SENSITIVE STATIC SCROLL CURSOR
FOR SELECT
FIRSTNAME, LASTNME
FROM
DSN8710. EMP
ORDER BY LASTNME;
OPEN CSR1;
FETCH LAST CSR1 INTO : FN, : LN;
Rowset Positioning
Retrieves > 1 row in one fetch
Must use array structure
EXEC SQL
DECLARE CURSOR SAMPCURS
WITH ROWSET POSITIONING
FOR SELECT DEPTNO
FROM
DSN8810.DEPT
END-EXEC.
FETCH ROWSET FROM SAMPCURS
FOR 5 ROWS
INTO :HOSTVAR-ARRAY;
Rowset Positioning
UPDATE
SET
FOR
FOR
EMP
SALARY = 50000.00
CURSOR CSR1
ROW : HV OF ROWSET;
DELETE DEPT
FOR CURSOR CSR2
FOR ROW 3 OF ROWSET;
INSERT INTO SAMPLE_TABLE
FOR : N ROWS
VALUES(: HOSTVAR-ARRAY1, : HOSTVAR-ARRAY2, . . . )
ATOMIC;
Rowset Positioning
NEXT ROWSET
PRIOR ROWSET
FIRST ROWSET
LAST ROWSET
CURRENT ROWSET
ROWSET STARTING AT ABSOLUTE n
ROWSET STARTI NG AT RELATIVE n
Dynamic SQL
Advantages
Can use different indexes
Column distribution statistics
Bound only during execution
Disadvantages
More time to execute than static
Involves more overhead
Dynamic SQL
Execute immediate
Non SELECT
Fixed list SELECT
Varying list SELECT
Dynamic SQL
EXEC SQL
INCLUDE SQLCA
END-EXEC.
.
.
01 STRING-VARIABLE.
49 STRING-VAR-LEN
PIC S9(4)
USAGE COMP.
49 STRING-VAR-TXT
PIC X(100)
.
.
PROCEDURE DIVISION.
.
.
MOVE +45 TO STRING-VAR-LEN.
MOVE "DELETE FROM DSN8810.PROJ WHERE DEPTNO = ' A00'"
TO STRING-VARIABLE.
EXEC SQL
EXECUTE IMMEDIATE : STRING-VARIABLE
END-EXEC.
Dynamic SQL
Use for one-time execution
Involves preparation every time
More overhead
Does not support select
Dynamic SQL
EXEC SQL
INCLUDE SQLCA
END-EXEC.
.
01 STRING-VARIABLE.
49 STRING-VAR-LEN
PIC S9(4)
USAGE COMP.
49 STRING-VAR-TXT
PIC X(100)
.
PROCEDURE DIVISION.
.
MOVE +45 TO STRING-VAR-LEN.
MOVE "DELETE FROM DSN8810.PROJ WHERE DEPTNO = ' A00'"
TO STRING-VARIABLE.
EXEC SQL
PREPARE STMT1 FROM :STRING-VARIABLE;
END-EXEC.
EXEC SQL
EXECUTE STMT1;
END-EXEC.
Dynamic SQL
EXEC SQL INCLUDE SQLCA END-EXEC.
.
01 STRING-VARIABLE.
49 STRING-VAR-LEN
PIC S9(4)
USAGE COMP.
49 STRING-VAR-TXT
PIC X(100).
.
PROCEDURE DIVISION.
.
MOVE +40 TO STRING-VAR-LEN.
MOVE "DELETE FROM DSN8810.PROJ WHERE DEPTNO = ?
TO STRING-VARIABLE.
EXEC SQL
PREPARE STMT1 FROM :STRING-VARIABLE;
END-EXEC.
MOVE ' A00' TO TVAL.
EXEC SQL
EXECUTE STMT1 USING : TVAL;
END-EXEC.
Dynamic SQL
SELECT
WHERE
DSN8810. PROJ
EXEC SQL
DECLARE CSR2 CURSOR
FOR FLSQL
END-EXEC.
EXEC SQL
PREPARE FLSQL FROM : STRING-VARIABLE
END-EXEC.
EXEC SQL
OPEN CSR2 USING :TVAL1, :TVAL2
END-EXEC.
EXEC SQL FETCH CSR2 INTO : PROJNO, :PROJNAME, : RESPEMP END-EXEC.
EXEC SQL CLOSE CSR2 END-EXEC.
Program Preparation
Program preparation
Create DCLGEN
Declare table statement
Copybook
COLSUFFIX(YES) and NAMES()
Program preparation
Precompilation
Expands the Include members
Searches SQL statements
Replaces the SQL statement with system call
Extracts all the SQL statements and produce DBRM
Places timestamp in modified source & DBRM
Program preparation
Bind
Compiler for SQL
Checks the syntax
Checks the column and table information
Authorization validation
Produces the optimized access path with Optimizer
Bind package & Bind plan available
Program preparation
SYSIBM.SYSDBRM
SYSIBM.SYSSTMT
SYSIBM.SYSPACKSTMT
SYSTABSTATS
SYSCOLSTATS
SYSINDEXSTATS
SYSUSERAUTH
SYSCOLDISTSTATS
Isolation Level
Repeatable Read
Read Stability
Cursor stability
Uncommitted read
Isolation Level
LOSTUPDATES
DIRTYREAD
NONREPEATABLEREAD
PHANTOM
RR
RS
CS
UR
Program efficiency
CPU time
Elapsed time
Number of I/O
Lock wait time
User satisfaction
Program efficiency
Avoid using separate programs for DB2 access
Code modular programs
Use stored procedures
Unqualified SQL
Avoid Select *
Avoid selecting columns whose values are known
Program efficiency
Use indexed columns in where clause
Use join than application logic
Avoid host structures
Use For Read-only/For fetch only
Explicitly code literals
Use isolation levels at SQL level
Program efficiency
Do not use OCCURS for host variables
Avoid using host structures
Use DCLGEN
Use meaningful names
Use checkpoint restart logic
Use cursors with hold than reposition
SQL Codes
-803 Duplicate key value
-805 Timestamp mismatch
-904 Resource unavailable
-927 DB2 environment not established
-811 Embedded SQL fetch rows > 1
-911 - Deadlock
SQL Codes
-206 Column name not found
-204 Object not defined