Sunteți pe pagina 1din 31

Embedding SQL in High

Level Language Programs


Alison Butterill
IBM i Product Manager
Power Systems

Agenda

yIntroduction
yBasic SQL within a HLL program
yProcessing multiple records
yError detection
yDynamic SQL
yTips and Techniques
ySummary

2012 IBM Corporation

What is SQL?
SQL - Structured Query Language
yData language for manipulation of a Relational database
yEnglish keyword-oriented
yExcellent tool for application development environment
Query
Data definition
Data manipulation
Data control
yPowerful language for Set-At-A-Time processing
SQL is NOT an end user query product!

2012 IBM Corporation

Executing SQL on IBM i


yInteractive SQL
yEmbedded or compiled in application programs
yQuery Manager
ySQL Statement Processor
yOperations Navigator
yDynamic SQL
ySQL Procedure Language
yExtended Dynamic SQL
yODBC, JDBC
yJSQL or SQLJ
yX/Open SQL Call Level Interface

2012 IBM Corporation

V5 SQL Support...
Part 1: DB2 Database Manager
yIncluded with IBM i (operating system)
V5: 5722-SS1
ySQL parser and run time support
SQL license (5722-ST1) not required to run SQL
applications
Support for compiled programs using embedded SQL
ySQL APIs
QSQPRCED - Provides extended dynamic SQL capability
QSQCHKS - Provides syntax checking for SQL
statements
yX/Open SQL Call Level Interface
yV5R1 - SQL Statement Processor
RUNSQLSTM Command

2012 IBM Corporation

V5 SQL Support
Part 2: DB2 for IBM i Query Manager & SQL Development Kit
yProgram number 5722-ST1
yQuery Manager
yInteractive SQL
ySQL precompilers
Required for embedding SQL in HLL programs
More later
ySQL REXX interface

2012 IBM Corporation

Agenda

yIntroduction
yBasic SQL within a HLL program
yProcessing multiple records
yError detection
yDynamic SQL
yTips and Techniques
ySummary

2012 IBM Corporation

High Level Languages Supported

yRPG
yCOBOL
yC
yJava
yAS/400 PL/I
yFORTRAN/400

2012 IBM Corporation

The SQL Precompiler


SQL
Precompiler

User
Source
File

Syntax check
X-ref host variables
SQL statements to calls
Comment SQL statements

Language
Compiler

Modified
Source
File

Processed
SQL
Statements

Program

Access
Plan

2012 IBM Corporation

SQL Commands
Basic commands
ySELECT - retrieves data; one row or multiple
yUPDATE - updates one row or multiple
yDELETE - deletes one row or multiple
yINSERT - adds one row or multiple
Additional functions for complex processing
yDECLARE CURSOR builds temp result table
yOPEN and CLOSE open/close result table
yFETCH row retrieval
yCOMMIT and ROLLBACK journaling functions
yGRANT and REVOKE security functions

10

2012 IBM Corporation

Basic RPG Interface


I
DS
I
I
I
C*
C/EXEC SQL
C+
SELECT
C+
INTO
C+
FROM
C+
WHERE
C/END-EXEC

1
6
31

50 EMPNBR
30 NAM
32 DEPT

nbr, nam, dpt


:empnbr, :nam, :dept
emp
nbr = :empnbr

Retrieve column/field values into program variables


One-to-one correspondence between SELECT list and INTO
list
SELECT INTO expects only a single row/record
Multiple rows require the use of cursor operations
11

2012 IBM Corporation

Basic Cobol Interface


WORKING-STORAGE SECTION.
77 EMPNBR
PIC S9(5) COMP-3.
77 DEPT
PIC S9(3) COMP-3.
77 NAM
PIC
X(25).
.
PROCEDURE DIVISION.
EXEC SQL
SELECT nbr, nam, dpt
INTO :empnbr, :nam, :dept
FROM emp
WHERE nbr = :empnbr
END-EXEC.

Retrieve column/field values into program variables


One-to-one correspondence between SELECT list and INTO
list
SELECT INTO expects only a single row/record
Multiple rows require the use of cursor operations
12

2012 IBM Corporation

Prompting for SQL


