Download - Natural for DB2 Beyond The Find and Read
04/10/23
“””Natural for DB2 Beyond The Find and Read
Darrell SkildumAdvisory Systems EngineerSoftware Ag
Darrell Skildum / 04/10/23 / 2 Software AG
DB2 Programming Tools
1) DBLOG
1) Traces all SQL calls
2) Entry point to LISTSQL and EXPLAIN
2) LISTSQL
1) Lists SQL generated
2) Entry point to EXPLAIN
3) EXPLAIN
1) DB2 estimate of cost of command
2) Shows INDEX use/non use
3) Shows columns of index used
Darrell Skildum / 04/10/23 / 3 Software AG
ADABAS vs DB2
Purpose is not to debate merits of each Database, but to encourage the best use of the tools for each
Darrell Skildum / 04/10/23 / 4 Software AG
ADABAS vs DB2
ADABAS is a Record Oriented Database
A FIND results in a set of ISNs which can be retrieved one at a time
A READ is a true browse function
DB2 is set oriented
A FIND translates to a SELECT which produces a subset of the records as a separate table which is then browsed.
A READ may result is SELECT GE which may produce a subset much larger than wanted
Darrell Skildum / 04/10/23 / 5 Software AG
Adabas vs DB2 programming
For the most part, the same syntax works for both ADABAS and DB2
More thought should be applied because in some cases, the same syntax may be less efficient in DB2
DB2 allows (requires) much more complicated syntax to effectively retrieve the selected information
Darrell Skildum / 04/10/23 / 6 Software AG
Creation of Tables
Employees Creator = SADRS
Employees ADA
EMPL_BASE
EMPLOYEE_PAY
EMPLOYEE_LEAVE
EMPLOY_DEEMPLOY_UK
EMPLOY_SP EMPLOY_US
EMPLOY_FR
Darrell Skildum / 04/10/23 / 7 Software AG
Creation of Tables
Vehicles -Creator = SADRS
Vehicles (ADA)
VEHICLES
Darrell Skildum / 04/10/23 / 8 Software AG
Natural Read
DEFINE DATA LOCAL 1 EMP VIEW OF SADRS-EMPL_BASE 2 PERSONNEL_ID 2 NAME 2 FIRST_NAME 2 DEPT END-DEFINE READ EMP WITH DEPT = 'COMP21' THRU 'COMP21' DISPLAY PERSONNEL_ID NAME FIRST_NAME END-READ END
Darrell Skildum / 04/10/23 / 9 Software AG
Output from Read
Page 1 PERSONNEL_ID NAME FIRST_NAME ------------ -------------------- -------------------- 11300324 DAMMBACH FLORIAN 11400325 SPAEHT KLAUS 11700324 MOELLER MARION 11700323 LIST FRANZ 11300323 DAMM WOLFGANG 11300320 BRUNNER HELMUT 11100114 UNGER KLAUS 11100113 TREIBER KLAUS 11100105 SCHIRM CHRISTIAN
Darrell Skildum / 04/10/23 / 10 Software AG
List SQL from READ
Member NATREAD - LISTSQL - Library NDBDEMO NATURAL statement at line 0080 Stmt 1 / 1 READ EMP WITH DEPT = 'COMP21' THRU 'COMP21' Generated SQL statement Mode : dynamic DBRM : Line 1 / 5 SELECT PERSONNEL_ID, NAME, FIRST_NAME, DEPT FROM SADRS.EMPL_BASE WHERE DEPT >= 'COMP21' ORDER BY DEPT FOR FETCH ONLY
Darrell Skildum / 04/10/23 / 11 Software AG
DBLOG from READ
User SADRS - DBLOG Trace - Library NDBDEMO M No R SQL Statement (truncated) CU SN SREF M Typ SQLC/W Program Line LV_ 1 ROLLBACK 00 00 0000 D DB2 6660 00_ 2 SELECT PERSONNEL_ID,NAME,FIRS 01 01 0080 D DB2 NATREAD 0080 01_ 3 FETCH CURSOR NEX 01 01 0080 D DB2 NATREAD 0080 01_ 4 FETCH CURSOR NEX 01 01 0080 D DB2 NATREAD 0080 01_ 5 FETCH CURSOR NEX 01 01 0080 D DB2 NATREAD 0080 01_ 6 FETCH CURSOR NEX 01 01 0080 D DB2 NATREAD 0080 01_ 7 FETCH CURSOR NEX 01 01 0080 D DB2 NATREAD 0080 01_ 8 FETCH CURSOR NEX 01 01 0080 D DB2 NATREAD 0080 01_ 9 FETCH CURSOR NEX 01 01 0080 D DB2 NATREAD 0080 01_ 10 FETCH CURSOR NEX 01 01 0080 D DB2 NATREAD 0080 01_ 11 FETCH CURSOR NEX 01 01 0080 D DB2 NATREAD 0080 01_ 12 FETCH CURSOR NEX 01 01 0080 D DB2 NATREAD 0080 01_ 13 CLOSE CURSOR 01 01 0080 D DB2 NATREAD 0080 01
Darrell Skildum / 04/10/23 / 12 Software AG
Explain from Read
Estimated cost : 428.5 timerons Qblockno Mixop Access Match Index Pre- Access- Column- Planno seq type cols only fetch creator name fn_eval --- --- --- ---- ----- ----- ----- -------- ------------------ - 1 1 R S 1 2 Table Tslock -- sortn -- -- sortc -- Tabno Creator Tname mode Method uq jo or gr uq jo or gr --- -------- ------------------ ------ ------ -- -- -- -- -- -- -- -- 1 SADRS EMPL_BASE IS N N N N N N N N 3 N N N N N N Y N
Darrell Skildum / 04/10/23 / 13 Software AG
Read
READ
Darrell Skildum / 04/10/23 / 14 Software AG
Read Natural V4
DEFINE DATA LOCAL 1 EMP VIEW OF SADRS-EMPL_BASE 2 PERSONNEL_ID 2 NAME 2 FIRST_NAME 2 DEPT END-DEFINE READ EMP WITH DEPT = 'COMP21' TO 'COMP21' DISPLAY PERSONNEL_ID NAME FIRST_NAME END-READ END
Darrell Skildum / 04/10/23 / 15 Software AG
ListSQL V4 Read
Member NATREAD2 - LISTSQL - Library NDBDEMO NATURAL statement at line 0080 Stmt 1 / 1 READ EMP WITH DEPT = 'COMP21' TO 'COMP21' Generated SQL statement Mode : dynamic DBRM : Line 1 / 5 SELECT PERSONNEL_ID, NAME, FIRST_NAME, DEPT FROM SADRS.EMPL_BASE WHERE DEPT BETWEEN 'COMP21' AND 'COMP21' ORDER BY DEPT FOR FETCH ONLY
Darrell Skildum / 04/10/23 / 16 Software AG
Explain for V4 Read
Estimated cost : 16.5 timerons Qblockno Mixop Access Match Index Pre- Access- Column- Planno seq type cols only fetch creator name fn_eval --- --- --- ---- ----- ----- ----- -------- ------------------ - 1 1 I 1 L SADRS DEPT_NAME 1 2 Table Tslock -- sortn -- -- sortc -- Tabno Creator Tname mode Method uq jo or gr uq jo or gr --- -------- ------------------ ------ ------ -- -- -- -- -- -- -- -- 1 SADRS EMPL_BASE IS N N N N N N N N 3 N N N N N N Y N
16.5 timerons vs 428.5
Darrell Skildum / 04/10/23 / 17 Software AG
Coding SQL SPUFI - ISQL
***** **********************00001 SELECT * 00002 FROM SADRS.EMPL_BASE 00003 WHERE DEPT = 'COMP02' ***** **********************
Darrell Skildum / 04/10/23 / 18 Software AG
Coding SQL SPUFI - ISQL
-----------------------------------------------------------------
PERSONNEL_ID FIRST_NAME MIDDLE_NAME NAME
>----------------------------------------------------------------
50003700 LOUIS D'AGOSTINO
50016600 ANNIE GODEFROY
50019000 ROGER BESSON
50020600 DANIEL GREGOIRE
50006700 SERGE RIGOLLET
60000231 ANTONIO VILLAR
60000509 VICTORIA RODRIGUEZ
60008045 GORKA NIEDA
60008231 JORDI MONTERREY ESPLA
60008745 ANTONIO PUERTAS
60008509 MARIA JOSE PUERTOLAS
Darrell Skildum / 04/10/23 / 19 Software AG
Coding SQL
DEFINE DATA LOCAL 1 EMP VIEW OF SADRS-EMPL_BASE 2 PERSONNEL_ID 2 NAME 2 FIRST_NAME 2 DEPT END-DEFINE SELECT * INTO VIEW EMP FROM SADRS-EMPL_BASE WHERE DEPT = 'COMP02' DISPLAY PERSONNEL_ID NAME FIRST_NAMEEND-SELECT END
Darrell Skildum / 04/10/23 / 20 Software AG
Coding SQL
DEFINE DATA LOCAL 1 EMP VIEW OF SADRS-EMPL_BASE 2 PERSONNEL_ID 2 NAME 2 FIRST_NAME 2 DEPT END-DEFINE INTO VIEW EMP FROM SADRS-EMPL_BASE WHERE DEPT = 'COMP02' DISPLAY PERSONNEL_ID NAME FIRST_NAMEEND-SELECT END
SELECT PERSONNEL_ID, NAME, FIRST_NAME, DEPT
Darrell Skildum / 04/10/23 / 21 Software AG
LIKE
DEFINE DATA LOCAL 1 EMP VIEW OF SADRS-EMPL_BASE 2 PERSONNEL_ID 2 NAME 2 FIRST_NAME 2 DEPT END-DEFINE SELECT PERSONNEL_ID, NAME, FIRST_NAME, DEPT INTO EMP.PERSONNEL_ID, EMP.NAME, EMP.FIRST_NAME, EMP.DEPT FROM SADRS-EMPL_BASE WHERE DEPT LIKE 'COMP0%' DISPLAY EMP.PERSONNEL_ID EMP.NAME EMP.FIRST_NAME EMP.DEPT END-SELECT END
Darrell Skildum / 04/10/23 / 22 Software AG
LIKE RESULTS
PERSONNEL_ID NAME FIRST_NAME DEPT ------------ -------------------- -------------------- ------ 50003700 D'AGOSTINO LOUIS COMP0250003100 HEURTEBISE MICHEL COMP0150001700 TANCHOU GERARD COMP0150001200 SIECA FRANCOIS COMP0150000300 FISCHER RENE COMP0350014000 LEFEBVRE CLAUDE COMP0150015800 CATILLON MARCEL COMP0350016000 ROLLET GEORGES COMP0150016600 GODEFROY ANNIE COMP0250019000 BESSON ROGER COMP0250019500 YOT RENE COMP0150020600 GREGOIRE DANIEL COMP0250000100 GASET JEAN COMP0150000500 RIVIERE JEAN-LUC COMP0550006800 THIEBAULT ROBERT COMP0350006700 RIGOLLET SERGE COMP0250006600 TEYSSIER MICHEL COMP0160000231 VILLAR ANTONIO COMP02
Darrell Skildum / 04/10/23 / 23 Software AG
IN
SELECT PERSONNEL_ID, NAME, FIRST_NAME, DEPT
INTO EMP.PERSONNEL_ID, EMP.NAME, EMP.FIRST_NAME, EMP.DEPT
FROM SADRS-EMPL_BASE
WHERE DEPT IN ('COMP02', 'COMP03', 'COMP21')
DISPLAY EMP.PERSONNEL_ID EMP.NAME EMP.FIRST_NAME EMP.DEPT
END-SELECT
Darrell Skildum / 04/10/23 / 24 Software AG
IN - Results
PERSONNEL_ID NAME FIRST_NAME DEPT ------------ -------------------- -------------------- ------ 50003700 D'AGOSTINO LOUIS COMP0250000300 FISCHER RENE COMP0350015800 CATILLON MARCEL COMP0350016600 GODEFROY ANNIE COMP0250019000 BESSON ROGER COMP0250020600 GREGOIRE DANIEL COMP0250006800 THIEBAULT ROBERT COMP0350006700 RIGOLLET SERGE COMP0211100105 SCHIRM CHRISTIAN COMP2111100113 TREIBER KLAUS COMP2111100114 UNGER KLAUS COMP2111300320 BRUNNER HELMUT COMP2111300323 DAMM WOLFGANG COMP2111700323 LIST FRANZ COMP2111700324 MOELLER MARION COMP21
Darrell Skildum / 04/10/23 / 25 Software AG
BETWEEN
DEFINE DATA LOCAL 1 EMP VIEW OF SADRS-EMPL_BASE 2 PERSONNEL_ID 2 NAME 2 FIRST_NAME 2 DEPT END-DEFINE SELECT PERSONNEL_ID, NAME, FIRST_NAME, DEPT INTO EMP.PERSONNEL_ID, EMP.NAME, EMP.FIRST_NAME, EMP.DEPT FROM SADRS-EMPL_BASE WHERE DEPT BETWEEN 'COMP02' AND 'COMP05' DISPLAY EMP.PERSONNEL_ID EMP.NAME EMP.FIRST_NAME EMP.DEPT END-SELECT
Darrell Skildum / 04/10/23 / 26 Software AG
BETWEEN - RESULTS
PERSONNEL_ID NAME FIRST_NAME DEPT ------------ -------------------- -------------------- ------ 50003700 D'AGOSTINO LOUIS COMP02 50000300 FISCHER RENE COMP03 50015800 CATILLON MARCEL COMP03 50016600 GODEFROY ANNIE COMP02 50019000 BESSON ROGER COMP02 50020600 GREGOIRE DANIEL COMP02 50000500 RIVIERE JEAN-LUC COMP05 50006800 THIEBAULT ROBERT COMP03 50006700 RIGOLLET SERGE COMP02 60000231 VILLAR ANTONIO COMP02 60000509 RODRIGUEZ VICTORIA COMP02 60008045 NIEDA GORKA COMP02 60008100 PELEGRIN MANUEL COMP03 60008231 ESPLA JORDI COMP02 60008745 PUERTAS ANTONIO COMP02 60008168 MARTINEZ ANTONIO COMP03 60008287 PEREZ ANTONIO COMP03 60008509 PUERTOLAS MARIA JOSE COMP02
Darrell Skildum / 04/10/23 / 27 Software AG
Nested Select
DEFINE DATA LOCAL
1 EMP VIEW OF SADRS-EMPL_BASE
2 PERSONNEL_ID
2 NAME
2 FIRST_NAME
2 DEPT
1 VEH VIEW OF SADRS-VEHICLES
2 PERSONNEL_ID
2 MAKE
2 MODEL
2 REG_NUM
END-DEFINE
SELECT * INTO VIEW EMP
FROM SADRS-EMPL_BASE
WHERE DEPT = 'COMP21'
SELECT * INTO VIEW VEH
FROM SADRS-VEHICLES
WHERE PERSONNEL_ID = EMP.PERSONNEL_ID
DISPLAY PERSONNEL_ID FIRST_NAME NAME MAKE
END-SELECT
Darrell Skildum / 04/10/23 / 28 Software AG
Nested Select
test dblog q ? > + Program SQLEX5 Lib NDBDEMO
p ....+....1....+....2....+....3....+....4....+....5....+....6....+....7
0010 DEFINE DATA LOCAL
0020 1 EMP VIEW OF SADRS-EMPL_BASE
0030 2 PERSONNEL_ID
0040 2 NAME
0050 2 FIRST_NAME
0060 2 DEPT
0070 1 VEH VIEW OF SADRS-VEHICLES
0080 2 PERSONNEL_ID
0090 2 MAKE
0100 2 MODEL
0110 2 REG_NUM
0120 END-DEFINE
0130 SELECT * INTO VIEW EMP
0140 FROM SADRS-EMPL_BASE
0150 WHERE DEPT = 'COMP21'
0160 SELECT * INTO VIEW VEH
0170 FROM SADRS-VEHICLES
0180 WHERE PERSONNEL_ID = EMP.PERSONNEL_ID
0190 IF NO RECORDS FOUND
0200 MOVE 'NONE' TO VEH.MAKE
Darrell Skildum / 04/10/23 / 29 Software AG
Nested Select
User SADRS - DBLOG Menu - Library NDBDEMO
Code Function
---- ------------------------------------
B Begin Logging of SQL Statements
E End and Display Log Records
S Snapshot of Specific SQL Statement
. Exit
---- ------------------------------------
Code .. B
Statement .. select__ Skip ....... _____ Program .... ________
Line from .. 0000
Low SQLC .. ______ High SQLC .. ______ Line to .... 0000
Darrell Skildum / 04/10/23 / 30 Software AG
Nested Select
NEXT test dblog q show LIB=NDBDEMO
Page 1 05-04-06 01:47:57
PERSONNEL_ID FIRST_NAME NAME MAKE
------------ -------------------- -------------------- --------------------
11100105 CHRISTIAN SCHIRM OPEL
11100113 KLAUS TREIBER AUDI
11100114 KLAUS UNGER BMW
11300320 HELMUT BRUNNER AUDI
11300323 WOLFGANG DAMM VW
11700323 FRANZ LIST VW
11700324 MARION MOELLER NONE
11400325 KLAUS SPAEHT AUDI
11300324 FLORIAN DAMMBACH VW
Darrell Skildum / 04/10/23 / 31 Software AG
Nested Select
User SADRS - DBLOG Trace - Library NDBDEMO
M No R SQL Statement (truncated) CU SN SREF M Typ SQLC/W Program Line LV
_ 1 SELECT PERSONNEL_ID,NAME,FIRS 03 03 0130 D DB2 SQLEX5 0130 01
_ 2 SELECT PERSONNEL_ID,MAKE,MODE 04 04 0160 D DB2 SQLEX5 0160 01
_ 3 SELECT PERSONNEL_ID,MAKE,MODE 04 04 0160 D DB2 SQLEX5 0160 01
_ 4 SELECT PERSONNEL_ID,MAKE,MODE 04 04 0160 D DB2 SQLEX5 0160 01
_ 5 SELECT PERSONNEL_ID,MAKE,MODE 04 04 0160 D DB2 SQLEX5 0160 01
_ 6 SELECT PERSONNEL_ID,MAKE,MODE 04 04 0160 D DB2 SQLEX5 0160 01
_ 7 SELECT PERSONNEL_ID,MAKE,MODE 04 04 0160 D DB2 SQLEX5 0160 01
_ 8 SELECT PERSONNEL_ID,MAKE,MODE 04 04 0160 D DB2 SQLEX5 0160 01
_ 9 SELECT PERSONNEL_ID,MAKE,MODE 04 04 0160 D DB2 SQLEX5 0160 01
_ 10 SELECT PERSONNEL_ID,MAKE,MODE 04 04 0160 D DB2 SQLEX5 0160 01
Darrell Skildum / 04/10/23 / 32 Software AG
Nested Select
Member SQLEX5 - LISTSQL - Library NDBDEMO
NATURAL statement at line 0130 Stmt 1 / 2
SELECT * INTO VIEW EMP
FROM SADRS-EMPL_BASE
WHERE DEPT = 'COMP21'
Generated SQL statement Mode : dynamic DBRM : Line 1 / 4
SELECT PERSONNEL_ID, NAME, FIRST_NAME, DEPT
FROM SADRS.EMPL_BASE
WHERE DEPT = 'COMP21'
FOR FETCH ONLY
Darrell Skildum / 04/10/23 / 33 Software AG
Nested Select
Queryno 1 EXPLAIN Result Row 1 / 1
Estimated cost : 5.3 timerons
Qblockno Mixop Access Match Index Pre- Access- Column-
Planno seq type cols only fetch creator name fn_eval
--- --- --- ---- ----- ----- ----- -------- ------------------ -
1 1 I 1 L SADRS DEPT_NAME
Table Tslock -- sortn -- -- sortc --
Tabno Creator Tname mode Method uq jo or gr uq jo or gr
--- -------- ------------------ ------ ------ -- -- -- -- -- -- -- --
1 SADRS EMPL_BASE IS N N N N N N N N
Darrell Skildum / 04/10/23 / 34 Software AG
Nested Select
Member SQLEX5 - LISTSQL - Library NDBDEMO
NATURAL statement at line 0160 Stmt 2 / 2
SELECT * INTO VIEW VEH
FROM SADRS-VEHICLES
WHERE PERSONNEL_ID = EMP.PERSONNEL_ID
Generated SQL statement Mode : dynamic DBRM : Line 1 / 4
SELECT PERSONNEL_ID, MAKE, MODEL, REG_NUM
FROM SADRS.VEHICLES
WHERE PERSONNEL_ID =?
FOR FETCH ONLY
Darrell Skildum / 04/10/23 / 35 Software AG
Nested Select
Queryno 1 EXPLAIN Result Row 1 / 1
Estimated cost : 3.7 timerons
Qblockno Mixop Access Match Index Pre- Access- Column-
Planno seq type cols only fetch creator name fn_eval
--- --- --- ---- ----- ----- ----- -------- ------------------ -
1 1 I 1 VEHICLES PERSSNNEL_ID
Table Tslock -- sortn -- -- sortc --
Tabno Creator Tname mode Method uq jo or gr uq jo or gr
--- -------- ------------------ ------ ------ -- -- -- -- -- -- -- --
1 SADRS VEHICLES IS N N N N N N N N
Darrell Skildum / 04/10/23 / 36 Software AG
Nested Select
PERSONNEL_ID FIRST_NAME NAME MAKE
------------ -------------------- -------------------- --------------------
11100105 CHRISTIAN SCHIRM OPEL
11100113 KLAUS TREIBER AUDI
11100114 KLAUS UNGER BMW
11300320 HELMUT BRUNNER AUDI
11300323 WOLFGANG DAMM VW
11700323 FRANZ LIST VW
11400325 KLAUS SPAEHT AUDI
11300324 FLORIAN DAMMBACH VW
Darrell Skildum / 04/10/23 / 37 Software AG
Nested Select
User SADRS - DBLOG Trace - Library NDBDEMO
M No R SQL Statement (truncated) CU SN SREF M Typ SQLC/W Program Line LV
_ 1 SELECT PERSONNEL_ID,NAME,FIRS 03 03 0130 D DB2 SQLEX5 0130 01
_ 2 SELECT PERSONNEL_ID,MAKE,MODE 04 04 0160 D DB2 SQLEX5 0160 01
_ 3 SELECT PERSONNEL_ID,MAKE,MODE 04 04 0160 D DB2 SQLEX5 0160 01
_ 4 SELECT PERSONNEL_ID,MAKE,MODE 04 04 0160 D DB2 SQLEX5 0160 01
_ 5 SELECT PERSONNEL_ID,MAKE,MODE 04 04 0160 D DB2 SQLEX5 0160 01
_ 6 SELECT PERSONNEL_ID,MAKE,MODE 04 04 0160 D DB2 SQLEX5 0160 01
_ 7 SELECT PERSONNEL_ID,MAKE,MODE 04 04 0160 D DB2 SQLEX5 0160 01
_ 8 SELECT PERSONNEL_ID,MAKE,MODE 04 04 0160 D DB2 SQLEX5 0160 01
_ 9 SELECT PERSONNEL_ID,MAKE,MODE 04 04 0160 D DB2 SQLEX5 0160 01
_ 10 SELECT PERSONNEL_ID,MAKE,MODE 04 04 0160 D DB2 SQLEX5 0160 01
Total cost = 1*5.3 + 9*3.7 = 38.6
Darrell Skildum / 04/10/23 / 38 Software AG
Normal Join
DEFINE DATA LOCAL
1 EMP VIEW OF SADRS-EMPL_BASE
2 NAME
2 PERSONNEL_ID
2 DEPT
2 FIRST_NAME
1 VEH VIEW OF SADRS-VEHICLES
2 MAKE
2 MODEL
2 PERSONNEL_ID
2 REG_NUM
END-DEFINE
SELECT A.NAME, A.PERSONNEL_ID, A.DEPT, A.FIRST_NAME,
B.MAKE, B.MODEL, B.PERSONNEL_ID, B.REG_NUM
INTO VIEW EMP,VEH
FROM SADRS-EMPL_BASE A , SADRS-VEHICLES B
WHERE DEPT = 'COMP21'
AND B.PERSONNEL_ID = A.PERSONNEL_ID
ORDER BY A.NAME
DISPLAY EMP.NAME EMP.PERSONNEL_ID VEH.MAKE DEPT
Correlation NameAlias or
Darrell Skildum / 04/10/23 / 39 Software AG
Join Results
PERSONNEL_ID FIRST_NAME NAME MAKE
------------ -------------------- -------------------- --------------------
11100105 CHRISTIAN SCHIRM OPEL
11100113 KLAUS TREIBER AUDI
11100114 KLAUS UNGER BMW
11300320 HELMUT BRUNNER AUDI
11300323 WOLFGANG DAMM VW
11700323 FRANZ LIST VW
11400325 KLAUS SPAEHT AUDI
11300324 FLORIAN DAMMBACH VW
Darrell Skildum / 04/10/23 / 40 Software AG
Join ListSql
Member SQLEX6 - LISTSQL - Library NDBDEMO
NATURAL statement at line 0130 Stmt 1 / 1
SELECT A.NAME, A.PERSONNEL_ID, A.DEPT, A.FIRST_NAME,
B.MAKE, B.MODEL, B.PERSONNEL_ID, B.REG_NUM
INTO VIEW EMP,VEH
Generated SQL statement Mode : dynamic DBRM : Line 1 / 6
SELECT A.NAME, A.PERSONNEL_ID, A.DEPT, A.FIRST_NAME, B.MAKE, B.MODEL, B
.PERSONNEL_ID, B.REG_NUM
FROM SADRS.EMPL_BASE A, SADRS.VEHICLES B
WHERE DEPT = 'COMP21' AND B.PERSONNEL_ID = A.PERSONNEL_ID
ORDER BY A.NAME
FOR FETCH ONLY
Darrell Skildum / 04/10/23 / 41 Software AG
Join Explain
Estimated cost : 26.5 timerons
Qblockno Mixop Access Match Index Pre- Access- Column-
Planno seq type cols only fetch creator name fn_eval
--- --- --- ---- ----- ----- ----- -------- ------------------ -
1 1 I 1 L SADRS DEPT_NAME
1 2 I 1 VEHICLES PERSSNNEL_ID
1 3
Table Tslock -- sortn -- -- sortc --
Tabno Creator Tname mode Method uq jo or gr uq jo or gr
--- -------- ------------------ ------ ------ -- -- -- -- -- -- -- --
1 SADRS EMPL_BASE IS N N N N N N N N
2 SADRS VEHICLES IS 1 N N N N N N N N
3 N N N N N N Y N
vs 38.6
Darrell Skildum / 04/10/23 / 42 Software AG
Join Explain
Estimated cost : 26.5 timerons
Qblockno Mixop Access Match Index Pre- Access- Column-
Planno seq type cols only fetch creator name fn_eval
--- --- --- ---- ----- ----- ----- -------- ------------------ -
1 1 I 1 L SADRS DEPT_NAME
1 2 I 1 VEHICLES PERSSNNEL_ID
1 3
Table Tslock -- sortn -- -- sortc --
Tabno Creator Tname mode Method uq jo or gr uq jo or gr
--- -------- ------------------ ------ ------ -- -- -- -- -- -- -- --
1 SADRS EMPL_BASE IS N N N N N N N N
2 SADRS VEHICLES IS 1 N N N N N N N N
3 N N N N N N Y N
vs 38.6
Darrell Skildum / 04/10/23 / 43 Software AG
Nested Select – No Records
SELECT * INTO VIEW EMP
FROM SADRS-EMPL_BASE
WHERE DEPT = 'COMP21'
SELECT * INTO VIEW VEH
FROM SADRS-VEHICLES
WHERE PERSONNEL_ID = EMP.PERSONNEL_ID
IF NO RECORDS FOUND
MOVE 'NONE' TO VEH.MAKE
END-NOREC
DISPLAY EMP.PERSONNEL_ID FIRST_NAME NAME MAKE
END-SELECT
END-SELECT
Darrell Skildum / 04/10/23 / 44 Software AG
Nested Select – No Records
PERSONNEL_ID FIRST_NAME NAME MAKE
------------ -------------------- -------------------- --------------------
11100105 CHRISTIAN SCHIRM OPEL
11100113 KLAUS TREIBER AUDI
11100114 KLAUS UNGER BMW
11300320 HELMUT BRUNNER AUDI
11300323 WOLFGANG DAMM VW
11700323 FRANZ LIST VW
11700324 MARION MOELLER NONE
11400325 KLAUS SPAEHT AUDI
11300324 FLORIAN DAMMBACH VW
Darrell Skildum / 04/10/23 / 45 Software AG
Left Outer Join
SELECT A.NAME, A.PERSONNEL_ID, A.DEPT, B.MAKE, B.MODEL, B.PERSONNEL_ID
INTO VIEW EMP,VEH
FROM (SELECT NAME,PERSONNEL_ID, DEPT FROM SADRS-EMPL_BASE
WHERE DEPT = 'COMP21') AS A
LEFT OUTER JOIN (SELECT MAKE, MODEL,PERSONNEL_ID
FROM SADRS-VEHICLES) AS B
ON B.PERSONNEL_ID = A.PERSONNEL_ID
ORDER BY A.NAME
IF VEH.MAKE = ' '
MOVE '***NONE***' TO VEH.MAKE
END-IF
DISPLAY EMP.NAME EMP.PERSONNEL_ID VEH.MAKE DEPT
END-SELECT
Darrell Skildum / 04/10/23 / 46 Software AG
Left Outer Join Results
NAME PERSONNEL_ID MAKE DEPT -------------------- ------------ -------------------- ------
BRUNNER 11300320 AUDI COMP21
DAMM 11300323 VW COMP21
DAMMBACH 11300324 VW COMP21
LIST 11700323 VW COMP21
MOELLER 11700324 ***NONE*** COMP21
SCHIRM 11100105 OPEL COMP21
SPAEHT 11400325 AUDI COMP21
TREIBER 11100113 AUDI COMP21
UNGER 11100114 BMW COMP21
Darrell Skildum / 04/10/23 / 47 Software AG
SubQuery
DEFINE DATA LOCAL 1 EMP VIEW OF SADRS-EMPL_BASE 2 PERSONNEL_ID 2 NAME 2 FIRST_NAME 1 SAL VIEW OF SADRS-EMPLOYEE_PAY 2 PAY_SEQ 2 SALARY END-DEFINE SELECT A.PERSONNEL_ID, A.NAME, A.FIRST_NAME, B.PAY_SEQ, B.SALARY INTO EMP.PERSONNEL_ID, EMP.NAME, EMP.FIRST_NAME, SAL.PAY_SEQ, SAL.SALARY FROM SADRS-EMPL_BASE A, SADRS-EMPLOYEE_PAY B WHERE A.PERSONNEL_ID = '11100114' AND B.PERSONNEL_ID = A.PERSONNEL_ID AND PAY_SEQ = (SELECT MAX(PAY_SEQ) FROM SADRS-EMPLOYEE_PAY WHERE PERSONNEL_ID = A.PERSONNEL_ID) DISPLAY NAME SALARY PAY_SEQ END-SELECT
Darrell Skildum / 04/10/23 / 48 Software AG
SubQuery Results
Page 1 NAME SALARY PAY_SEQ -------------------- ---------- ----------- UNGER 46000 4
Darrell Skildum / 04/10/23 / 49 Software AG
SubQuery and calculated field
SELECT A.PERSONNEL_ID, A.NAME, A.FIRST_NAME, B.PAY_SEQ, B.SALARY + B.BONUS1 + B.BONUS2 + B.BONUS3 AS TOTAL_PAY INTO EMP.PERSONNEL_ID, EMP.NAME, EMP.FIRST_NAME, SAL.PAY_SEQ, #TOTAL-PAY FROM SADRS-EMPL_BASE A, SADRS-EMPLOYEE_PAY B WHERE A.PERSONNEL_ID = '11100112' AND B.PERSONNEL_ID = A.PERSONNEL_ID AND PAY_SEQ = (SELECT MAX(PAY_SEQ) FROM SADRS-EMPLOYEE_PAY WHERE PERSONNEL_ID = A.PERSONNEL_ID) DISPLAY NAME #TOTAL-PAY PAY_SEQ END-SELECT
Darrell Skildum / 04/10/23 / 50 Software AG
SubQuery and calculated field
Page 1 NAME #TOTAL-PAY PAY_SEQ -------------------- ----------- ----------- THOMA 46000.00 4
Darrell Skildum / 04/10/23 / 51 Software AG
DEFINE DATA PARAMETER 01 #SSN (A9) 01 #TODAY (A10) 01 #BEGIN-DATEA (A10) 01 #BEGIN-ANNUAL (P4.2) 01 #EARNED-ANNUAL (P4.2) 01 #TAKEN-ANNUAL (P4.2) 01 #ADJUST-ANNUAL (P4.2) 01 #CURR-ANNUAL (P4.2) 01 #PENDING-ANNUAL (P4.2) 01 #AVAIL-ANNUAL (P4.2) 01 #BEGIN-DATES (A10)
USING DB2 functions
Darrell Skildum / 04/10/23 / 52 Software AG
SELECT SUM(ALVB50D_NOHOUR) INTO #EARNED-ANNUAL FROM PALV-ALVB50D WHERE ALVB50D_NOSSN = #SSN AND ALVB50D_CDTYLV = 'AN' AND ALVB50D_CDTYTR = 'E' AND ALVB50D_DCLVE >= #BEGIN-DATEA GROUP BY ALVB50D_NOSSN END-SELECT
USING DB2 functions
Darrell Skildum / 04/10/23 / 53 Software AG
Union
DEFINE DATA LOCAL 1 EMP VIEW OF SADRS-EMPL_BASE 2 PERSONNEL_ID 2 NAME 2 FIRST_NAME 2 DEPT 2 COUNTRY END-DEFINE SELECT * INTO VIEW EMP FROM SADRS-EMPLOY_DE WHERE DEPT LIKE 'COMP%%' UNION (SELECT * FROM SADRS-EMPLOY_UK WHERE DEPT LIKE 'COMP%%') ORDER BY NAME DISPLAY PERSONNEL_ID FIRST_NAME NAME DEPT COUNTRY END-SELECT END
Darrell Skildum / 04/10/23 / 54 Software AG
Union Results
PERSONNEL_ID FIRST_NAME NAME DEPT COUNTRY------------ -------------------- -------------------- ------ ------- 30000231 ROBERT ACHIESON COMP02 UK 30021544 ELIZABETH AKROYD COMP03 UK 30034231 ROBIN ARCHER COMP02 UK 11500327 HANS BACHMANN COMP35 D 30008042 PAULINE BAKER COMP12 UK 30000287 JACK BIRKENSHAW COMP12 UK 30034311 IAN BRANGWIN COMP01 UK 30008509 CAROLINE BROOKS COMP02 UK 11300320 HELMUT BRUNNER COMP21 D 11300321 MANFRED BUCHERT COMP25 D 30021630 ANDREW BULLOCK COMP03 UK 11100110 GEORG BUNGERT COMP25 D 11300322 FRANZ BURKNER COMP25 D 30034107 COLIN CARROLL COMP01 UK 30016045 JULIAN CHESTER COMP02 UK 30034509 IAN COLQHOUN COMP12 UK 11300323 WOLFGANG DAMM COMP21 D 11300324 FLORIAN DAMMBACH COMP21 D
Darrell Skildum / 04/10/23 / 55 Software AG
Updating
1 EMP VIEW OF I038-EMPLOYEES 2 NAME 2 PERSONNEL_ID 2 SALARY_1 1 EMP2 VIEW OF I038-EMPLOYEES 2 NAME 2 PERSONNEL_ID 2 SALARY_1 1 #PID (A8) END-DEFINE INPUT #PID SELECT * INTO VIEW EMP FROM I038-EMPLOYEES WHERE PERSONNEL_ID = #PID END-SELECT INPUT (AD=M) EMP.PERSONNEL_ID EMP.NAME EMP.SALARY_1 SELECT * INTO VIEW EMP2 FROM I038-EMPLOYEES WHERE PERSONNEL_ID = #PID MOVE BY NAME EMP TO EMP2 UPDATE END-SELECT
Darrell Skildum / 04/10/23 / 56 Software AG
Updating
1 EMP VIEW OF I038-EMPLOYEES 2 NAME 2 PERSONNEL_ID 2 SALARY_1 1 EMP2 VIEW OF I038-EMPLOYEES 2 NAME 2 PERSONNEL_ID 2 SALARY_1 1 #PID (A8) END-DEFINE REPEAT INPUT #PID SELECT * INTO VIEW EMP FROM I038-EMPLOYEES WHERE PERSONNEL_ID = #PID END-SELECT INPUT (AD=M) EMP.PERSONNEL_ID EMP.NAME EMP.SALARY_1 UPDATE EMP SET * WHERE PERSONNEL_ID = #PID END-REPEAT
Darrell Skildum / 04/10/23 / 57 Software AG
Updating 2
DEFINE DATA LOCAL 1 EMP VIEW OF I038-EMPLOYEES 2 NAME 2 PERSONNEL_ID 2 SALARY_1 1 #PID (A8) END-DEFINE REPEAT INPUT #PID SELECT * INTO VIEW EMP FROM I038-EMPLOYEES WHERE PERSONNEL_ID = #PID END-SELECT INPUT (AD=M) EMP.PERSONNEL_ID EMP.NAME EMP.SALARY_1 UPDATE I038-EMPLOYEES SET NAME = EMP.NAME, SALARY_1 = EMP.SALARY_1 WHERE PERSONNEL_ID = #PID END-REPEAT END
Darrell Skildum / 04/10/23 / 58 Software AG
Cross Transation Update
> TEST DBLOG Q START > + Program EMPUPD1 Lib DRSLIB All ....+....1....+....2....+....3....+....4....+....5....+.Mode Structured. 0010 DEFINE DATA LOCAL 0020 1 EMP VIEW OF I038-EMPLOYEES 0030 2 NAME 0040 2 PERSONNEL_ID 0050 2 SALARY_1 0060 1 EMP2 VIEW OF I038-EMPLOYEES 0070 2 NAME 0080 2 PERSONNEL_ID 0090 2 SALARY_1 0100 1 #PID (A8) 0110 END-DEFINE 0120 INPUT #PID 0130 RD1. 0140 SELECT * INTO VIEW EMP FROM I038-EMPLOYEES 0150 WHERE PERSONNEL_ID = #PID 0160 INPUT (AD=M) EMP.PERSONNEL_ID EMP.NAME EMP.SALARY_1 0170 UPDATE (RD1.) 0180 END-SELECT 0190 END
Darrell Skildum / 04/10/23 / 59 Software AG
Updating one record
#PID 30000100
Darrell Skildum / 04/10/23 / 60 Software AG
Updating one record
PERSONNEL_ID 30000100 NAME LLOYD SALARY_1 7200
Darrell Skildum / 04/10/23 / 61 Software AG
SQL Log from Update IMS with FS
User DRS - DBLOG Trace - Library DRSLIB M No R SQL Statement (truncated) CU SN SREF M Typ SQLC/W Program Line LV_ 1 SELECT NAME,PERSONNEL_ID,SALA 01 01 0130 D DB2 EMPUPD1 0130 01_ 2 FETCH CURSOR 01 01 0130 D DB2 EMPUPD1 0130 01_ 3 ROLLOUTS TO FILE SERVER:00000 01 01 0130 D DB2 EMPUPD1 0160 01_ 4 * SELECT NAME,PERSONNEL_ID,SALA 01 01 0130 D DB2 EMPUPD1 0170 01_ 5 * FETCH CURSOR 01 01 0130 D DB2 EMPUPD1 0170 01_ 6 * UPDATE I038.EMPLOYEES SET NAM 01 02 0130 D DB2 EMPUPD1 0170 01_ 7 * CLOSE CURSOR 01 01 0130 D DB2 EMPUPD1 0170 01_ 8 READ FROM FILE SERVER 00 00 0130 D DB2 100 EMPUPD1 0130 01_ 9 CLOSE FILE SERVER 00 00 0130 D DB2 EMPUPD1 0130 01
Darrell Skildum / 04/10/23 / 62 Software AG
SQL Log from Update - Complete
M No R SQL Statement (truncated) CU SN SREF M Typ SQLC/W Program Line LV_ 1 SELECT NAME,PERSONNEL_ID FROM 01 01 0110 D DB2 EMPUPD 0110 01_ 2 FETCH CURSOR NEX 01 01 0110 D DB2 EMPUPD 0110 01_ 3 POSSIBLY IMPLICIT COMMIT 00 00 0000 D DB2 EMPUPD 0140 01_ 4 UPDATE SADRS.EMPL_BASE SET NA 01 02 0110 D DB2 EMPUPD 0150 01_ 5 FETCH CURSOR NEX 01 01 0110 D DB2 100 EMPUPD 0110 01_ 6 CLOSE CURSOR 01 01 0110 D DB2 EMPUPD 0110 01
Darrell Skildum / 04/10/23 / 63 Software AG
Updating without reading row first
DEFINE DATA LOCAL
1 #PID (A8)
END-DEFINE
UPDATE I038-EMPLOYEES SET
SALARY_1 = SALARY_1 + .05*SALARY_1
WHERE DEPT = 'COMP02'
END
Darrell Skildum / 04/10/23 / 64 Software AG
Sample 1 code
SELECT * INTO VIEW FT_FINAN_TRAN FROM FT_FINAN_TRAN WHERE COY = #CCCWOTN-IN.COY AND TRAN_ACCOUNT_ID = #CCCWOTN-IN.ACCOUNT_ID AND TRAN_SA_ID = #CCCWOTN-IN.SA_ID ORDER BY TRAN_ACCOUNT_ID, TRAN_DT, ADD_TIME
REJECT IF FT_FINAN_TRAN.TRAN_CANCELED = 'Y' REJECT IF FT_FINAN_TRAN.TRAN_MEMO_IND = 'Y' REJECT IF FT_FINAN_TRAN.TRAN_TYPE = #CFTTRTL.#MEMO REJECT IF FT_FINAN_TRAN.TRAN_TYPE = #CFTTRTL.#CASH-DIST REJECT IF FT_FINAN_TRAN.TRAN_TYPE = #CFTTRTL.#CASH-DIST-CANCEL-DETAIL REJECT IF FT_FINAN_TRAN.TRAN_TYPE = #CFTTRTL.#BILL-CANCEL-DETAIL REJECT IF FT_FINAN_TRAN.TRAN_TYPE = #CFTTRTL.#PAY-CANCEL-DETAIL REJECT IF (FT_FINAN_TRAN.TRAN_TOT_AMT = 0 AND FT_FINAN_TRAN.TRAN_WRITE_OFF = 0)
Darrell Skildum / 04/10/23 / 65 Software AG
Sample 1 DBLOG
M No R SQL Statement (truncated) CU SN SREF M Typ SQLC/W Program Line LV_ 1 SELECT LOG_COUNTER,COY,ADD_US 01 01 2670 D DB2 DRSOYN5 2670 01_ 2 FETCH CURSOR 01 01 2670 D DB2 DRSOYN5 2670 01_ 3 FETCH CURSOR 01 01 2670 D DB2 DRSOYN5 2670 01_ 4 FETCH CURSOR 01 01 2670 D DB2 DRSOYN5 2670 01_ 5 FETCH CURSOR 01 01 2670 D DB2 DRSOYN5 2670 01_ 6 FETCH CURSOR 01 01 2670 D DB2 DRSOYN5 2670 01_ 7 FETCH CURSOR 01 01 2670 D DB2 DRSOYN5 2670 01_ 8 FETCH CURSOR 01 01 2670 D DB2 DRSOYN5 2670 01_ 9 FETCH CURSOR 01 01 2670 D DB2 DRSOYN5 2670 01_ 10 FETCH CURSOR 01 01 2670 D DB2 DRSOYN5 2670 01_ 11 FETCH CURSOR 01 01 2670 D DB2 DRSOYN5 2670 01_ 12 FETCH CURSOR 01 01 2670 D DB2 DRSOYN5 2670 01_ 13 FETCH CURSOR 01 01 2670 D DB2 DRSOYN5 2670 01_ 14 FETCH CURSOR 01 01 2670 D DB2 DRSOYN5 2670 01 _ 15 FETCH CURSOR 01 01 2670 D DB2 DRSOYN5 2670 01
………………………………………………………………………………………………………………………………………………………….._ 28 FETCH CURSOR 01 01 2670 D DB2 DRSOYN5 2670 01_ 29 FETCH CURSOR 01 01 2670 D DB2 DRSOYN5 2670 01_ 30 FETCH CURSOR 01 01 2670 D DB2 DRSOYN5 2670 01_ 31 FETCH CURSOR 01 01 2670 D DB2 100 DRSOYN5 2670 01_ 32 CLOSE CURSOR 01 01 2670 D DB2 DRSOYN5 2670 01
Darrell Skildum / 04/10/23 / 66 Software AG
Sample 1 Code Revision
SELECT * INTO VIEW FT_FINAN_TRAN FROM FT_FINAN_TRAN WHERE COY = #CCCWOTN-IN.COY AND TRAN_ACCOUNT_ID = #CCCWOTN-IN.ACCOUNT_ID AND TRAN_SA_ID = #CCCWOTN-IN.SA_ID AND FT_FINAN_TRAN.TRAN_CANCELED <> 'Y' AND TRAN_MEMO_IND <> 'Y' AND TRAN_TYPE NOT IN (#CFTTRTL.#MEMO, #CFTTRTL.#CASH-DIST,#CFTTRTL.#CASH-DIST-CANCEL-DETAIL, #CFTTRTL.#BILL-CANCEL-DETAIL, #CFTTRTL.#PAY-CANCEL-DETAIL) AND TRAN_TOT_AMT + TRAN_WRITE_OFF <> 0 ORDER BY TRAN_ACCOUNT_ID, TRAN_DT, ADD_TIME*
Darrell Skildum / 04/10/23 / 67 Software AG
Sample 1 Revised DBLOG
M No R SQL Statement (truncated) CU SN SREF M Typ SQLC/W Program Line LV_ 1 SELECT LOG_COUNTER,COY,ADD_US 01 01 2420 D DB2 DRSOYN5Z 2420 01_ 2 FETCH CURSOR 01 01 2420 D DB2 DRSOYN5Z 2420 01_ 3 FETCH CURSOR 01 01 2420 D DB2 DRSOYN5Z 2420 01_ 4 FETCH CURSOR 01 01 2420 D DB2 DRSOYN5Z 2420 01_ 5 FETCH CURSOR 01 01 2420 D DB2 DRSOYN5Z 2420 01_ 6 FETCH CURSOR 01 01 2420 D DB2 DRSOYN5Z 2420 01_ 7 FETCH CURSOR 01 01 2420 D DB2 DRSOYN5Z 2420 01_ 8 FETCH CURSOR 01 01 2420 D DB2 100 DRSOYN5Z 2420 01_ 9 CLOSE CURSOR 01 01 2420 D DB2 DRSOYN5Z 2420 01_ 10 ROLLBACK 00 00 0000 D DB2 DBLOQ 0000 00
Darrell Skildum / 04/10/23 / 68 Software AG
Sample 2
SELECT * INTO VIEW CIS_ACCOUNT FROM CIS_ACCOUNT WHERE COY = #INPUT.COY AND ACCOUNT_ID = AD_ADJUST.ACCOUNT_ID OPTIMIZE FOR 1 ROW * SP. SELECT * INTO VIEW CIS_PERSON FROM CIS_PERSON WHERE COY = #INPUT.COY AND PERSON_ID = CIS_ACCOUNT.CUST_ID OPTIMIZE FOR 1 ROW*
Darrell Skildum / 04/10/23 / 69 Software AG
Sample 2
SELECT A.ACCOUNT_ID, A.CUST_ID, B.PERSON_ID, B.LAST_NAME, B.FIRST_NAME, B.BUSINESS_NAME INTO CIS_ACCOUNT.ACCOUNT_ID, CIS_ACCOUNT.CUST_ID ,CIS_PERSON.PERSON_ID, CIS_PERSON.LAST_NAME ,CIS_PERSON.FIRST_NAME, CIS_PERSON.BUSINESS_NAME FROM CIS_ACCOUNT A, CIS_PERSON B WHERE A.COY = #INPUT.COY AND A.ACCOUNT_ID = AD_ADJUST.ACCOUNT_ID AND B.COY = A.COY AND B.PERSON_ID = A.CUST_ID OPTIMIZE FOR 1 ROW
Darrell Skildum / 04/10/23 / 70 Software AG
Sample 2
Queryno 1 EXPLAIN Result Row 1/ 2 Estimated cost : 0.0 timerons Qblockno Mixop Access Match Index Pre- Access-Column- Planno seq type cols only fetch creator name fn_eval --- --- --- ---- ----- ----- ----- -------- ------------------- 1 1 I 2 CSDOWN21 COY_ACCOUNT_ID 1 2 I 2 CSDOWN21 PR_STD_FRMAT_NM Table Tslock -- sortn -- -- sortc -- Tabno Creator Tname mode Method uq jo or gr uq jo or gr --- -------- ------------------ ------ ------ -- -- -- -- -- -- -- -- 1 CSDOWN21 CIS_ACCOUNT_T IS N N N N N N N N 2 CSDOWN21 CIS_PERSON_T IS 1 N N N N N N N N
1 SELECT A.ACCOUNT_ID,A.CUST_ID 01 01 0880 D DB2 DRS011PX 0880 01 2 FETCH CURSOR 01 01 0880 D DB2 DRS011PX 0880 01 3 CLOSE CURSOR 01 01 0880 D DB2 DRS011PX 1230 01
Darrell Skildum / 04/10/23 / 71 Software AG
Methodology for making changes
1) Make a copy of Program2) Leave LDA in place3) If program is one easy to test, put display before
Find/READ/SELECT statement of all variables used in search. Record values
4) Change type to program if necessary make parameter data areas be local if it was a subprogram.
5) Eliminate all code except DATA AREAS and Search .6) Add assignment of variables used in search.7) Add display of selected values.8) Run program using DBLOG.9) Do and explain. 10)Make code changes and repeat steps 7 and 8
Darrell Skildum / 04/10/23 / 72 Software AG
Methodology continued Before
DEFINE DATA PARAMETER…..LOCAL….….END-DEFINE… .….….FIND
FIND…….…….END-FIND…..END-FIND………..END
Darrell Skildum / 04/10/23 / 73 Software AG
Methodology continued First Step
DEFINE DATA LOCAL…..LOCAL….….END-DEFINEASSIGN ……..FINDFINDDISPLAY …..End-FindEnd-find
Darrell Skildum / 04/10/23 / 74 Software AG
Methodology continued Second Step
DEFINE DATA LOCAL…..LOCAL….….END-DEFINEASSIGN ……..SELECTDISPLAY …..END-SELECTEND
Darrell Skildum / 04/10/23 / 75 Software AG
Sample 1 code Before
SELECT * INTO VIEW FT_FINAN_TRAN FROM FT_FINAN_TRAN WHERE COY = #CCCWOTN-IN.COY AND TRAN_ACCOUNT_ID = #CCCWOTN-IN.ACCOUNT_ID AND TRAN_SA_ID = #CCCWOTN-IN.SA_ID ORDER BY TRAN_ACCOUNT_ID, TRAN_DT, ADD_TIME
REJECT IF FT_FINAN_TRAN.TRAN_CANCELED = 'Y' REJECT IF FT_FINAN_TRAN.TRAN_MEMO_IND = 'Y' REJECT IF FT_FINAN_TRAN.TRAN_TYPE = #CFTTRTL.#MEMO REJECT IF FT_FINAN_TRAN.TRAN_TYPE = #CFTTRTL.#CASH-DIST REJECT IF FT_FINAN_TRAN.TRAN_TYPE = #CFTTRTL.#CASH-DIST-CANCEL-DETAIL REJECT IF FT_FINAN_TRAN.TRAN_TYPE = #CFTTRTL.#BILL-CANCEL-DETAIL REJECT IF FT_FINAN_TRAN.TRAN_TYPE = #CFTTRTL.#PAY-CANCEL-DETAIL REJECT IF (FT_FINAN_TRAN.TRAN_TOT_AMT = 0 AND FT_FINAN_TRAN.TRAN_WRITE_OFF = 0)
Darrell Skildum / 04/10/23 / 76 Software AG
Sample 1 code Methodology continued First Step
ASSIGN #CCCWOTN-IN.COY = xxASSIGN #CCCWOTN-IN.ACCOUNT_ID =xxxxxxx
ASSIGN #CCCWOTN-IN.SA_ID = yyyyyyyy
SELECT * INTO VIEW FT_FINAN_TRAN FROM FT_FINAN_TRAN WHERE COY = #CCCWOTN-IN.COY AND TRAN_ACCOUNT_ID = #CCCWOTN-IN.ACCOUNT_ID AND TRAN_SA_ID = #CCCWOTN-IN.SA_ID ORDER BY TRAN_ACCOUNT_ID, TRAN_DT, ADD_TIME
REJECT IF FT_FINAN_TRAN.TRAN_CANCELED = 'Y' REJECT IF FT_FINAN_TRAN.TRAN_MEMO_IND = 'Y' REJECT IF FT_FINAN_TRAN.TRAN_TYPE = #CFTTRTL.#MEMO REJECT IF FT_FINAN_TRAN.TRAN_TYPE = #CFTTRTL.#CASH-DIST REJECT IF FT_FINAN_TRAN.TRAN_TYPE = #CFTTRTL.#CASH-DIST-CANCEL-DETAIL REJECT IF FT_FINAN_TRAN.TRAN_TYPE = #CFTTRTL.#BILL-CANCEL-DETAIL REJECT IF FT_FINAN_TRAN.TRAN_TYPE = #CFTTRTL.#PAY-CANCEL-DETAIL REJECT IF (FT_FINAN_TRAN.TRAN_TOT_AMT = 0 AND FT_FINAN_TRAN.TRAN_WRITE_OFF = 0DISPLAY FT_FINAN_TRAN.TRAN_TYPE FT_FINAN_TRAN.TRAN_TOT_AMT
Darrell Skildum / 04/10/23 / 77 Software AG
Sample 1 code Methodology continued Second Step
ASSIGN #CCCWOTN-IN.COY = xxASSIGN #CCCWOTN-IN.ACCOUNT_ID =xxxxxxx
ASSIGN #CCCWOTN-IN.SA_ID = yyyyyyyySELECT * INTO VIEW FT_FINAN_TRAN FROM FT_FINAN_TRAN WHERE COY = #CCCWOTN-IN.COY AND TRAN_ACCOUNT_ID = #CCCWOTN-IN.ACCOUNT_ID AND TRAN_SA_ID = #CCCWOTN-IN.SA_ID AND FT_FINAN_TRAN.TRAN_CANCELED <> 'Y' AND TRAN_MEMO_IND <> 'Y' AND TRAN_TYPE NOT IN (#CFTTRTL.#MEMO, #CFTTRTL.#CASH-DIST,#CFTTRTL.#CASH-DIST-CANCEL-DETAIL, #CFTTRTL.#BILL-CANCEL-DETAIL, #CFTTRTL.#PAY-CANCEL-DETAIL) AND TRAN_TOT_AMT + TRAN_WRITE_OFF <> 0 ORDER BY TRAN_ACCOUNT_ID, TRAN_DT, ADD_TIME DISPLAY FT_FINAN_TRAN.TRAN_TYPE FT_FINAN_TRAN.TRAN_TOT_AMT
04/10/23
Natural for DB2 4.2 - News
Software AG
Darrell Skildum / 04/10/23 / 79 Software AG
Contents
DB2 UDB for z/OS Version 8 Support
Unicode Support
Darrell Skildum / 04/10/23 / 80 Software AG
Dynamic Scrollable Cursors I
Cursor sensitivity - the degree to which database updates are visible to the subsequentFETCH statements in a cursor. These changes can be made by this or by other application process (UOW).
ASENSITIVE SENSITIVE
DYNAMIC STATIC
SCROLLABLE NOT SCROLLABLE
INSENSITIVE
DB2 UDB for z/OS Version 8
CURSORS
Darrell Skildum / 04/10/23 / 81 Software AG
Dynamic Scrollable Cursors II
DB2
Temporary Database
FETCH INSENSITIVE
SENSITIVE STATIC INSENSITIVE
FETCH SENSITIVE
No checks against Base Table
Is checked against Base Table:
Holes (SQLCODE)
Darrell Skildum / 04/10/23 / 82 Software AG
Dynamic Scrollable Cursors III
WITH
SELECT selection …ASENSITIVE SCROLLINSENSITIVE SCROLLSENSITIVE STATIC SCROLLSENSITIVE DYNAMIC SCROLL
[:] scroll_hv [GIVING [:] sqlcode
DB2: SQLCODE=222 Update / Delete hole encountered
> > + Program DEM2SCRL Lib SYSDB2 ....+....1....+....2....+....3....+....4....+....5....+....6....+....7.. 0380 MOVE 'SENSITIVE ABSOLUTE + 1' to SCROLL_HV 0390 SELECT * 0400 INTO VIEW NAT-VIEW 0410 FROM NAT-DEMO 0420 WHERE SALARY BETWEEN :SALARY_LOW AND :SALARY_HIGH 0430 ORDER BY NAME 0440 WITH SENSITIVE STATIC SCROLL :SCROLL_HV GIVING :SQLCODE 0450 DECIDE ON FIRST VALUES OF SQLCODE 0460 VALUES 100
Darrell Skildum / 04/10/23 / 83 Software AG
Sequence Objects and Identify Columns I
CREATE SEQUENCE ORDER_SEQ START WITH 1 INCREMENT BY 1 NO MAXVALUE NO CYCLE CACHE 20; INSERT INTO ORDERS (ORDERNO, CUSTNO) VALUES (NEXT VALUE FOR ORDER_SEQ, 123456);
A sequence is a user-defined object that generates a sequence of numeric values
Darrell Skildum / 04/10/23 / 84 Software AG
Sequence Objects Identify Columns II
Natural DB2: PROCESS SQL, SELECT, INSERT etc.
0070 PROCESS SQL SYSIBM-SYSDATABASE 0080 << CREATE SEQUENCE TEST.ORDER_SEQ START WITH 1 CACHE 20 >> 0090 SELECT 0100 NEXT VALUE FOR TEST.ORDER_SEQ 0110 INTO :NEXTVAL 0120 FROM SYSIBM-SYSDATABASE 0130 DISPLAY NEXTVAL PREVVAL 0140 END-SELECT 0150 SELECT 0160 NEXT VALUE FOR TEST.ORDER_SEQ , 0170 PREVIOUS VALUE FOR TEST.ORDER_SEQ 0180 INTO :NEXTVAL, :PREVVAL 0190 FROM SYSIBM-SYSDATABASE 0200 DISPLAY NEXTVAL PREVVAL 0210 END-SELECT
Darrell Skildum / 04/10/23 / 85 Software AG
Multiple Row Processing I
Single Row Multi Row
FETCH
A rowset is a set of rows for which a cursor position is established
EXEC SQL DECLARE CURS1 CURSORWITH ROWSET POSITIONING FOR SELECT…;
FETCH ROWSET STARTING AT ABSOLUTE 10FROM CURS1 FOR 6 ROWSINTO :hva1, :hva2, :hva3;
Darrell Skildum / 04/10/23 / 86 Software AG
Multiple Row Processing II
Natural DB2: support for SELECT and INSERT
0210 MOVE 25 TO MF 0220 FIND MULTI-FETCH OF MF VDEMO 0230 WITH EMPNO = 000000 THRU 9999990240 WRITE VDEMO 0250 END-FIND
Natural DML Natural SQL
Natural DB2
Views Views and Host Variables (arrays)
Darrell Skildum / 04/10/23 / 87 Software AG
Multiple Row Processing III
0120 DEFINE DATA LOCAL 0130 01 NAME (A20/1:10) 0140 01 ADDRESS (A100/1:10) 0160 01 SALARY (P4.2/1:10) 0170 01 L§ADDRESS (I2/1:10) 0180 01 ROWS (I4) 0190 01 NUMBER (I4) 0200 01 INDEX (I4) 0210 END-DEFINE 0220 OPTIONS DB2ARRY=ON /* <-- ENABLE DB2 ARRAY 0250 SELECT NAME, ADDRESS , SALARY 0260 INTO :NAME(*), /* <-- ARRAY 0270 :ADDRESS(*) LINDICATOR :L§ADDRESS(*), /* <-- ARRAY 0290 :SALARY(01:10) /* <-- ARRAY 0300 FROM NAT-DEMO 0310 WHERE NAME > ' ' 0320 WITH ROWSET POSITIONING FOR 10 ROWS /* <-- ROWS REQ 0340 ROWS_RETURNED :ROWS /* <-- ROWS RET 0350 IF ROWS > 0 0360 FOR INDEX = 1 TO ROWS STEP 1 0370 DISPLAY 0390 NAME(INDEX) 0400 ADDRESS(INDEX) (AL=20) 0420 SALARY(INDEX) 0430 END-FOR 0440 END-IF 0450 END-SELECT
Darrell Skildum / 04/10/23 / 88 Software AG
Multiple Row Processing IV
0450 OPTIONS DB2ARRY=ON /* <-- ENABLE DB2 ARRAY 0470 INSERT INTO NAT-DEMO_ID 0480 (NAME,ADDRESS,DATEOFBIRTH,SALARY) 0490 VALUES 0500 (:NAME(*), /* <-- ARRAY 0510 :ADDRESS(*) /* <-- ARRAY 0520 INDICATOR :N§ADDRESS(*) /* <-- ARRAY 0530 LINDICATOR :L§ADDRESS(*), /* <-- ARRAY DB2 VCHAR 0550 :DATENATD(1:10), /* <-- ARRAY NATURAL DATES 0560 :SALARY(01:10) /* <-- ARRAY NATURAL PACKED 0580 ) 0590 FOR 10 ROWS 0610 * ATOMIC /* <-- DEFAULT OPTION 0620 NOT ATOMIC CONTINUE ON SQLEXCEPTION /* <-- SPECIAL OPTION
ATOMIC / NOT ATOMIC ... – specifies the DB2 reaction on an INSERT error
Darrell Skildum / 04/10/23 / 89 Software AG
GET DIAGNOSTICS
GET DIAGNOSTICS provides diagnostic information about the last executed SQL statement
long rcount;EXEC SQL UPDATE T1 SET C1 = C1 + 1;EXEC SQL GET DIAGNOSTICS :rcount = ROW_COUNT;
1120 PROCESS SQL NAT-DEMO 1130 << GET DIAGNOSTICS CONDITION :U:NUMBER 1220 ,:G:MESSAGE_ID = MESSAGE_ID 1230 ,:G:MODULE = DB2_MODULE_DETECTING_ERROR 1300 ,:G:REASON = DB2_REASON_CODE 1310 ,:G:SQLCODE = DB2_RETURNED_SQLCODE 1320 ,:G:ROW_NUMBER = DB2_ROW_NUMBER 1330 ,:G:TOKEN_COUNT = DB2_TOKEN_COUNT 1340 ,:G:MESSAGE_TEXT = MESSAGE_TEXT 1350 ,:G:SQLSTATE = RETURNED_SQLSTATE 1360 ,:G:SERVER = SERVER_NAME 1370 >>
Darrell Skildum / 04/10/23 / 90 Software AG
XML Publishing Built-In Functions I
XML Built-In Functions - a set of SQL built-in functions that allow applications to generate XML data from relational data.
DB2 XML Functions
XMLELEMENT Generates an XML element from arguments
XMLATTRIBUTES Constructs XML attributes from arguments
XMLFOREST Produces a forest of XML elements from a list of columns and expressions
XML2CLOB Converts the transient XML data type into a CLOB so that the application can access the XML data
…
Darrell Skildum / 04/10/23 / 91 Software AG
XML Publishing Built-In Functions II
Example: Generate an "Emp" element for each employee. Use employee name as its attribute and two subelements generated from columns HIRE and DEPT by using XMLFOREST as its content. The element names for the two subelements are "HIRE" and "department".
SELECT E.EMPNO, XML2CLOB ( XMLELEMENT ( NAME "Emp", XMLATTRIBUTES ( E.FIRSTNME !! ' ' !! E.LASTNAME AS "name" ), XMLFOREST ( E.HIRE, E.WORKDEPT AS "department" ) ) ) FROM DSN8810.EMP E;
ID result---------------------------------------------1001 <Emp name="John Smith"> <HIRE>2000-05-24</HIRE> <department>Accounting</department> </Emp>1001 <Emp name="Mary Martin"> <HIRE>1996-02-01</HIRE> <department>Shipping</department> </Emp>
Darrell Skildum / 04/10/23 / 92 Software AG
XML Publishing Built-In Functions III
0040 DEFINE DATA LOCAL 0050 01 #EMPNO (A6) 0060 01 #XML_LINE (A) DYNAMIC 0070 END-DEFINE 0080 SELECT E.EMPNO, XML2CLOB ( XMLELEMENT 0090 ( NAME "EMP", 0100 XMLATTRIBUTES ( E.FIRSTNME !! ' ' !! E.LASTNAME 0110 AS "NAME" ), 0120 XMLFOREST ( E.HIREDATE, 0130 E.WORKDEPT AS "DEPARTMENT" ) 0140 ) ) AS RESULT 0150 INTO #EMPNO, #XML_LINE 0160 FROM DSN8810-EMP E; 0170 PRINT #EMPNO #XML_LINE ;
Darrell Skildum / 04/10/23 / 93 Software AG
Unicode Support I
DB2 does not have data type ‘UNICODE’
DB2 Unicode
GRAPHIC Data type
UNICODE, 1200 CCSID
Darrell Skildum / 04/10/23 / 94 Software AG
Unicode Support II
0090 DEFINE DATA LOCAL 0100 01 EMP VIEW OF DSN8810-EMP 0110 02 EMPNO 0130 02 LASTNAME 0140 02 SALARY 0170 * 0180 01 UC 0190 02 EMPNO (U6) 0200 02 FIRSTNME (U12) 0210 02 LASTNAME (U15) 0220 02 SALARY (P7.2) 0250 END-DEFINE 0290 * ALPHA 0350 SELECT * INTO VIEW EMP 0360 FROM DSN8810-EMP 0370 ORDER BY SALARY + COMM 0380 FETCH FIRST 50 ROW ONLY 0400 DISPLAY EMP *COUNTER 0410 END-SELECT 0290 * UNICODE 0480 SELECT EMPNO,FIRSTNME,SALARY,0490 INTO UC.EMPNO,UC.FIRSTNME,UC.SALARY0500 FROM DSN8810-EMP 0510 ORDER BY SALARY + COMM 0520 FETCH FIRST 50 ROW ONLY 0540 DISPLAY UC *COUNTER 0550 END-SELECT
Natural DB2 uses the DB2 Code Page Translation (UTF16, Code Page 1200)
Darrell Skildum / 04/10/23 / 95 Software AG
SELECT Statement I
DB2: I(insert)-table-reference
INSERT SELECT
CREATE TABLE EMPLOYEE (EMPNO INTEGER GENERATED ALWAYS AS IDENTITY, ID SMALLINT, NAME CHAR(30), SALARY DECIMAL(5,2), DEPTNO SMALLINT) IN DSN8D81A.DSN8S81D;
SELECT EMPNOFROM FINAL TABLE (INSERT INTO DSN8810.EMP
(NAME,SALARY,DEPTNO)VALUES(‘SMITH’,99000,123)
);
Darrell Skildum / 04/10/23 / 96 Software AG
SELECT Statement II
0160 SELECT * INTO VIEW V1 0170 FROM FINAL TABLE (INSERT INTO NAT-DEMO_ID 0180 (NAME, ADDRESS,DATEOFBIRTH,SALARY)0190 VALUES ('KLUGE','ANGLE STREET 1', 0200 '1980-05-05', 5720.05) 0210 ) 0220 DISPLAY (AL=15) V1 0230 END-SELECT
Darrell Skildum / 04/10/23 / 97 Software AG
Materialized Query Tables
A materialized query table (MQT) is a table whose definition is based on the result of a query.
CREATE TABLE STRANS AS(SELECT YEAR AS SYEAR, MONTH AS SMONTH, DAY AS SDAY, SUM(AMOUNT) AS SSUMFROM TRANSGROUP BY YEAR, MONTH, DAY)DATA INITIALLY DEFERRED REFRESH DEFERRED;
MQT
Population
User-Maintained System-Maintained
INSERT, UPDATE, DELETE
REFRESH TABLE
LOAD
REFRESH TABLE
0940 PROCESS SQL SYSIBM-SYSDATABASE 0950 << REFRESH TABLE ‘EMPLOYEE’; >>
Darrell Skildum / 04/10/23 / 98 Software AG
Current Package Path Register I
In releases of DB2 before Version 8, the only way to switch between packages was to execute the SET CURRENT PACKAGESET statement every time you needed to use a different package. With SET CURRENT PACKAGE PATH, you can execute the statement only once, to give the server a list of package collections to search.
PACKAGE NAMElocation.collection.DBRM
SET CURRENT PACKAGESET
Search for Collection
SET CURRENT PACKAGE PATH
before DB2 Version 8 DB2 Version 8
Darrell Skildum / 04/10/23 / 99 Software AG
Current Package Path Register II
0940 PROCESS SQL SYSIBM-SYSDUMMY1 0950 << SET CURRENT PACKAGE PATH = SYSIBM, ‘ADMIN’, ‘USER’ >>
14:54:32 ***** NATURAL TOOLS FOR DB2 ***** 2006-02-10 - Environment Setting - Code Function Code Function SET CURRENT CO CONNECT SS SQLID RE RELEASE (connection) SP PACKAGESET SC SET CONNECTION SD DEGREE SY SET ENCRYPTION PASSWORD SU RULES SR Display SPECIAL REGISTER SO OPTIMIZATION HINT ? Help SL LOCALE LC_CTYPE . Exit SA PATH SE PRECISION SM MAINTAINED TABLE TYPES FOR OPT SB PACKAGE PATH Code .. __ SF REFRESH AGE SH SCHEMA SN APPLICATION ENCODING SCHEME
Natural DB2: PROCESS SQL, SYSDB2
Darrell Skildum / 04/10/23 / 100 Software AG
Common Table Expressions I
A common table expression permits defining a result table with a table name that can be referenced as a table name in any FROM clause of the fullselect that follows.
Table
Expressions
Nested SELECT … FROM (SELECT EDLEVEL, YEAR(HIREDATE) AS HIREYEAR, SALARY+BONUS+COMM AS TOTAL_PAY FROM EMPLOYEE WHERE EDLEVEL > 16)
WITH PAYLEVEL AS (SELECT EMPNO, EDLEVEL, YEAR(HIREDATE) AS HIREYEAR, SALARY+BONUS+COMM AS TOTAL_PAY FROM EMPLOYEE WHERE EDLEVEL > 16) SELECT … FROM PAYLEVEL
Common Table
Darrell Skildum / 04/10/23 / 101 Software AG
Common Table Expressions II
0270 WITH_CTE 0280 RPL (PART,SUBPART,QUANTITY) AS 0290 (SELECT ROOT.PART,ROOT.SUBPART,ROOT.QUANTITY 0300 FROM HGK-PARTLIST ROOT (PART,SUBPART,QUANTITY) 0310 WHERE ROOT.PART ='01' 0320 UNION ALL 0330 SELECT CHILD.PART,CHILD.SUBPART,CHILD.QUANTITY 0340 FROM RPL PARENT, HGK-PARTLIST CHILD 0350 WHERE PARENT.SUBPART =CHILD.PART 0360 ) 0370 SELECT DISTINCT PART,SUBPART,QUANTITY 0380 INTO VIEW V1 0390 FROM RPL 0400 ORDER BY PART,SUBPART,QUANTITY 0410 PERFORM CHECK-SQLCA 0420 DISPLAY *COUNTER V1 0430 END-SELECT
Natural DB2: WITH_CTE and subsequent SELECT
Darrell Skildum / 04/10/23 / 102 Software AG