IBM DB2 V8

Transcrição

IBM DB2 V8
(*)
IBM DB2 V8
for z/OS
Neue Funktionen und „features“
für die AE(sql)
(DB2V8_AE_sqlneu)
(*) ist eingetragenes Warenzeichen der IBM International Business Machines Inc.
Jan 2005
1
DB2
DB2 V8
V8 SQL
SQL Neuerungen
Neuerungen
•
•
Neue Limits für SQL
Neue Funktionen im SQL
• „scalar full select“
•
•
•
•
•
•
•
•
•
•
•
Neue AP Funktionen
• „dynamic scrollable Cursors“
•
•
•
•
•
Jan 2005
„multiple DISTINCT‘s“
„multi row“ INSERT
„multi row“ Fetch
GET DIAGNOSTICS
INSERT innerhalb eines SELECT
Rekursicursives SQL
Expressions im GROUP BY
„common table expressions
Verbesserungen bei den diversen Objekten („identity columns“, „sequence object“)
Weitere Verbesserungen
SQL/PL Funktionen
STP/UDF Verbesserungen
Neue Spezialregister
Session variable + GETVARIABLE
Neue XML Funktionen
2
1.
1. Neue
Neue Limits
Limits im
im DB2
DB2 // SQL
SQL
Objekt
DB2 V7
DB2 V8
Länge des „Table name“ (*)
18
128
Länge des „Column name“
18
30
Max. Größe des „Index key“ (Bytes)
255
2000
Max. Hex / Character Literale
255
32.704
Max. Länge von Prädikaten
255
32.704
Max. SQL Statement Länge
32 KB
2 MB
Tables in einer Tabelle / Join
225 / 15
225 / 225
Max. Anzahl offene Datasets
32.767
100.000
Max. Anzahl Partitions beim PTS
254
4.096
(*) gilt auch für die meisten anderen DB2 Objekte, wie views, aliases, index, triggers, synonyms,...
Jan 2005
3
1.
1. Neue
Neue Limits
Limits im
im DB2
DB2 // SQL
SQL
Objekt
DB2 V7
DB2 V8
Max. Table /TS Grösse
16 TB
128 TB
Max. Anzahl Databases
65.279
-
Max. Anzahl Objekte pro Database
65.535
-
Anz. „concurrent threads“
(150.000) 2.00
5.000
Max. Zeilenlänge einer Tabelle
32 K
-
Max. Anzahl Spalten im View/Tabelle
750
-
Max. Anzahl Spalten in einem IX
64
-
Anzahl max. Dezimalstellen
31
-
Max. Grösse einer VARCHAR-Spalte
32.704
-
Jan 2005
4
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.1 „scalar full select“
2.2 „multiple DISTINCT‘s“
2.3 „multi row“ Operationen
2.3.1 „multi row“ INSERT
2.3.2 „multi row“ FETCH
2.4 GET DIAGNOSTICS
2.5 INSERT innerhalb eines SELECT
2.6 Rekursives SQL
2.7 Expressions im GROUP BY
2.8 „common table“ /“nested table“ Ausdrücke
2.9 Verbesserungen bei div Objekten („identity columns“, „sequences“)
2.10 Sonstige
Jan 2005
5
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.1 „scalar full select“
•
•
•
Ein „scalar fullselect“ ist ein „fullselect“, eingeschlossen in
Klammern, der einen einzelnen Wert zurückliefert ( sonst
SQLCODE -811)
Ermöglicht „scalar fullselect“ für Ausdrücke, die auch vor der
Version8 bereits verfügbar waren
Beispiel:
SELECT PRODUCT, PRICE FROM PRODUCTS
WHERE PRICE <= 0.7 * (SELECT AVG(PRICE)
FROM PRODUCTS);
Vorteile:
•
Verbessert Nutzbarkeit und Mächtigkeit von SQL
•
Erleichtert die Portierbarkeit
•
Passt zu den SQL Standards
Jan 2005
6
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.1 „scalar full select“– DB-Modell
Jan 2005
7
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.1 „scalar full select“– Beispiele(in der WHERE-Klausel )
Welche
Welche Produkte
Produkte kosten
kosten mehr
mehr als
als das
das doppelte
doppelte der
der preiswertesten
preiswertesten Produkte?
Produkte?
SELECT
SELECT
FROM
FROM
WHERE
WHERE
Jan 2005
PRODUCT,
PRODUCT, PRICE
PRICE
PRODUCTS
PRODUCTS A
A
PRICE
>=
2
*
PRICE >= 2 * (SELECT
(SELECT
FROM
FROM
MIN(PRICE)
MIN(PRICE)
PRODUCTS);
PRODUCTS);
8
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.1 „nested scalar full select“– Beispiele(in der SELECT Liste)
Suche
Suche die
die die
die Kosten
Kosten für
für die
die Bestandsführung
Bestandsführung der
der einzelnen
einzelnen Produkte
Produkte und
und kalkuliere
kalkuliere
die
Summen
von
(price
*
onhand#)
für
jedes
Teil
im
Produkt.
die Summen von (price * onhand#) für jedes Teil im Produkt.
SELECT
SELECT
PRODUCT,
PRODUCT,
(SELECT
(SELECT COALESCE(SUM(X.COST),0)
COALESCE(SUM(X.COST),0) AS
AS INV_COST
INV_COST
FROM
FROM (SELECT
(SELECT ((
(SELECT
(SELECT PRICE
PRICE FROM
FROM PARTPRICE
PARTPRICE PP
WHERE
WHERE P.PART
P.PART == B.PART)
B.PART)
** (SELECT
ONHAND#
(SELECT ONHAND# FROM
FROM INVENTORY
INVENTORY II
WHERE
WHERE I.PART
I.PART =B.PART)
=B.PART)
)) AS
AS COST
COST
FROM
PARTS
FROM
PARTS B
B
WHERE
B.PROD#
WHERE
B.PROD# == A.PROD#
A.PROD#
)) X(COST)
X(COST)
))
FROM
FROM PRODUCTS
PRODUCTS A;
A;
Jan 2005
9
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.1 „scalar full select“– Beispiele(in CASE Ausdrücken)
Gib
Gib Preisnachlässe
Preisnachlässe für
für alle
alle Teile,
Teile, die
die einen
einen hohen
hohen Bestand
Bestand aufweisen
aufweisen und
und hebe
hebe die
die
Preise
Preise für
für alle
alle Teile
Teile mit
mit niedrigem
niedrigem Bestand
Bestand an...
an...
CREATE
NEW_PARTPRICE
CREATE TABLE
TABLE
NEW_PARTPRICE LIKE
LIKE PARTPRICE;
PARTPRICE;
INSERT
NEW_PARTPRICE
INSERT INTO
INTO
NEW_PARTPRICE SELECT
SELECT ** FROM
FROM PARTPRICE;
PARTPRICE;
UPDATE
NEW_PARTPRICE
N
UPDATE
NEW_PARTPRICE N
SET
PRICE
=
CASE
SET PRICE = CASE
WHEN(
WHEN( (SELECT
(SELECT ONHAND#
ONHAND#
FROM
FROM INVENTORY
INVENTORY WHERE
WHERE PART=N.PART)
PART=N.PART) << 7)
7)
THEN
THEN 1.1
1.1 ** PRICE
PRICE
WHEN(
WHEN( (SELECT
(SELECT ONHAND#
ONHAND#
FROM
INVENTORY
FROM INVENTORY WHERE
WHERE PART=N.PART)
PART=N.PART) >> 20)
20)
THEN
THEN 0.8
0.8 ** PRICE
PRICE
ELSE
PRICE
ELSE
PRICE
END;
END;
SELECT
NEW_PARTPRICE;
SELECT ** FROM
FROM
NEW_PARTPRICE;
Jan 2005
10
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.1 „scalar full select“– Restriktionen
„scalar full select“ ist nicht zulässig in
•
Einem „CHECK constraint“
•
einem „grouping“ Ausdruck
•
einem view mit WITH CHECK OPTION
•
einem CREATE FUNCTION (SQL „scalar“)
•
einer „column function“
•
Einer ORDER BY Klausel
•
Einer Join-Bedingung in der ON Klausel für INNER und OUTER
JOINS
Jan 2005
11
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.2 „multiple DISTINCT‘s“
•
•
Ermöglicht mehr als eine DISTINCT-Angabe in einer SELECT- oder
HAVING Klausel
Beispiel:
in DB2 V7 nur auf derselben Spalte:
SELECT COUNT(DISTINCT(A1)), SUM(DISTINCT A1) FROM T1
in DB2 V8 auch auf unterschiedlichen Spalten:
SELECT COUNT(DISTINCT A1), SUM(DISTINCT A2) FROM T1
Vorteile:
•
Verbessert Nutzbarkeit und Mächtigkeit von SQL
•
Kompatibilität innerhalb der DB2-Produktfamilie
•
Früher: SQLCODE -127
Jan 2005
12
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.2 „multiple DISTINCT‘s“ (Beispiele)
VOR Version 8 .....
SELECT
SELECT
SELECT
SELECT
DISTINCT C1, C2 FROM T1;
COUNT(DISTINCT C1) FROM T1;
C1, COUNT(DISTINCT C2) FROM T1 GROUP BY C1;
COUNT(DISTINCT(C1)),SUM(DISTINCT C1)FROM T1;
-- same col
Mit Version 8 .....
SELECT
SELECT
FROM
SELECT
FROM
DISTINCT COUNT(DISTINCT C1), SUM(DISTINCT C2) FROM T1;
COUNT(DISTINCT C1), AVG(DISTINCT C2)
T1 GROUP BY C1;
SUM(DISTINCT C1), COUNT(DISTINCT C1), AVG(DISTINCT C2)
T1 GROUP BY C1 HAVING SUM(DISTINCT C1) = 1;
Nicht unterstützt in Version 8 .....
SELECT
FROM
SELECT
FROM
Jan 2005
COUNT(DISTINCT A1,A2)
T1 GROUP BY A2;
COUNT(DISTINCT(A1,A2))
T1 GROUP BY A2;
13
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.3 „multi row FETCH“ und „multi row INSERT“
•
„multi row FETCH“:
- Ein einzelnes FETCH Statement kann gleichzeitig mehr als eine
„row“ aus der „result table“ als „rowset“ zurückgeben
- Ein „rowset“ ist eine Gruppe von Datensätzen, die als eine
Einheit behandelt werden können
- Unterstützt „dynamic“ und „static SQL“ (Fetch ist IMMER „static“)
•
Multi-row INSERT:
- Ein einzelnes SQL Statement kann eine oder mehrere „rows“ in
eine Tabelle / View einfügen
- „Multi-row INSERT“ kann sowohl im „static“ als auch im
„dynamic SQL“ verwendet werden
Vorteile:
•
Verbessert Nutzbarkeit und Mächtigkeit von SQL
•
Die Performance wird erhöht über die Einsparung von sogen. „multiple
trips“ zwischen Applikation und der „database engine“; beim „distributed
access“ wird der „network traffic“ reduziert
Jan 2005
14
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.3.1 „multi row INSERT“
Neue 3. Form eines INSERT
•
INSERT mit FOR "n" ROWS wird verwendet, um mehr als eine „row“ in eine
Tabelle / View einzufügen. Die werte werden dabei in einem
„Hostvariablen Array“ zur Verfügung gestellt.
FOR "n" ROWS
•
Bei „static SQL“ kann man FOR "n" ROWS im INSERT Statement angeben;
im „dynamic SQL“ muss FOR "n" ROWS im EXECUTE Statement
angegeben werden
•
Jeder „array“ repräsentiert Zellen für „multiple rows“ einer einzelnen Spalte
VALUES Klausel erlaubt die Specifikation von „multiple rows“
•
„Host variable arrays“ werden verwendet, um die Werte für einen Insert
anzugeben
Beispiel:
VALUES (:hva1, :hva2)
Jan 2005
15
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.3.1 „multi row INSERT“ vs „single row INSERT“
„Single row“
„multi row“
Multi-row INSERT Statement - Spezialfall
INSERT INTO TAB1 VALUES ( 'my string' , :hva , CURRENT DATE) FOR 4 ROWS
Programm enthält
DB2 INSERT
Jan 2005
16
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.3.1 „multi row INSERT“ (Typen)
ATOMIC (default)
• Wenn der INSERT für irgendeine „row“ schiefgeht, werden alle Änderungen, die
auf der DB durch den INSERT erfolgt sind, zurückgesetzt...
NOT ATOMIC CONTINUE ON SQLEXCEPTION
• Inserts werden unabhängig voneinander verarbeitet
• Treten Fehler während des INSERT auf, so wird die Verarbeitung fortgesetzt
processing continues
• Diagnostiken sind für jede fehlerhafte „row“ verfügbar über GET DIAGNOSTICS
• SQLCODE zeigt an ob:
- Alles schiefgegangen ist:
- Alles OK ist ausser „warnings“:
- nur ein Fehler aufgetreten ist:
Jan 2005
SQLSTATE 22530, SQLCODE -254
SQLSTATE 01659, SQLCODE +252
SQLSTATE 22529, SQLCODE -253
17
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.3.1„multi row INSERT“ (Beispiele)
Man
Man soll
soll eine
eine variable
variable Anzahl
Anzahl von
von Sätzen
Sätzen einfügen
einfügen und
und für
für die
die Wertebereitstellung
Wertebereitstellung HV
HV
arrays
arrays verwenden.
verwenden. T1
T1 soll
soll dabei
dabei 11 Spalte
Spalte besitzen
besitzen und
und eine
eine variable
variable Zahl
Zahl von
von
Datensätzen
Datensätzen aufnehmen.
aufnehmen.
EXEC
EXEC SQL
SQL INSERT
INSERT INTO
INTO T1
T1 FOR
FOR :hv
:hv ROWS
ROWS
VALUES
VALUES (:hva:hvaind)
(:hva:hvaind) ATOMIC;
ATOMIC;
In diesem Beispiel repräsentiert die Hostvariable :hva das (Daten-)„array“ und :hvaind das
„array“ für die „indicator variables“. :hv ist der variable „row“-Zähler.
Jan 2005
18
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.3.1 „multi row INSERT“ (Beispiele)
Man
Man soll
soll mehrere
mehrere Sätze
Sätze einfügen
einfügen und
und für
für die
die Wertebereitstellung
Wertebereitstellung HV
HV arrays
arrays verwenden.
verwenden.
T2
T2 soll
soll dabei
dabei 22 Spalten
Spalten besitzen
besitzen (C1
(C1 und
und C2).
C2). 10
10 Sätze
Sätze sollen
sollen eingefügt
eingefügt werden.
werden.
EXEC
EXEC SQL
SQL INSERT
INSERT INTO
INTO T2
T2 (C1,
(C1, C2)
C2) FOR
FOR 10
10 ROWS
ROWS
VALUES
VALUES (:hva1:hvaind1,
(:hva1:hvaind1, :hva2:hvaind2)
:hva2:hvaind2)
NOT
NOT ATOMIC
ATOMIC CONTINUE
CONTINUE ON
ON SQLEXCEPTION;
SQLEXCEPTION;
In diesem Beispiel repräsentieren die Hostvariable :hva1 und :hva2 die (Daten-)„arrays“.
:hvaind1 und :hvind2 sind die „arrays“ für die „indicator variables“.
Jan 2005
19
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.3.1 „multi row INSERT“ („dynamic SQL“- Beispiele)
Angenommen
Angenommen die
die Tabelle
Tabelle PROG
PROG besitzt
besitzt 99 Spalten.
Spalten. Es
Es soll
soll ein
ein dynamisches
dynamisches SQLSQLStatement
Statement geschreiben
geschreiben werden,
werden, das
das 55 „rows“
„rows“ in
in PROG
PROG einfügt.
einfügt.
stmt
stmt == 'INSERT
'INSERT INTO
INTO PROG
PROG (C1,
(C1, C2,
C2, C3,
C3, C4,
C4, C5,
C5, C6,
C6, C7,
C7, C8,
C8, C9)
C9)
VALUES
(?,
?,
?,
?,
?,
?,
?,
?,
?)';
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)';
attrvar
attrvar == 'FOR
'FOR MULTIPLE
MULTIPLE ROWS
ROWS ATOMIC'
ATOMIC'
nrows
nrows == 55
EXEC
EXEC SQL
SQL PREPARE
PREPARE ins_stmt
ins_stmt ATTRIBUTES
ATTRIBUTES :attrvar
:attrvar FROM
FROM :stmt;
:stmt;
EXEC
EXEC SQL
SQL EXECUTE
EXECUTE ins_stmt
ins_stmt FOR
FOR :nrows
:nrows ROWS
ROWS
USING
:V1,
:V2,
:V3,
:V4,
:V5,
:V6,
USING :V1, :V2, :V3, :V4, :V5, :V6, :V7,
:V7, :V8,
:V8, :V9
:V9
In diesem Beispiel repräsentieret jede Hostvariable in der USING Klausel einen „array“
von Werten für die korrespondierende Spalte des INSERT Statements.
Jan 2005
20
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.3.1 „multi row INSERT“ (Überlegungen zu DRDA)
Kann auf jedem „Requester“ oder „Server“, der DRDA Version 3 unterstützt
implementiert werden.
Zwischen DB2 for z/OS Systemen
•
Kein Einfluß des Multi row INSERT auf das „blocking“
•
Ein einzelnes „rowset“ wird mit EINEM INSERT-Statement verarbeitet
•
Ein einzelner „multi row fetch“ oder INSERT kann im Netz maximal
10 MB umfassen.
•
Für „remote clients“ denen EIN „rowset“ in EINEM „network request“
zurückgegeben wird, wird beim „multi row fetch“ die Block-Grösse von 32K
ignoriert
Zwischen DB2 auf anderen Pattformen und DB2 for z/OS
•
•
Jan 2005
Keine Unterstützung von „multi row“ Operationen im „embedded SQL“
In ODBC/CLI Umgebungen:
- eingeschränkte Unterstützung des „multi row“ FETCH
- Unterstützung des „multi row“ INSERT
21
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.3.2 „multi row FETCH“
Geändert wurden:
• DECLARE CURSOR Statement
• Die Verwendung von „Host variable arrays“
• FETCH Statement
• Das „Positioned UPDATE“ Statement
• Das „Positioned DELETE“ Statement
z.z.B.
B.C1
C1als
alsCursor
Cursoreiner
einerQuery
Queryzum
zumLesen
Leseneines
eines„rowset“
„rowset“von
vonder
derTabelle
TabelleEMP
EMP
EXEC
EXECSQL
SQL
DECLARE
DECLAREC1
C1CURSOR
CURSOR
WITH
WITHROWSET
ROWSETPOSITIONING
POSITIONING
FOR
SELECT
*
FROM
FOR SELECT * FROMEMP;
EMP;
WITH
WITHROWSET
ROWSETPOSITIONING
POSITIONINGzeigt
zeigtan,
an,ob
ob„multiple
„multiplerows“
rows“als
als„rowset“
„rowset“
über
einen
einzelnen
FETCH
gelesen
werden
können
über einen einzelnen FETCH gelesen werden können
Jan 2005
22
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.3.2 „multi row FETCH“
Beispiel-1:
Fetch
Fetch des
des vorhergehenden
vorhergehenden „rowset“
„rowset“ und
und positioniere
positioniere den
den Cursor
Cursor auf
auf dieses
dieses „rowset“
„rowset“
EXEC
EXECSQL
SQL
FETCH
FETCHPRIOR
PRIORROWSET
ROWSETFROM
FROMC1
C1FOR
FOR33ROWS
ROWSINTO...
INTO...
----Oder
Oder---EXEC
EXECSQL
SQL
FETCH
FETCHROWSET
ROWSET
STARTING
STARTINGAT
ATRELATIVE
RELATIVE-3
-3FROM
FROMC1
C1FOR
FOR33ROWS
ROWSINTO...
INTO...
Beispiel-2:
Hole
Hole 33 „rows“
„rows“ beginnend
beginnend bei
bei „row“
„row“ Nummer
Nummer 20
20 unabhängig
unabhängig von
von der
der aktuellen
aktuellen
Cursorposition
Cursorposition
EXEC
EXECSQL
SQL
FETCH
FETCH
Jan 2005
ROWSET
ROWSETSTARTING
STARTINGAT
ATABSOLUTE
ABSOLUTE20
20
FROM
C1
FOR
3
ROWS
INTO...
FROM C1 FOR 3 ROWS INTO...
23
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.3.2 „multi row FETCH“ („array“-Definitionen)
Beispiel COBOL (C1 mit „fetch“ auf 10 „rows“ über „multi-row FETCH“ Stmnt)
01
01OUTPUT-VARS.
OUTPUT-VARS.
05
05NAME
NAMEOCCURS
OCCURS10
10TIMES.
TIMES.
49
NAME-LEN
PIC
S9(4)
49 NAME-LEN PIC S9(4)USAGE
USAGECOMP.
COMP.
49
49NAME-TEXT
NAME-TEXTPIC
PICX(40).
X(40).
05
05SERIAL-NUMBER
SERIAL-NUMBERPIC
PICS9(9)
S9(9)USAGE
USAGECOMP
COMPOCCURS
OCCURS10
10TIMES.
TIMES.
01
IND-VARS.
01 IND-VARS.
10
10INDSTRUC1
INDSTRUC1PIC
PICS9(4)
S9(4)USAGE
USAGECOMP
COMPOCCURS
OCCURS10
10TIMES.
TIMES.
10
INDSTRUC2
PIC
S9(4)
USAGE
COMP
OCCURS
10
TIMES.
10 INDSTRUC2 PIC S9(4) USAGE COMP OCCURS 10 TIMES.
PROCEDURE
PROCEDUREDIVISION.
DIVISION.
EXEC
SQL
EXEC SQL
DECLARE
DECLAREC1
C1SCROLL
SCROLLCURSOR
CURSORWITH
WITHROWSET
ROWSETPOSITIONING
POSITIONINGFOR
FOR
SELECT
NAME,
SERIAL#
FROM
EMPLOYEE
SELECT NAME, SERIAL# FROM EMPLOYEE
END-EXEC.
END-EXEC.
EXEC
EXECSQL
SQLOPEN
OPENC1
C1END-EXEC.
END-EXEC.
EXEC
EXECSQL
SQL
FETCH
FETCHFIRST
FIRSTROWSET
ROWSETFROM
FROMC1
C1FOR
FOR10
10ROWS
ROWS
INTO
:NAME:INDSTRUC1,:SERIAL-NUMBER:INDSTRUC2
INTO :NAME:INDSTRUC1,:SERIAL-NUMBER:INDSTRUC2
END-EXEC.
END-EXEC.
Jan 2005
24
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.3.2 „multi row FETCH“ („array“-Definitionen)
Beispiel PL/1 (Rückgabe von 10 „rows“ aus der DEPARTMENT Tabelle)
DCL
CHAR(3),
DCL DEPTNO(10)
DEPTNO(10)
CHAR(3),
DEPTNAME(10)
CHAR(29)
DEPTNAME(10)
CHAR(29)VAR,
VAR,
MGRNO(10)
CHAR(6),
MGRNO(10)
CHAR(6),
ADMRDEPT(10)
CHAR(3);
ADMRDEPT(10)
CHAR(3);
DCL
IND_ARRAY1(10)
BIN
DCL IND_ARRAY1(10)
BINFIXED(15);
FIXED(15);
DCL
IND_ARRAY2(10)
BIN
DCL IND_ARRAY2(10)
BINFIXED(15);
FIXED(15);
DCL
IND_ARRAY3(10)
BIN
FIXED(15);
DCL IND_ARRAY3(10)
BIN FIXED(15);
DCL
BIN
DCL IND_ARRAY4(10)
IND_ARRAY4(10)
BINFIXED(15);
FIXED(15);
EXEC
EXECSQL
SQL
DECLARE
DECLAREC1
C1SCROLL
SCROLLCURSOR
CURSOR
WITH
WITHROWSET
ROWSETPOSITIONING
POSITIONINGFOR
FOR
SELECT
*
FROM
DEPARTMENT;
SELECT *
FROM DEPARTMENT;
EXEC
OPEN
EXECSQL
SQL
OPENC1;
C1;
EXEC
EXECSQL
SQL
FETCH
FETCHFIRST
FIRSTROWSET
ROWSETFROM
FROMC1
C1FOR
FOR10
10ROWS
ROWS
INTO
:DEPTNO:IND_ARRAY1,
INTO
:DEPTNO:IND_ARRAY1,
:DEPTNAME
:DEPTNAME:IND_ARRAY2,
:IND_ARRAY2,
:MGRNO:IND_ARRAY3,
:MGRNO:IND_ARRAY3,
:ADMRDEPT:IND_ARRAY4;
:ADMRDEPT:IND_ARRAY4;
Jan 2005
25
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.3.2 „multi row FETCH“ („array“-Definitionen)
Beispiel C/C++ (Declare integer und varying character array f. „multi-row fetch“)
long
longserial_num
serial_num[10];
[10];
struct
struct{{
short
shortlen;
len;
char
chardata
data[18];
[18];
}}name
[10];
name [10];
...
...
EXEC
EXECSQL
SQL
DECLARE
DECLAREC1
C1CURSOR
CURSORFOR
FORSELECT
SELECTNAME,
NAME,SERIAL_NO
SERIAL_NO
FROM
FROMEMPLOYEE
EMPLOYEE
WITH
WITHROWSET
ROWSETPOSITIONING;
POSITIONING;
...
...
EXEC
EXECSQL
SQL
OPEN
OPENC1;
C1;
...
...
EXEC
EXECSQL
SQL
FETCH
FETCHFIRST
FIRSTROWSET
ROWSETFROM
FROMC1
C1
;;
FOR
FOR10
10ROWS
ROWSINTO
INTO:NAME,
:NAME,:SERIAL_NUM
:SERIAL_NUM
Jan 2005
26
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.3.2 „multi row FETCH“ („rowsets“)
„rowset“
•
Ein Gruppe von Zeilen aus einer RT, die mit einem einzelnen FETCH
Zurückgeliefert(der „eingefügt“) werden
•
•
Das Programm kontrolliert, wieviele „rows“ in einem „rowset“ geliefert werden
(es kontrolliert die Grösse des „rowset“)
- Kann im FETCH ... FOR n ROWS Statement angegeben werden (n <= 32767)
•
Jede Gruppe von „rows“ wird als „rowset“ behandelt
•
„single row“ und „multiple row fetches“ können beim „multi-fetch cursor“ gemischt
werden
FETCH
Jan 2005
FIRST ROWSET STARTING AT ABSOLUTE 10
FROM CURS1
FOR 6 ROWS INTO :hva1, :hva2;
27
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.3.2 „multi row FETCH“ („rowset“ Positionierung)
„Result table“
FETCH FIRST ROWSET
FOR 3 ROWS
FETCH NEXT ROWSET
FETCH ROWSET STARTING
AT ABSOLUTE 8
FOR 2 ROWS
Anmerkung: Der Cursor wird auf ALL
„rows“ im aktuellen „rowset“ positioniert
Jan 2005
28
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.3.2 „multi row FETCH“ (Mischen von „row“ / „rowset“ Positionierung)
„Result table“
FETCH FIRST ROWSET
FOR 3 ROWS
FETCH NEXT ROWSET
FETCH NEXT
Anmerkung: FETCH NEXT ist relativ zur
ersten „row“ im „current rowset“
Jan 2005
29
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.3.2 „multi row FETCH“ („partial rowsets“)
Anmerkung: Der 2. „rowset
fetch“ liefert einen SQLCODE
+100
SQLERRD(3) enthält die Anzahl
der zurückgegebenen „rows“
(2 in diesem Fall)
FETCH ROWSET STARTING
AT ABSOLUTE 11 FOR
FOR 3 ROWS
FETCH NEXT ROWSET
FOR 3 ROWS
Jan 2005
„Result table“
CUST_NAME
Ian
Mark
John
Karen
Sarah
Florence
Dylan
Bert
Jo
Karen
Gary
Bill
Geoff
Julia
Sally
FETCH ROWSET
STARTING AT
ABSOLUTE 5
FOR 3 ROWS
FETCH PREVIOUS
ROWSET
FOR 10 ROWS
Anmerkung: Der 2.
„rowset Fetch“ liefert
einen SQLCODE +20237
SQLERRD(3) enthält 4
30
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.3.2 „multi row FETCH“ („isolation“)
•
Cursor wird auf „all rows“ im aktuellen „rowset“ positioniert
•
Locks werden auf „all rows“ im „rowset“ gehalten, abhängend vom
„isolation level“ und davon, ob eine „result table“ materialisiert hat
•
Dies beeinflußt den Vorgang eines „refetch“ derselben „rows“ bei
der Verwendung eines FETCH CURRENT auf das „current rowset“
2.3.2 „multi row FETCH“ (mit „scrolling“)
•
„scrolling“ im „rowset“:
- Bei „insensitive fetches“, können „updates“ durch das eigene AP zu Änderungen und
„holes“ führen
- Bei „sensitive fetches“, können „updates“ durch andere AP ebenfalls zu zu Änderungen
und „holes“ führen
- Beispiel: FETCH PRIOR ROWSET kann „update“ oder „delete holes“ an der Stelle
haben, wo die vorher gelesenen „rows“ gestanden haben
•
Jan 2005
„Row“-Inhalte können sich zwischen den „fetches“ verändern
31
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.3.2 „multi row FETCH“ („dynamic scrollable Cursors“)
•
Startpunkt und Inhalte von „rowsets“ ändern sich beim „scrolling“
vorwärts und rückwärts
•
Man beachte, dass gerade nach dem „fetch“ des CURRENT ROWSET,
können andere Applikationen zwischenzeitlich „rows“ dort einfügen, wo
die Zeilen als Bestandteil eines „rowset“ zurückgegeben wurden
- „Refetching current rowset“ kann also unterschiedliche „rows“ zurückliefern,
unabhängig davon, ob RR ISOLATION verwendet wurde oder nicht
•
FETCH PRIOR ROWSET liefert die vorangehenden n „rows“, die vom
Anfang der „current cursor position“ qualifiziert wurden
- Deshalb werden n „rows“ solange zurückgegeben, wie der Beginn des
„rowset“ nicht erreicht ist
Jan 2005
32
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.3.2 „multi row FETCH“ („positioned UPDATE/DELETE“ / Beispiele)
Cursor CS1 ist auf ein „rowset“ bestehend aus 10 rows der Tabelle T1
positioniert:
Beispiel 1:
Das folgende UPDATE Statement soll alle 10 rows des „rowset“ ändern:
EXEC SQL
UPDATE T1 SET C1 = 5 WHERE CURRENT OF CS1
END-EXEC
Beispiel 2:
Das folgende UPDATE Statement soll die row 4 des „rowset“ verändern:
EXEC SQL
UPDATE T1 SET COL1='ABC'
WHERE CURRENT OF CS1 FOR ROW 4 OF ROWSET
END-EXEC
Jan 2005
33
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.4 GET DIAGNOSTICS
•
Gibt SQL Fehlerinformationen zurück
•
- Für allgemeine Statements
- Für jede beliebige Bedingung (wenn Mehrfachfehler auftreten)
Unterstützt SQL Fehlermeldungen > 70 Bytes (SQLCA limitation)
•
Muss „embedded“ sein – kann nicht dynamisch „prepared“ werden
INSERT
INSERTINTO
INTOT1
T1FOR
FOR55ROWS
ROWSVALUES(:ARRAY);
VALUES(:ARRAY);
GET
GETDIAGNOSTICS
DIAGNOSTICS :ERR_COUNT
:ERR_COUNT==NUMBER;
NUMBER;
DO
II
=
1
TO
ERR_COUNT;
DO II = 1 TO ERR_COUNT;
GET
GETDIAGNOSTICS
DIAGNOSTICSCONDITION
CONDITION:II
:II
:RC
=
RETURNED_SQLSTATE;
:RC = RETURNED_SQLSTATE;
END;
END;
Jan 2005
34
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.4 GET DIAGNOSTICS (Syntax)
Statement-info
GET DIAGNOSTICS
condition-info
Statement-info
,
hostvariable
=
Statement-info-item-name
DB2_GET_DIAGNOSTICS_DIAGNOSTICS
=
DB2_LAST_ROW
DB2_NUMBER_PARAMETER_MARKERS
DB2_RESULT_SETS
DB2_RETURN_STATUS
DB2_SQL_ATTR_CURSOR_HOLD
DB2_SQL_ATTR_CURSOR_ROWSET
DB2_SQL_ATTR_CURSOR_SCROLLABLE
DB2_SQL_ATTR_CURSOR_SENSITIVITY
DB2_SQL_ATTR_CURSOR_TYPE
MORE
NUMBER
ROW_COUNT
combined-info
Statement-info-item-name
Info über das zuletzt ausgeführte
Statement, zB. Grösse des Cursors
Einige Felder gelten nur für bestimmte Stmnts:
Get Diagnostics
Multi-row fetch
Prepare
Call
Open/Allocate
condition-info
CONDITION
hostvariable
Jan 2005
Hostvariable
integer
,
=
condition-info-item-name
Connection-info-item-name
35
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.4 GET DIAGNOSTICS (Syntax)
•
Zum Feststellen, wieviele „rows“ in einem UPDATE Statement verändert
wurden
GET DIAGNOSTICS :rcount = ROW_COUNT;
•
Um „multiple SQL errors“ in einem NOT ATOMIC „multi-row insert“ zu
behandeln
GET DIAGNOSTICS :numerrors = NUMBER;
... Dann einen „loop“ für die folgende Fehlerzahl:
GET DIAGNOSTICS CONDITION :i
:retstate = RETURNED_SQLSTATE
•
Um alle „diagnostic information“ eines SQL Statements sehen zu
können:
GET DIAGNOSTICS :diags = ALL STATEMENT
Beispiel-Output in :diags
Number=1; Returned_SQLSTATE=02000;
DB2_RETURNED_SQLCODE=+100;
für alle „items“ und für alle Bedingungen (getrennt durch „;“)
Jan 2005
36
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.5 INSERT innerhalb eines SELECT
•
Users können automatisch eingefügte Werte erhalten
- Wie z. B: „Identity columns“, „sequence values“
- „User-defined defaults“, „expressions“
- von BEFORE INSERT Triggern modifizierte Spalten
- ROWIDs
Vorteile:
• Verbessert Nutzbarkeit und Mächtigkeit von SQL
Jan 2005
•
Vermindert die „network costs“ in Applikationsprogrammmen
•
Schlägt sich auf die prozedurale Logik in „stored procedures“ nieder
37
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.5 INSERT innerhalb eines SELECT (Beispiel)
DECLARE CS1 CURSOR FOR
SELECT EMP_ROWID
FROM FINAL TABLE
(INSERT INTO EMP_RESUME (EMPNO)
SELECT EMPNO FROM EMP)
ROWID
NOT NULL
GENERATED
ALWAYS
NOT NULL WITH
DEFAULT
'PROJECT NAME
UNDEFINED'
SELECT PROJNAME INTO :name_hv
FROM FINAL TABLE
(INSERT INTO PROJ (PROJNO,DEPTNO,RESPEMP)
VALUES (:projno-hv,:deptno-hv,:respemp-hv))
Jan 2005
38
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.5 INSERT innerhalb eines SELECT (Änderungen im ORDER BY)
CREATE TABLE EMPLOYEE
(EMPNO
INTEGER GENERATED ALWAYS
AS IDENTITY,
.....
DECLARE CS2
SCROLL CURSOR
WITH ROWSET POSITIONING FOR
SELECT
EMPNO
FROM FINAL TABLE
(INSERT INTO EMPLOYEE (NAME, TELE)
FOR 3 ROWS
VALUES(:HVA1, :HVA2)
)
ORDER BY INPUT SEQUENCE
Jan 2005
INTEGER
GENERATED
ALWAYS AS
IDENTITY
39
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.5 INSERT innerhalb eines SELECT (Beispiel für TRIGGER)
CREATE TRIGGER TRIG1
NO CASCADE BEFORE INSERT ON EMPLOYEE
REFERENCING NEW AS NEWSALARY
FOR EACH ROW
MODE DB2SQL
WHEN (NEWSALARY.LEVEL = 'Associate')
SET NEWSALARY.SALARY = NEWSALARY.SALARY + 5000.00
…..
SELECT
FROM
Jan 2005
:name_hv ='New Hire'
NAME,SALARY INTO :name-hv, :salary-hv
:salary_hv =40000.00
FINAL TABLE
(INSERT INTO EMPLOYEE(NAME,SALARY,LEVEL)
VALUES('New Hire',35000.00,'Associate'))
40
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.5 INSERT innerhalb eines SELECT (Beispiel für WITH HOLD Cursors)
Beispiel: Der User deklariert den Cursor, öffnet den Cursor, liest 2
„rows“, setzt einen COMMIT und liest dann die 3. „row“….
DECLARE CS1 CURSOR
WITH HOLD FOR
SELECT EMP_ROWID
FROM FINAL TABLE
(INSERT
INTO EMP_RESUME(EMPNO)
SELECT EMPNO FROM EMP)
OPEN CS1
<-------------- fügt 5 rows ein
FETCH CS1 INTO :hv1 <-------------- erhält die „rowid“ für die erste „row“
FETCH CS1 INTO :hv2 <--------------- erhält die „rowid“ für die zweite „row“
COMMIT
<-------------- alle 5 inserts sind „committed“
FETCH CS1 INTO :hv3 <-------------- erhält die „rowid“ für die dritte „row“
Jan 2005
41
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.5 INSERT innerhalb eines SELECT (Beispiel für WITH HOLD Cursors)
Beispiel: Setzt die Applikation einen „savepoint“ VOR dem Öffnen
des Cursors und veranlasst dann einen ROLLBACK auf den
„savepoint“, werden alle INSERTs hinfällig
DECLARE
CS2 CURSOR FOR
SELECT EMP_ROWID FROM FINAL TABLE
(INSERT INTO EMP_RESUME(EMPNO)
SELECT EMPNO FROM EMP)
SAVEPOINT A ON ROLLBACK RETAIN CURSORS
OPEN CS2
SAVEPOINT B ON ROLLBACK RETAIN CURSORS
...
ROLLBACK TO SAVEPOINT B
ROLLBACK TO SAVEPOINT A
Jan 2005
setzt 1. Savepoint
insert der rows
setzt 2. Savepoint
rows immer noch in
der „table“ EMP_RESUME
alle „inserted rows“ sind
zurückgesetzt
42
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.5 INSERT innerhalb eines SELECT (einige Überlegungen)
FETCH FIRST clause
-
Hat keinen Einfluß darauf, welche „rows“ eingefügt werden
Alle „rows“ aus dem NSERT Statement werden in das Zielobjekt
eingefügt
Die „result table“ enthält lediglich die „rows“, für die die FETCH FIRST
Klausel gültig ist
DECLARE CURSOR
-
Der Cursor ist IMMER „read-only“
OPEN CURSOR
-
Jan 2005
SQLERRD3 wird gesetzt, um die Auswirkungen des INSERT
Statements zu zeigen („number of rows inserted“)
43
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.6 Rekursives SQL
WITH
RPL (PART, SUBPART, QUANTITY) AS
(
Initialisierungs-SELECT
Initialisierungs-SELECT
SELECT
FROM
WHERE
ROOT.PART, ROOT.SUBPART, ROOT.QUANTITY
PARTLIST ROOT
ROOT.PART = '01‚
UNION ALL
Interations-SELECT
Interations-SELECT
SELECT
FROM
WHERE
)
CHILD.PART, CHILD.SUBPART, CHILD.QUANTITY
RPL PARENT, PARTLIST CHILD
PARENT.SUBPART = CHILD.PART
Haupt-SELECT
Haupt-SELECT
SELECT
PART, SUBPART, SUM(QUANTITY) AS QUANTITY
FROM
RPL
GROUP BY PART, SUBPART
Jan 2005
44
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.6 Rekursives SQL – Der Intitialisierungs-SELECT
SELECT
FROM
WHERE
Jan 2005
ROOT.PART, ROOT.SUBPART, ROOT.QUANTITY
PARTLIST ROOT
ROOT.PART = '01‚
45
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.6 Rekursives SQL – Erste Iteration
SELECT
FROM
WHERE
Jan 2005
CHILD.PART, CHILD.SUBPART, CHILD.QUANTITY
RPL PARENT, PARTLIST CHILD
PARENT.SUBPART = CHILD.PART
46
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.6 Rekursives SQL – Zweite Iteration
SELECT
FROM
WHERE
Jan 2005
CHILD.PART, CHILD.SUBPART, CHILD.QUANTITY
RPL PARENT, PARTLIST CHILD
PARENT.SUBPART = CHILD.PART
47
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.6 Rekursives SQL – Haupt-SELECT
SELECT
PART, SUBPART, SUM(QUANTITY) AS QUANTITY
FROM
RPL
GROUP BY PART, SUBPART
Jan 2005
48
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.6 Rekursives SQL – Kontrolle der Rekursionstiefe
WITH
RPL ( LEVEL, PART, SUBPART, QUANTITY) AS
(
Initialisierungs-SELECT
Initialisierungs-SELECT
SELECT
FROM
WHERE
0, ROOT.PART, ROOT.SUBPART, ROOT.QUANTITY
PARTLIST ROOT
ROOT.PART = '01‚
UNION ALL
Interations-SELECT
Interations-SELECT
SELECT
FROM
WHERE
)
PARENT.LEVEL+1, CHILD.PART, CHILD.SUBPART,
CHILD.QUANTITY
RPL PARENT, PARTLIST CHILD
PARENT.SUBPART = CHILD.PART AND PARENT.LEVEL < 2
Haupt-SELECT
Haupt-SELECT
SELECT
LEVEL, PART, SUBPART, SUM(QUANTITY) AS QUANTITY
FROM
RPL
GROUP BY LEVEL, PART, SUBPART
Jan 2005
49
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.6 Rekursives SQL – Empfehlungen
• Tabellen mit „LEVEL“-Feld
• Desk-check „recursive
SQL“ Statement
• Test des „recursive SQL“
gegen KLEINE „test
tables“
• Kontrollieren der
Rekursion
Jan 2005
50
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.7 Expressions im GROUP BY
SELECT
SUBSTR(CHAR(HIREDATE,ISO),1,3)
CONCAT '0 - 9' AS HIREDECADE,
MIN(SALARY) AS MINIMUM_SALARY
FROM
EMPLOYEE
GROUP BY SUBSTR(CHAR(HIREDATE,ISO),1,3) CONCAT '0 - 9'
Jan 2005
51
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.8 „common table expressions“
WITH
E AS
(
SELECT
EMPNO, LASTNAME,SALARY,
SUBSTR(CHAR(HIREDATE,ISO),1,3) CONCAT '0 - 9'
AS HIREDECADE
FROM EMPLOYEE
),
M (HIREDECATE, MINIMUM_SALARY) AS
(
SELECT
S.HIREDECADE, MIN(S.SALARY)
FROM
E
GROUP BY S.HIREDECADE
SELECT
FROM
Jan 2005
)
E.EMPNO, E.LASTNAME, E.HIREDECADE,
E.SALARY, M.MINIMUM_SALARY
E
INNER JOIN
M
ON
E.HIREDECADE = M.HIREDECADE
52
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.8 „nested table expressions“
SELECT E.EMPNO, E.LASTNAME, E.HIREDECADE, E.SALARY, M.MINIMUM_SALARY
FROM
(
SELECT
EMPNO, LASTNAME,SALARY,
SUBSTR(CHAR(HIREDATE,ISO),1,3) CONCAT '0 - 9'
AS HIREDECADE
FROM EMPLOYEE
) AS
E
INNER JOIN
(
SELECT
FROM
S.HIREDECADE, MIN(S.SALARY) AS MINIMUM_SALARY
(
SELECT
SUBSTR(CHAR(HIREDATE,ISO),1,3)
CONCAT '0 - 9' AS HIREDECADE, SALARY
FROM E
EMPLOYEE
) AS
S
GROUP BY S.HIREDECADE
) AS
M
ON E.HIREDECADE = M.HIREDECADE
Jan 2005
53
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.9 Verbesserungen bei diversen DB2-Objekten
2.9.1 „identity columns“
Vorteile .....
•
•
•
•
•
Bessere Performance und Parallelverarbeitung als bei „application generated counters
Garantierte Eindeutigkeit innerhalb eines „subsystems und einer „data sharing group“
„Recoverability“ im Falle eines DB2 Systemfehlers
Fehler in einem „data sharing member“ beeinflußt nicht die anderen „member“ beim
Generieren der „key values“
Einfache Implementierung
What's new? .....
•
•
•
•
•
•
Jan 2005
„Identity Column“ eingeführt in der DB2 Version 6
IC werden automatisch von DB2 generiert
Eindeutige, sequentielle, recoverfähige Werte
Nützlich beim Generieren von „unique primary key values“
in Version 8 kann das ALTER TABLE Statement „identity columns“ enthalten
Spezifikationen zum Modifizieren von Attributen von existierenden „identity columns“
54
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.9 Verbesserungen bei diversen DB2-Objekten
2.9.1 „identity columns“ (Überlegungen)
Vor Version 8: für „unload“ und „reload“ von Daten musste die „identity
column“ mit GENERATED BY DEFAULT definiert sein
• Mit der Option GENERATED ALWAYS war die einizige Option für
unload/reload das folgende Vorgehen:
-
Unload der Tabelle
DROP der tabelle
Re-CREATE der Tabelle MIT GENERATED BY DEFAULT
Reload der Tabelle
• Ansonsten wird DB2 neue Werte für alle „rows“ während des „reload“
generieren. Dies mag nicht gewünscht sein…
Mit Version 8: Spezifiziert man GENERATED ALWAYS und will später die Daten
mit unload/reload behandeln kann man jetzt wie folgt vorgehen:
-
Jan 2005
ALTER TABLE ALTER COLUMN SET GENERATED BY DEFAULT
Unload der Tabelle
Reload der Tabelle
ALTER TABLE ALTER COLUMN SET GENERATED ALWAYS
55
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.9 Verbesserungen bei diversen DB2-Objekten
2.9.1 „identity columns“ (Verbesserungen)
Dynamisches ALTER von „Identity column“ Attributen
• ALTER TABLE ALTER COLUMN erweitert:
- Möglichkeit zur Modifikation der „identity column“ Attribute und
- Spezifikation der Weiterführung der „sequences“
• Es werden nur die zukünftigen Werte von dieser Änderung betroffen sein
• Kein ALTER des „data type“ der „identity column“ möglich
• Ungenutzte „cache- Werte“ gehen verloren, wenn die „column attributes“
geändert wurden
Unterstützung neuer „keywords“ um die Portierung von anderen Plattformen
zu erleichtern:
• NO MINVALUE
• NO MAXVALUE
• NO ORDER, ORDER
• INCREMENT BY kann 0 sein
• MINVALUE = MAXVALUE ist möglich
Jan 2005
56
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.9 Verbesserungen bei diversen DB2-Objekten
2.9.1 „identity columns“ (Verbesserungen)
• CREATE TABLE...
• colname datatype...
GENERATED ALWAYS / BY DEFAULT
AS IDENTITY
(
START WITH n,
INCREMENT BY n,
CACHE 20 / NO CACHE / CACHE n
CYCLE / NO CYCLE
MINVALUE / NO MINVALUE
MAXVALUE / NO MAXVALUE
ORDER / NO ORDER
)
DB2 V6
DB2 V7
DB2 V8
• Möglich ist MINVALUE = MAXVALUE
• Möglich ist INCREMENT BY 0
Jan 2005
57
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.9 Verbesserungen bei diversen DB2-Objekten
2.9.2 „sequences“ – Das Problem
Die übliche Implementierung besteht aus einer Tabelle mit einer „row“, die die
„sequence number“ enthält
• Jede Transaktion sperrt diese „table“, erhöht die Zahl, „commited“ (d.h.zu einem
Zeitpunkt kann nur EINE Transaktion die „sequence number“ erhöhen)
• ODER: Eine Variante wäre, SELECT MAX( ) + 1...WITH RR zu nutzen, mit
nachfolgendem INSERT des wiedergewonnen Schlüssels
• Problem:
- Die Page, die den Zähler enthält, bildet einen „hot spot“ in der DB und führt damit
zu „unpredictable transaction delays“, verursacht durch das Setzen des „intersystem P-lock“ Flags auf diese Page und durch das Kennzeichen „buffer invalid“
und den folgenden „refresh“.
- „Contention“ verhindert einen effizienten Durchsatz von Transaktionen und eine
befriedigendes Applikationsverhalten
- Stürzt ein „member“ ab, so kann es passieren, dass die Locks, gehalten vom
fehlerhaften „member“, den Zugriff von anderen „members“ auf den „shared
counter“ verhindern
„Identity columns“ bieten nur eine teilweise Lösung des Problems…
Jan 2005
58
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.9 Verbesserungen bei diversen DB2-Objekten
2.9.2 „sequences“ – Die Lösung
Vermeiden des „concurrency“ und Performance Problems indem APs ihre
eigenen „sequence numbers“ (hotspots) generieren
DB2 Sequences ermöglichen mehreren Transaktions parallel das Erhöhen
der „sequence number“ und garantieren, dass jede Zahl EINDEUTIG
istunique
„Sequences“ können von mehreren Usern zugegriffen und erhöht werden,
ohne einen WAIT-Zustand durchlaufen zu müssen
•
DB2 wartet nicht auf den COMMIT von Transaktionen, die eine
„sequence“ erhöht haben, bevor diese durch eíne andere Transaktion
erneut erhöht werden kann
Fehler in einem DB2 „member“ einer Gruppe verhindert niemals den
Zugriff (R/W) auf die „sequence“ durch die „überlebenden members“
•
Jan 2005
Es gibt keine „locks“, die den Zugriff auf eine „sequence“ verhindern
könnte
59
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.9 Verbesserungen bei diversen DB2-Objekten
2.9.2 „sequences“ und „idendity columns“ – Ein Vergleich
Jan 2005
Sequences
Identity columns
„Stand-alone object „
an eine „table“ gebunden
Kann eine „sequence“ für mehrere
„tables“ oder mehere „sequences“ in
einer „table“ anwenden
„One to one“ Beziehung
zwischen „identity“ und „tables“
Erhält man mit NEXT VALUE FOR /
PREVIOUS VALUE FOR Ausdrücken
Erhält man mit IDENTITY_VAL_LOCAL
Funktion – innerhalb eines Agenten
Kann über ALTER SEQUENCE
geändert werden
Kann über ALTER TABLE
(ALTER COLUMN) geändert werden
VOR V8 keine Änderung möglich
60
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.9 Verbesserungen bei diversen DB2-Objekten
2.9.2 „sequences“ und SQL
CREATE SEQUENCE
• Erzeugt eine „sequence“ auf dem entsprechenden „application server“
• Kann in einem „application program“ genutzt oder interaktiv verwendet
werden
ALTER SEQUENCE
• Kann die Werte von INCREMENT BY, MIN VALUE, MAXVALUE,
CACHE, CYCLE verändern und einen RESTART WITH mit einer
anderen „sequence“ durchführen
DROP SEQUENCE
COMMENT ON SEQUENCE
GRANT/REVOKE ON SEQUENCE
NEXT VALUE FOR und PREVIOUS VALUE FOR
Jan 2005
61
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.9 Verbesserungen bei diversen DB2-Objekten
2.9.2 „sequences“ – CREATE Beispiel
CREATE
CREATESEQUENCE
SEQUENCESEQTEST1
SEQTEST1AS
ASINTEGER
INTEGER
START
STARTWITH
WITH
11
INCREMENT
INCREMENTBY
BY 11
MINVALUE
MINVALUE
11
MAXVALUE
MAXVALUE
55
CYCLE
CYCLE
CACHE
CACHE
55
NO
NOORDER;
ORDER;
Jan 2005
62
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.9 Verbesserungen bei diversen DB2-Objekten
2.9.2 „sequences“ – Anwendbarkeit
Applikationen können die Werte „next sequence“ wie folgt erhalten:
NEXT VALUE FOR < sequence- name >
PREVIOUS VALUE FOR < sequence-name >
( NEXT VALUE funktioniert n ur innerhalb derselben „session“ )
Kann in folgenden Situationen benutzt werden:
SELECT Statement oder SELECT INTO Statement in der Select-Klausel (ausser bei
DISTINCT, UNION, GROUP BY oder ORDER BY)
INSERT Statement in der VALUES Klausel
INSERT Statement in der Select-Klausel des „fullselect“
Update Statement in der SET Klausel (ausser in der „select-clause“ eines „fullselect“ einer
„expression“)
VALUES oder VALUES INTO Statement (ausser in der „select-clause“ eines „fullselect“ einer
„expression“)
CREATE PROCEDURE, FUNCTION, TRIGGER
Set :hv = NEXT VALUE FOR <sequence>
Jan 2005
63
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.9 Verbesserungen bei diversen DB2-Objekten
2.9.2 „sequences“ – Restriktionen (NEXT/PREVIOUS VALUE)
• Join Bedingung eines „full outer join“
• Default Wert einer Spalte im CREATE oder ALTER TABLE
Statement
• „Generated column“ Definition in einem CREATE oder ALTER
TABLE Statement
• „Materialized query table“ Definition in einem CREATE oder
ALTER TABLE Statement
• Bedingung eines CHECK „constraint“
• Eingabewertspezifikation für LOAD
• CREATE VIEW Statement
Jan 2005
64
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.9 Verbesserungen bei diversen DB2-Objekten
2.9.3 „sequences“ – Beispiel-1
1)
„sequence“ definiert mit START WITH 1, INCREMENT BY 1
SELECT NEXT VALUE FOR MYSEQ FROM SYSIBM.SYSDUMMY1;
Wert = 1
SELECT NEXT VALUE FOR MYSEQ FROM SYSIBM.SYSDUMMY1;
Wert = 2
COMMIT;
SELECT PREVIOUS VALUE FOR MYSEQ FROM SYSIBM.SYSDUMMY1; Wert = 2
2)
PREVIOUS/NEXT VALUE FOR sepezifiziert in der SET Klausel eines UPDATE
UPDATE T SET C1 = (SELECT PREVIOUS VALUE FOR S1 FROM T);
UPDATE T SET C1 = NEXT VALUE FOR S1;
3)
Ansehen der „sequence“ während des INSERT
SELECT * FROM FINAL TABLE
(
INSERT INTO TESTTAB (KEYVALUE, TESTSEQ)
VALUES ( NEXT VALUE FOR SEQTEST1, NEXT VALUE FOR SEQTEST2 )
);
Jan 2005
65
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.9 Verbesserungen bei diversen DB2-Objekten
2.9.3 „sequences“ – Beispiel-2
INSERT
CREATE
Jan 2005
INTO table (part_no, col2, col3... )
VALUES
(NEXT VALUE FOR SEQGEN1, col1, col2..)
SEQUENCE SEQGEN1 AS INTEGER
START WITH 1 INCREMENT BY 1
MINVALUE 1 MAXVALUE 5
CYCLE CACHE 5 NO ORDER;
66
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.9 Verbesserungen bei diversen DB2-Objekten
2.9.4 „sequences“ – Konstante
CREATE
CREATE SEQUENCE
SEQUENCEconsequence
consequenceAS
ASINTEGER
INTEGER
START
STARTWITH
WITH
11
INCREMENT
INCREMENTBY
BY
00
MINVALUE
MINVALUE
00
MAXVALUE
MAXVALUE
55
CYCLE
CYCLE
CACHE
CACHE
55
NO
NOORDER;
ORDER;
Jan 2005
67
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.10 „Qualified Column Names“ in INSERT und UPDATE
• Spaltenname können über „table name“, oder ein „schema“ gefolgt von
einem „table name“ im INSERT
• Spaltennnamen in der SET Klausel in einem UPDATE Statement können
ebenfalls qualifiziert werden
• Diese Verbesserungeh dienen der Kompatibilität innerhalb der „DB2
family“
Beispiel:
Jan 2005
UPDATE T1
SET T1.C1 = C1 + 10 WHERE C1 = 1
UPDATE T1 T
SET T.C1 = C1 + 10 WHERE C1 = 2
68
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.10 IS NOT DISTINCT FROM
• SQL nutzt eine „three-valued logic“ in der jedes beliebige Ergebnis geliefert
werden kann: TRUE, FALSE, oder NULL
• Applikationen können die Klausel IS NOT DISTINCT FROM verwenden ,
um ein TRUE Resultat anstatt eines NULL zu erhalten, wenn man gegen
NULL Werte vergleicht
Beispiel:
SELECT C1 FROM T1 WHERE C1 IS NOT DISTINCT FROM :hv;
Von der Query
zurückgegeben
Jan 2005
69
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.10 EXPLAIN Satement-Cache
• Verbesserungen des EXPLAIN Statement ermöglichen die Nutzung von
EXPLAIN Information aus dem DB2 „global statement cache“
• Visual Explain ist entsprechend angepasst
1. Explain des „cached statement“ mit der „statement ID“ 124:
SID = 124;
EXEC SQL EXPLAIN STMTCACHE STMTID :SID;
2. Explain des „cached statement“ mt dem „statement token“ 'SELECTEMP':
EXEC SQL EXPLAIN STMTCACHE STMTTOKEN 'SELECTEMP';
Jan 2005
70
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.10 neue „builtin functions“
• „Encryption functions“
• Generieren von eindeutigen Werten
SELECT HEX(GENERATE_UNIQUE()) FROM SYSIBM.SYSDUMMY1;
---------+---------+---------+---------+---------+---------+---------+--------00BAE9C5B971D0712000010A02
• Neue Funktionen:
- CHARACTER_LENGTH
- POSITION
- SUBSTRING (in V7 nur SUBSTR Funktion)
• Geändert wurden die Funktionen:
- (VAR)CHAR
- (DB)CLOB
- (VAR)GRAPHIC
- INSERT
Jan 2005
-
LEFT
LOCATE
RIGHT
CAST
71
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.10 Sessionvariable
• Variable gesetzt von DB2, „connection“ oder „sign-on exit“
• „Built in function“ zum Lesen der Werte einer variablen
- in views, triggers, „stored procedures“ und „constraints“
• Mehr generelle, flexible Zugriffsprüfungen (mehrere Spalten, AND/OR Logik, ..)
• Ergänzt andere „security“ Mechanismen
CREATE VIEW V1 AS SELECT *
WHERE
FROM
T1
COL5 = GETVARIABLE(SYSIBM.SECLABEL);
• DB2-defined session variables ( alle im „SYSIBM“ Schema )
SYSIBM.DATA_SHARING_GROUP_NAME
SYSIBM.PACKAGE_NAME
SYSIBM.PACKAGE_SCHEMA
SYSIBM.PACKAGE_VERSION
SYSIBM.PLAN_NAME
SYSIBM.VERSION
SYSIBM.SECLABEL
SYSIBM.SYSTEM_NAME
SYSIBM.SYSTEM_ASCII_CCSID
SYSIBM.SYSTEM_EBCDIC_CCSID
SYSIBM.SYSTEM_UNICODE_CCSID
• Bis zu 10 user-defined session variables
Jan 2005
72
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.10 Transparenz der ROWID
•
Die ROWID braucht nicht mehr explizit als Spalte in einer Tabelle mit LOB‘s
definiert zu werden
•
DB2 generiert eine "hidden" ROWID Spalte, die nicht im SELECT * aufscheint
•
Vereinfacht die Portierung von LOB Applikationen auf/von anderen
Plattformen
CREATE DATABASE BSDBLOB ;
CREATE TABLESPACE BSTSLOB IN BSDBLOB;
CREATE TABLE LOB_TEST
( EMPNO CHAR( 06 ) NOT NULL,
RESUME CLOB( 1K ) )
IN BSDBLOB.BSTSLOB CCSID EBCDIC;
CREATE LOB TABLESPACE BSTSLOBC
IN BSDBLOB LOG NO;
CREATE AUX TABLE AUX_LOB_TEST
IN BSDBLOB.BSTSLOBC STORES LOB_TEST
COLUMN RESUME;
Jan 2005
SELECT SUBSTR(NAME,1,30) AS NAME
, COLTYPE , HIDDEN
FROM SYSIBM.SYSCOLUMNS
WHERE TBNAME = 'LOB_TEST';
---------+---------+---------+-------------+
NAME
COLTYPE
HIDDEN
---------+---------+---------+-------------+
EMPNO
CHAR
N
RESUME
CLOB
N
DB2_GEN_ROWID_FOR_LOBS ROWID
P
73
2.
2. Neue
Neue Funktionen
Funktionen im
im SQL
SQL
2.1 „scalar full select“
2.2 „multiple DISTINCT‘s“
2.3 „multi row“ Operationen
2.3.1 „multi row“ INSERT
2.3.2 „multi row“ FETCH
2.4 GET DIAGNOSTICS
2.5 INSERT innerhalb eines SELECT
2.6 Rekursives SQL
2.7 Expressions im GROUP BY
2.8 „common table“ /“nested table“ Ausdrücke
2.9 Verbesserungen bei div Objekten („identity columns“, „sequences“)
2.10 Sonstige
Jan 2005
74

Documentos relacionados