yUse SQL source member types
e.g., SQLRPG, SQLRPGLE, SQLCBL, SQLCBLLE
Prompting will not work without SQL member type
ySEU supports prompting today; RSE does not today
yBoth EXEC SQL and END-EXEC statements must be in place
Then prompting (F4) will work for statements in between
Same prompter as interactive SQL (Start ISQL command)
yCompile commands
OPM compilers
CRTSQLRPG, CRTSQLCBL
ILE compilers
CRTSQLRPGI, CRTSQLCBLI
Creates either *PGM, *SRVPGM or *MODULE depending on
parameter value specified for "Compile type" or OBJTYPE

13

2012 IBM Corporation

Prompting Embedded SQL


Columns . . . :
1 71
Edit
SKIP/QRPGSRC
SEU==> _____________________________________________
AASQLTST
FMT ** ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+.
*************** Beginning of data **********************
0011.00
C/EXEC SQL
0012.00 ==>> C+
<<=== Prompt from
0013.00 ==>> C+
SELECT
<<===
any of
0014.00 ==>> C+
<<=== these lines
0015.00
C/END-EXEC
****************** End of data *************************

F3=Exit
F4=Prompt
F16=Repeat find

F5=Refresh
F9=Retrieve
F17=Repeat change

F10=Cursor
F24=More keys

Any SQL statement can be prompted from within a source program

14

2012 IBM Corporation

Prompting for Embedded SQL


Specify SELECT Statement
Type information for SELECT statement.
FROM files . . . . .
SELECT fields . . .
WHERE conditions . .
GROUP BY fields . .
HAVING conditions .
ORDER BY fields . .
FOR UPDATE OF fields

.
.
.
.
.
.
.

.
.
.
.
.
.
.

Press F4 for a list.

emp_______________________________
nbr,_nam,_sal_____________________
dpt_=_:dept_______________________
__________________________________
__________________________________
__________________________________
sal_______________________________
Bottom

Type choices, press Enter.


Number of records to optimize .
DISTINCT records in result file
FOR FETCH ONLY . . . . . . . . .
UNION with another SELECT . . .
F3=Exit
F10=Copy

F4=Prompt
F12=Cancel

F5=Refresh
F14=Delete

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

__________
N
Y=Yes, N=No
N
Y=Yes, N=No
N
Y=Yes, N=No

F6=Insert line
F15=Split line

15

F9=Subquery
F24=More keys
2012 IBM Corporation

Prompting for Embedded SQL


Results of Prompting:
Columns . . . :
1 71
Edit
SKIP/QRPGSRC
SEU==> _____________________________________________
AASQLTST
FMT ** ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+.
*************** Beginning of data **********************
0011.00
C/EXEC SQL
0012.00
C+
0013.00
C+
SELECT nbr, nam, sal
0013.01
C+
FROM emp
0013.02
C+
WHERE dpt = :dept
0013.03
C+
FOR UPDATE OF sal
0014.00
C+
0015.00
C/END-EXEC
****************** End of data *************************
F3=Exit
F4=Prompt
F16=Repeat find

16

F5=Refresh
F9=Retrieve
F17=Repeat change

F10=Cursor
F24=More keys

2012 IBM Corporation

Embedded SQL in Free Format RPG

SQL Statement
Start of SQL statement

17

2012 IBM Corporation

Using Structures in SQL


yHost structures are groups of variables
Data structures in RPG
Group items in COBOL
yStructures can be used in SQL statements
yReplaces list of variables

18

2012 IBM Corporation

Using HLL Structures with SQL

RPG

COBOL

I
empds
DS
I
I
I
C*
C/EXEC SQL
C+
SELECT nbr, nam, dpt
C+
INTO :empds
C+
FROM emp
C+
WHERE nbr = :empnbr
C/END-EXEC

1
6
31

50 EMPNBR
30 NAM
31 DEPT

WORKING STORAGE SECTION.


01 EMP_DATA.
05 NBR PIC S9(5) COMP-3.
05 DEPT PIC S9(1) COMP-3.
05 NAME PIC X(25).
PROCEDURE DIVISION
MOVE 5 TO NBR.
EXEC SQL
SELECT nbr, pos, nam
INTO :EMP_DATA
FROM empl WHERE pos=:DEPT
END-EXEC.

19

2012 IBM Corporation

Agenda

yIntroduction
yBasic SQL within a HLL program
yProcessing multiple records
yError detection
yDynamic SQL
yTips and Techniques
ySummary

20

2012 IBM Corporation

10

Selecting and Processing Multiple Rows


Steps to access multiple rows:
1 Declare SQL cursor
2 Open cursor
3 Fetch next record
4 Process record (UPDATE/INSERT/etc)
5 If last record: go to Step 6,
else: go to Step 3
6 Close cursor

21

2012 IBM Corporation

Selecting and Processing Multiple Rows


DECLARE CURSOR Statement
Similar in function to HLL file declarations
F-specs or FD's
No processing actually takes place - just definition
Host variables may be included in the statement
Created using an embedded SELECT command
most SELECT clauses may be used - ORDER BY, GROUP BY, etc
Coded in C-specs of RPG or Procedure Division of COBOL
Must be declared before being referenced
C*
C/EXEC SQL
C+
C+
DECLARE empcsr CURSOR FOR
C+
SELECT nbr, nam, sal
C+
FROM emp
C+
WHERE dpt = :dept
C+
C/END-EXEC
C*
22

2012 IBM Corporation

11

Selecting and Processing Multiple Rows


DECLARE CURSOR Statement additional clauses
C*
C/EXEC SQL
C+
C+
DECLARE empcsr CURSOR FOR
C+
SELECT nbr, nam, sal
C+
FROM emp
C+
WHERE dpt = :dept
C+
FOR UPDATE OF sal
C+
C/END-EXEC
C*

yBy default, all columns may be updated or deleted


FOR UPDATE OF - lists the columns that are to be updated
only columns NOT included in ORDER BY are eligible
FOR READ ONLY - specifies no updating/deleting allowed
yConsiderations:
FOR READ ONLY - may improve performance; better
documentation
FOR UPDATE OF - security; may improve performance
FOR READ ONLY with insensitive clause
23

2012 IBM Corporation

Selecting and Processing Multiple Rows


DECLARE CURSOR Statement additional clauses
C*
C/EXEC SQL
C+
C+
DECLARE empcsr CURSOR FOR
C+
WITH HOLD
C+
SELECT nbr, nam, sal
C+
FROM emp
C+
WHERE dpt = :dept
C+
FOR UPDATE OF sal
C+
C/END-EXEC
C*
yWith Hold clause useful with commitment control
yDefault cursors are closed with commit/rollback commands
yWith Hold keeps cursor open
yWith Hold also an optional clause on the commit/rollback statements
24

2012 IBM Corporation

12

OPEN Statement

Executes the SELECT Statement For a Declared


Cursor
Builds the access path if necessary
Successful Open places the file cursor before the first
row of the result table
Cursor must be closed before it can be opened
C*
C/EXEC SQL
C+
C+
OPEN
C+
C/END-EXEC
C*

empcsr

25

2012 IBM Corporation

FETCH Statement
Two Functions
yPosition the cursor for the next operation
C*
C/EXEC SQL
C+
C+
FETCH
C+
C/END-EXEC

NEXT

FROM

empcsr

yBring rows/records into the program


C*
C/EXEC SQL
C+
C+
FETCH NEXT FROM empcsr
C+
INTO :number, :name, :salary
C+
C/END-EXEC

26

2012 IBM Corporation

13

Selecting and Processing Multiple Rows


FETCH Statement
yAlternatives to Next processing
yCursor must be defined as a scrollable
Keyword
Next
Prior
First
Last
Before
After
Current

Positions Cursor
On the next row after the current row
On the row before the current row
On the first row
On the last row
Before the first row - must not use INTO
After the last row - must not use INTO
On the current row (no change in position)

Relative n

n < -1 Positions to nth row before current


n = -1 Same as Prior keyword
n = 0 Same as Current keyword
n = 1 Same as Next keyword
n > 1 Positions to nth row after current

27

2012 IBM Corporation

Selecting and Processing Multiple Rows


FETCH Statement
yAlternatives to Next Processing
yCursor must be defined as a scrollable
C/EXEC SQL
C+
C+
DECLARE empcsr SCROLL CURSOR FOR
C+
SELECT nbr, nam, sal
C+
FROM emp
C+
ORDER BY empid
C+
C/END-EXEC
C*
C/EXEC SQL
C+
C+
FETCH PRIOR FROM empcsr
C+
INTO :number, :name, :salary
C+
C/END-EXEC

28

2012 IBM Corporation

14

Selecting and Processing Multiple Rows


Positioned Update and Delete Statements
yUpdates or deletes the current row of an updatable cursor
yCan only be done after successful Fetch operation
y"Where Current of" clause in Update and Delete statements
C/EXEC SQL
C+
DECLARE empcsr CURSOR FOR
C+
SELECT nbr, nam, sal
C+
FROM emp
C+
ORDER BY empid
C+
FOR UPDATE OF sal
C/END-EXEC
C*
C/EXEC SQL
C+
FETCH NEXT FROM empcsr
C+
INTO :number, :name, :salary
C/END-EXEC
C*
C/EXEC SQL
C+
UPDATE emp
C+
SET sal = sal + :raise
C+
WHERE CURRENT OF empcsr
C/END-EXEC
29

2012 IBM Corporation

Selecting and Processing Multiple Rows:

CLOSE Statement
Closes the cursor
Cursor must be opened in order to be closed
DB2 for i5/OS closes cursors for other reasons also:
job end
activation group ends
program ends
modules ends
commit or rollback without a 'with hold' clause
error handling......
Rule of thumb - close the cursor when finished with it
C*
C/EXEC SQL
C+
C+
CLOSE
C+
C/END-EXEC
30

empcsr

2012 IBM Corporation

15

Selecting and Processing Multiple Rows


Example: Update SALARY for all records in a specified department
C*
C/EXEC SQL
C+
C+
DECLARE empcsr CURSOR FOR
Define
C+
SELECT nbr, nam, sal
C+
FROM emp
C+
WHERE dpt = :dept
C+
FOR UPDATE OF sal
C+
C/END-EXEC
C*
C
EXFMT PROMPT
C*
C/EXEC SQL
Load
C+
NOTE: Not all
C+
OPEN empcsr
program logic is
C+
shown!!
C/END-EXEC
31

2012 IBM Corporation

Selecting and Processing Multiple Rows


Example Continued
C*
C/EXEC SQL
C+
C+
FETCH NEXT FROM empcsr
Retrieve
C+
INTO :number, :name, :salary
C+
C/END-EXEC
C*
C/EXEC SQL
C+
C+
UPDATE emp
Process
C+
SET sal = sal + :raise
C+
WHERE CURRENT OF empcsr
C+
C/END-EXEC
C*
C/EXEC SQL
NOTE: Not all
Close
C+
program logic is
C+
CLOSE empcsr
shown!!
C+
C/END-EXEC
32

2012 IBM Corporation

16

Agenda

yIntroduction
yBasic SQL within a HLL program
yProcessing multiple records
yError detection
yDynamic SQL
yTips and Techniques
ySummary

33

2012 IBM Corporation

Error Detection and Handling


Status always returned to HLL code
both successful and unsuccessful statements
Programmer must check return codes within program
SQL Communications Area (SQLCA)
contains feedback information
must be included in all SQL programs
RPG includes SQLCA automatically
other languages must have specific include:
EXEC

SQL
INCLUDE SQLCA

END-EXEC

34

2012 IBM Corporation

17

Error Detection and Handling


SQL Communications Area (SQLCA)
SQLCAID
SQLCABC
SQLCode
SQLErrML
SQLErrMC
SQLErrP
SQLErrD

Char(8)
Integer
Integer
SmallInt
Char(70)
Char(8)
Array of Integers

Structure identifying literal: "SQLCA"


Length of SQLCA
Return code
Length of SQLErrMC
Message Replacement text
Product ID literal: "QSQ" for DB2/400
SQLErrD(1) - treated as Char(4); last 4 characters
of CPF or other escape message
SQLErrD(2) - treated as Char(4); last 4 characters
of CPF or other diagnostic message
SQLErrD(3) - for Fetch, Insert, Update or Delete,
number of rows retrieved or updated
SQLErrD(4) - for Prepare, relative number
indicating resources required for
execution
SQLErrD(5) - for multiple-row Fetch, contains 100
if last available row is fetched;
for Delete, number of rows affected
by referential constraints; for
Connect or Set Connection,
contains t-1 if unconnected, 0 if local
and 1 if connection is remote
SQLErrD(6) - when SQLCode is 0, contains
SQL completion message id

35

2012 IBM Corporation

Error Detection and Handling


SQL Communications Area (SQLCA) - continued

36

SQLWarn
SQLWarn0

Char(11)
Char(1)

SQLWarn1

Char(1)

Set of 11 warning indicators; each is blank, W, or N


Blank if all other SQLWARNx warning indicators are blank
W if any warning indicator contains W or N
W if a string column was truncated when assigned to host variable

SQLWarn2
SQLWarn3

Char(1)
Char(1)

W if null values were eliminated from a function


W if number of columns is larger than number of host variables

SQLWarn4

Char(1)

SQLWarn5
SQLWarn6
SQLWarn7
SQLWarn8

Char(1)
Char(1)
Char(1)
Char(1)

SQLWarn9
SQLWarnA
SQLState

Char(1)
Char(1)
Char(5)

W if prepared Update or Delete statement doesn't include a Where


clause
Reserved
W if date arithmetic results in end-of-month adjustment
Reserved
W if result of character conversion contains the substitution
character
Reserved
Reserved
Return code; "00000' if no error or warning

2012 IBM Corporation

18

Error Detection and Handling

SQLCODE Values
SQLCODE (SQLCOD) contains return code
= 0 Successful statement execution
> 0 Successful, with warning condition
< 0 Unsuccessful - statement failed
SQLCODE value indicates exact error or condition
e.g. 100 = Row not found (or end of file)
e.g. -552 = Not authorized to object
SQLCODE values have corresponding messages
e.g. SQL0100 = Row not found
e.g. SQL0552 = Not authorized to &1.

37

2012 IBM Corporation

Error Detection and Handling


RPG

COBOL

38

C/EXEC SQL
C+ SELECT name INTO :nam
C+
WHERE emp = 100
C/END-EXEC
C
SQLCOD
IFLT
C
C
C
SQLCOD
IFGT
C
C

0
EXSR
ENDIF
0
EXSR
ENDIF

ERR
NF

EXEC SQL
SELECT name INTO :lastname
WHERE emp = 100
END-EXEC.
IF SQLCODE < 0
PERFORM ERROR-ROUTINE.
ELSE
IF SQLCODE > 0
PERFORM NOT-FOUND-ROUTINE
ELSE
PERFORM GOOD-REC-ROUTINE.
2012 IBM Corporation

19

Error Handling and Detection


WHENEVER Statement
WHENEVER statement checks SQLCA
Can branch to a location based on condition
Three conditions:
SQLWARNING (SQLCODE > 0 except 100)
OR (SQLWARN0 = 'W')
SQLERROR (SQLCODE < 0)
NOT FOUND (SQLCODE = 100)
Two possible actions
CONTINUE
GO TO label
C*
C/EXEC SQL
C+
C+
WHENEVER SQLERROR GO TO error
C+
C/END-EXEC
39

2012 IBM Corporation

Error Detection and Handling Better Way


Directly following each SQL statement - code an 'error catcher'
Easier to determine source of the error
More discrete method of determining action to be taken
Example: Update SALARY for all records in a specified department
C*
C/EXEC SQL
C+
C+
DECLARE empcsr CURSOR FOR
Define C+
SELECT nbr, nam, sal
C+
FROM emp
C+
WHERE dpt = :dept
C+
FOR UPDATE OF sal
NOTE: Not all
C+
program logic is
C/END-EXEC
shown!!
C*
C
EXFMT PROMPT
C* Read operation of EXFMT retrieve dept number
40

2012 IBM Corporation

20

Selecting and Processing Multiple Rows


Example Continued
Load

Retrieve

C*
C/EXEC SQL
C+
OPEN empcsr
C/END-EXEC
C*
C
IF SQLCODE <> 0
C
EXSR Err
C
DOU = 100
C*
C/EXEC SQL
C+
FETCH NEXT FROM empcsr
C+
INTO :number, :name, :salary
C/END-EXEC
C*
C
IF SQLCODE <> 0
NOTE: Not all
C
EXSR Err
program logic is
C
DOU = 100
C*
shown!!

41

2012 IBM Corporation

Selecting and Processing Multiple Rows


Example Continued

Process

Close

C*
C/EXEC SQL
C+
UPDATE emp
C+
SET sal = sal + :raise
C+
WHERE CURRENT OF empcsr
C/END-EXEC
C*
C
IF SQLCODE <> 0
C
EXSR Err
C
ENDIF
C
ENDIF
C
ENDDO
C*
C/EXEC SQL
C+
CLOSE empcsr
NOTE: Not all
C/END-EXEC

program logic is
shown!!

42

2012 IBM Corporation

21

Agenda

yIntroduction
yBasic SQL within a HLL program
yProcessing multiple records
yError detection
yDynamic SQL
yTips and Techniques
ySummary

43

2012 IBM Corporation

Dynamic SQL
What is Dynamic SQL?
Dynamic SQL is a different way to use SQL
SQL statements are not pre-defined in program
Dynamically created on the fly as part of
program logic
SQL pre-compiler cannot fully process dynamically
created SQL statements
PREPARE statement used in program logic to
compile dynamically created SQL statements
Can be used with SQL EXECUTE statement

44

2012 IBM Corporation

22

Dynamic SQL
What is Dynamic SQL?
Offers a high degree of application flexibility
Can create/build SQL statement
Based on parameters received from
Interactive user interface
List selection techniques
Application control file
Use any programming language

45

2012 IBM Corporation

Dynamic SQL

Where to use Dynamic SQL


yReport programs with user run time selection
Files
Fields
Record selection criteria
Sorting
SQL built in functions
yWhenever the exact syntax of an SQL statement cannot
be determined beforehand

46

2012 IBM Corporation

23

Dynamic SQL Example 1


User prompted to enter the delete condition (InpCond variable)
C*
C
Eval
SQLStmtStr = 'Delete From Customer
C
Where '
C
Eval
SQLStmt = SQLStmtStr + InpCond
C/EXEC SQL
C+
C+
PREPARE DynSQLStmt
C+
FROM :SQLStmt
C+
C/END-EXEC
C*
C
If
(SQLCod = 0) And (SQLWn0 = *Blank)
C/EXEC SQL
C+
C+
EXECUTE DynSQLStmt
C+
C/END-EXEC
C*
47

2012 IBM Corporation

Dynamic SQL
Example 2: Dynamically select records from the Employee
Master File - Any fields, records, or sequence
C* User prompted to enter delete condition (InpCnd)
C*
C/EXEC SQL
C+
C+
PREPARE search FROM :sqlstm
C+
C/END-EXEC
C*
C/EXEC SQL
C+
C+
DECLARE empcsr CURSOR FOR search
C+
C/END-EXEC
C*
C/EXEC SQL
C+
C+
OPEN empcsr
C+
C/END-EXEC
48

2012 IBM Corporation

24

Dynamic SQL

Performance considerations
yDynamic SQL can be resource intensive
yRemember that a dynamic SQL statement is parsed
(interpreted) and executed within the application program
from which it is called

May have negative impact on performance

Use it ... But use it carefully!

49

2012 IBM Corporation

Agenda

yIntroduction
yBasic SQL within a HLL program
yProcessing multiple records
yError detection
yDynamic SQL
yTips and Techniques
ySummary

50

2012 IBM Corporation

25

Performance Tips
Embedded SQL Tips
Test statements in Interactive SQL before embedding them
When exiting Interactive SQL session
You can save session statements to a source member
Then copy from this member into your program source
Default for SQL is to use Commitment Control
Requires journaling
Program execution fails if updated files are not journaled
To request no commitment control
COMMIT(*NONE) on compile
SQL precompile step happens before RPG/COBOL compile
Therefore, if SQL syntax or semantic error occurs, no "typical"
compile source listing available
Can be very difficult to work through problems at this stage

51

2012 IBM Corporation

Performance Tips
Designing and Writing Efficient SQL Queries
SQL uses two basic ways to retrieve data
Dataspace scan or arrival sequence Generally used
when MORE than 20% of records will be selected
Index based or keyed access Generally used when
LESS than 20% of records will be selected
If SQL can use an index, performance can improve
significantly!
Create indexes for columns frequently referenced in
WHERE clause
GROUP BY clause
ORDER BY clause
Create indexes for fields that are frequently used to join
files

52

2012 IBM Corporation

26

Performance Tips
Performance Analysis Tools
PRTSQLINF
Prints information about the embedded SQL
statements in a program, SQL package or service
program
SQL statements
Access plans
List of command parameters used by precompiler
STRDBMON
Predictive Query Governor
CHGQRYA command
TRCJOB
Visual Explain (first in V4R5)
Operations Navigator
53

2012 IBM Corporation

Performance Tips
Multiple Row FETCH
Based on host structure
RPG - Multiple Occurence Data Structure
COBOL - Occurs clause on declaration of the group item
Clause on FETCH
FOR n ROWS (n = number of rows to be returned)
Specifies number of rows to be retrieved to fill the structure
D
EMP
DS
D
NBR
D
NAME
D
JOB
C*
C
Z-ADD
C/EXEC SQL
C+
FETCH Next
C+
FROM CustomerCursor
C+
FOR 10 ROWS
C+
INTO Emp
C/END-EXEC
C
Eval
C*
54

5
25
1
5

Occurs(10)
0

JOB

ErrCond = SQLErrD(5)
2012 IBM Corporation

27

Performance Tips
Multiple Row FETCH - continued
yFirst row fetched- placed into first element of host structure
yFetching stops when n rows are returned - or no more records
yProgram variable may be used to specify number of records to
be fetched (Note: RPG IV - %Elem built in function)
yBe Careful - Fetching is always forward from position set by
positioning keyword
FETCH RELATIVE -3 .... FOR 3 ROWS
is not the same as
FETCH PRIOR .... FOR 3 ROWS
yResults:
SQLCA updates SQLErrCode(3) to reflect # rows retrieved
If no rows returned and no other exceptions, SQLCode is
100
If row(s) returned contains last available row,
SQLErrCode(5) set to 100
55

2012 IBM Corporation

Performance Tips
Blocked INSERT
Multiple elements from a host structure are inserted

into a table

Program variable may be used to set the number of

records to be inserted
Executes as if n INSERT statements had been issued
but with improved performance
D
EMP
DS
D
NBR
5
D
NAME
25
D
JOB
C*
C/ EXEC SQL
C+
INSERT INTO Customer
C+
10 ROWS
C+
VALUES :Emp
C/ END-EXEC
56

Occurs(10)
0
1

2012 IBM Corporation

28

Other Uses for Embedded SQL


Remote Database Access
CONNECT TO
DISCONNECT
RELEASE ALL
SET CONNECTION
Stored Procedures
DECLARE PROCEDURE
CALL PROCEDURE
INCLUDE statement
Dynamic Cursor
Query Manager

57

2012 IBM Corporation

Agenda

yIntroduction
yBasic SQL within a HLL program
yProcessing multiple records
yError detection
yDynamic SQL
yTips and Techniques
ySummary

58

2012 IBM Corporation

29

Summary
Practical, effective solution for applications

requiring complex data retrieval


Very flexible, functional tool for development
Embedded in a HLL program
Entered interactively
Portability to other relational databases
Easy report writing with programmable

flexibility
Similarity across many relational databases

59

2012 IBM Corporation

Bibliography
DB2 cross platform web page includes a pointer to a free DB2
Programming FastPath course download
SQL/400 Developers Guide - Paul Conte and Mike Cravitz
Database Design and Programming for DB2/400 - Paul Conte
S246-0100 DB2/400: The New AS/400 Database: V3R1 - Skip
Marchesani
Informational APARs (II09006)
IBM Publications on the Web
Books
http://www1.ibm.com/servers/eserver/systemi/db2/books.htm
White Papers
http://www1.ibm.com/servers/eserver/systemi/db2/db2awp_m.htm
Information Centre
http://www.systemi.ibm.com/infocentre
GO -> Database and file systems -> DB2 for i5/OS
60

2012 IBM Corporation

30

Thank You

31

S-ar putea să vă placă și