ACCOUNT

Werbung
(*)
IBM DB2 V7
for OS/390
Neue Funktionen und „features“
(DB2-UPD-V7)
(*) ist eingetragenes Warenzeichen der IBM International Business Machines Inc.
Jan 2002
1
DB2
Überblick)
DB2 V7
V7 Inhalte
Inhalte ((Überblick)
Jan 2002
•
Neue Basis-Funktionen
• Spracherweiterungen
• Funktionserweiterungen
• Performance-Verbesserung
•
Neue Werkzeuge
• S/390 basiert
• Workstation-orientiert
•
•
Erweiterung bestehender Werkzeuge
Migration
•
Addendum/Ausblick: V7R2
2
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.1 UNION „everywhere“
1.2 CONSTRAINT – Verbesserungen
1.3 Scrollable Cursor
1.4 Row-Expressions
1.5 Limitierter FETCH
1.6 SELF-REFERENCING UPDATE / DELETE
Jan 2002
3
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.1 UNION „everywhere“
UNION [ ALL ] ist erlaubt in
• CREATE VIEW
• Nested table expressions
• Predicates (Suchargumenten)
- EXISTS
-
quantifizierte Prädikate
IN-Listen
• UPDATE – Befehlen
• INSERT - Anweisungen
Jan 2002
4
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.1 UNION „everywhere“ - Syntax
CREATE VIEW
fullselect
EXISTS
IN
UPDATE...SET col =
INSERT INTO
< , > , = , <=, >= (
2
subselect
)
<, >, = ANY / ALL / SOME
Jan 2002
5
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.1 UNION „everywhere“
• „Query rewrite“ versucht optimalen Zugriff zu
gewährleisten (kein „view materializing“)
• SQLCODE –811, wenn Subquery kein eindeutiges
Ergebnis liefert, semantisch aber nur ein Wert zulässig
ist („quantified predicate“)
• Performance: Neue Spalten & Werte in PLAN_TABLE für EXPLAIN
- PARENT_QBLOCKNO
- TABLE_TYPE
- Neue Werte TABLEX, UNION, UNIONA in QBLOCK_TYPE
• In DB2/UDB (Intel) schon seit V6 !
Jan 2002
6
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.1 UNION „everywhere“ - Beispiele
select perstype, count(*) from
(
select
'Worker' as perstype, empno from employee
union all
select
'Boss ' as perstype, mgrno from department
)
as T1
group by perstype
;
Select
*
where
Jan 2002
from department
deptno in
( select
deptno
from department
where
mgrno is null
union all
select
workdept
from employee
where
salary > 50000
)
7
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.1 UNION „everywhere“ – DB-Modell
Jan 2002
8
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.1 UNION „everywhere“ – Beispiele(„tablespec“)
Gesamtsummen
Gesamtsummen aller
aller CC
CC nach
nach „accounts“
„accounts“ mit
mit account,
account, account
account name
name und
und total
total
balance.
balance.
SELECT
SELECT ACCOUNT.ACCOUNT,
ACCOUNT.ACCOUNT, ACCOUNT.ACCOUNT_NAME,
ACCOUNT.ACCOUNT_NAME,
SUM(ALLCARDS.AMOUNT)
SUM(ALLCARDS.AMOUNT)
FROM
FROM ACCOUNT,
ACCOUNT, TABLE
TABLE (SELECT
(SELECT ACCOUNT,
ACCOUNT, AMOUNT
AMOUNT
FROM
PLATINUM
FROM PLATINUM
UNION
ALL
UNION ALL
SELECT
SELECT ACCOUNT,
ACCOUNT, AMOUNT
AMOUNT
FROM
FROM GOLD
GOLD
UNION
UNION ALL
ALL
SELECT
SELECT ACCOUNT,
ACCOUNT, AMOUNT
AMOUNT
FROM
FROM BLUE
BLUE
)) AS
ALLCARDS
AS ALLCARDS (ACCOUNT,
(ACCOUNT, AMOUNT),
AMOUNT),
WHERE
ACCOUNT.ACCOUNT
=
ALLCARDS.ACCOUNT
WHERE ACCOUNT.ACCOUNT = ALLCARDS.ACCOUNT
GROUP
GROUP BY
BY ACCOUNT.ACCOUNT,
ACCOUNT.ACCOUNT, ACCOUNT.ACCOUNT_NAME
ACCOUNT.ACCOUNT_NAME
Jan 2002
9
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.1 UNION „everywhere“ – Beispiele(„basic predicate“)
Anzeige,
Anzeige, ob
ob der
der angegebene
angegebene Account
Account ein
ein GOLD-Karten-Inhaber
GOLD-Karten-Inhaber ist.
ist. Wenn
Wenn ja,
ja, zeige
zeige die
die
„account“
„account“ Details
Details an.
an.
SELECT
SELECT
FROM
FROM
WHERE
WHERE
AND
AND
Jan 2002
'GOLD
'GOLD CARD
CARD ACCOUNT:',
ACCOUNT:', ACCOUNT.ACCOUNT,
ACCOUNT.ACCOUNT,
ACCOUNT.ACCOUNT_NAME,
ACCOUNT.ACCOUNT_NAME, ACCOUNT.CREDIT_LIMIT
ACCOUNT.CREDIT_LIMIT
ACCOUNT
ACCOUNT
'GOLD'
SELECT
'PLATINUM'
'GOLD' == ((
SELECT
'PLATINUM'
FROM
PLATINUM
FROM
PLATINUM
WHERE
ACCOUNT
WHERE
ACCOUNT == 'BMP291'
'BMP291'
UNION
UNION
SELECT
'GOLD'
SELECT
'GOLD'
FROM
GOLD
FROM
GOLD
WHERE
ACCOUNT
WHERE
ACCOUNT == 'BMP291'
'BMP291'
UNION
UNION
SELECT
'BLUE'
SELECT
'BLUE'
FROM
BLUE
FROM
BLUE
WHERE
ACCOUNT
WHERE
ACCOUNT == 'BMP291')
'BMP291')
ACCOUNT
ACCOUNT == 'BMP291';
'BMP291';
10
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.1 UNION– Beispiele(„quantified predicates“: SOME, ANY, ALL)
Zeige,
Zeige, ob
ob irgendwelche
irgendwelche „accounts“
„accounts“ über
über dem
dem Kreditlimit
Kreditlimit liegen
liegen
SELECT
SELECT
FROM
FROM
WHERE
WHERE
AND
AND
Jan 2002
'ACCOUNT
'ACCOUNT OVER
OVER CREDIT
CREDIT LIMIT',
LIMIT', ACCOUNT_NAME
ACCOUNT_NAME
ACCOUNT
T1
ACCOUNT T1
CREDIT_LIMIT
SUM(AMOUNT)
CREDIT_LIMIT << ANY
ANY (( SELECT
SELECT
SUM(AMOUNT)
FROM
PLATINUM
FROM
PLATINUM
WHERE
ACCOUNT
WHERE
ACCOUNT == T1.ACCOUNT
T1.ACCOUNT
UNION
UNION
SELECT
SUM(AMOUNT)
SELECT
SUM(AMOUNT)
FROM
GOLD
FROM
GOLD
WHERE
ACCOUNT
WHERE
ACCOUNT == T1.ACCOUNT
T1.ACCOUNT
UNION
UNION
SELECT
SUM(AMOUNT)
SELECT
SUM(AMOUNT)
FROM
BLUE
FROM
BLUE
WHERE
ACCOUNT
WHERE
ACCOUNT == T1.ACCOUNT)
T1.ACCOUNT)
T1.ACCOUNT
T1.ACCOUNT == T1.ACCOUNT;
T1.ACCOUNT;
11
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.1 UNION „everywhere“ – Beispiele(EXISTS-Prädikat)
Zeige
Zeige alle
alle „accounts“
„accounts“ mit
mit Aktivitäten
Aktivitäten im
im Januar
Januar 2000.
2000.
SELECT
SELECT
FROM
FROM
WHERE
WHERE
Jan 2002
ACCOUNT,
ACCOUNT, ACCOUNT_NAME
ACCOUNT_NAME
ACCOUNT
ACCOUNT T1
T1
EXISTS
((
SELECT
**
EXISTS
SELECT
FROM
PLATINUM
FROM
PLATINUM
WHERE
ACCOUNT
WHERE
ACCOUNT == T1.ACCOUNT
T1.ACCOUNT
AND
YEAR(DATE)
AND
YEAR(DATE) == 2000
2000
AND
MONTH(DATE)
=
AND
MONTH(DATE) = 11
UNION
UNION
SELECT
**
SELECT
FROM
GOLD
FROM
GOLD
WHERE
ACCOUNT
WHERE
ACCOUNT == T1.ACCOUNT
T1.ACCOUNT
AND
YEAR(DATE)
AND
YEAR(DATE) == 2000
2000
AND
MONTH(DATE)
AND
MONTH(DATE) == 11
UNION
UNION
SELECT
**
SELECT
FROM
BLUE
FROM
BLUE
WHERE
ACCOUNT
WHERE
ACCOUNT == T1.ACCOUNT
T1.ACCOUNT
AND
YEAR(DATE)
AND
YEAR(DATE) == 2000
2000
AND
MONTH(DATE)
=
)) ;;
AND
MONTH(DATE) = 11
12
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.1 UNION „everywhere“ – Beispiele(INSERT)
UNION
UNION in
in INSERT‘s
INSERT‘s
INSERT
INSERT INTO
INTO CARDS_2000
CARDS_2000 (ACCOUNT,
(ACCOUNT, AMOUNT)
AMOUNT)
(SELECT
ACCOUNT,
(SELECT
ACCOUNT, SUM(AMOUNT)
SUM(AMOUNT)
FROM
PLATINUM
FROM
PLATINUM
WHERE
YEAR(DATE)
WHERE
YEAR(DATE) == 2000
2000
GROUP
ACCOUNT
GROUP BY
BY
ACCOUNT
UNION
UNION
SELECT
ACCOUNT,
SELECT
ACCOUNT, SUM(AMOUNT)
SUM(AMOUNT)
FROM
GOLD
FROM
GOLD
WHERE
YEAR(DATE)
WHERE
YEAR(DATE) == 2000
2000
GROUP
BY
GROUP
BY ACCOUNT
ACCOUNT
UNION
UNION
SELECT
ACCOUNT,
SELECT
ACCOUNT, SUM(AMOUNT)
SUM(AMOUNT)
FROM
BLUE
FROM
BLUE
WHERE
YEAR(DATE)
WHERE
YEAR(DATE) == 2000
2000
GROUP
BY
ACCOUNT
);
GROUP BY
ACCOUNT );
Jan 2002
13
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.1 UNION „everywhere“ - Beispiele
UNION
UNION in
in UPDATE‘s
UPDATE‘s
UPDATE
UPDATE
SET
SET
CARDS_2000
CARDS_2000 T1
T1
CARD_TYPE
CARD_TYPE == (( SELECT
SELECT
FROM
FROM
WHERE
WHERE
SELECT
SELECT
FROM
FROM
WHERE
WHERE
SELECT
SELECT
FROM
FROM
WHERE
WHERE
Jan 2002
'P'
'P'
PLATINUM
PLATINUM T2
T2
T1.ACCOUNT
T1.ACCOUNT == T2.ACCOUNT
T2.ACCOUNT
UNION
UNION
'G'
'G'
GOLD
GOLD T3
T3
T1.ACCOUNT
T1.ACCOUNT == T3.ACCOUNT
T3.ACCOUNT
UNION
UNION
'B'
'B'
BLUE
BLUE T4
T4
T1.ACCOUNT
T1.ACCOUNT == T4.ACCOUNT
T4.ACCOUNT );
);
14
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.1 UNION „everywhere“ - Explain
Jan 2002
15
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.1 UNION „everywhere“ - EXPLAIN
• „Neue Spalten & Werte in PLAN_TABLE für EXPLAIN
- PARENT_QBLOCKNO: enthält die Anzahl von „parent QB‘s“ zu
dem aktuellen QB
- TABLE_TYPE:
F: Funktion
Q: temporäre Ergebnistabelle (für STAR JOIN, nicht für UNION)
T: Tabelle
W: „work“-datei
- QBLOCK_TYPE: Neue Werte zur Anzeige des Verarbeitungstyps des QB
TABLEX:
„table expression“
UNION:
UNION
UNIONA:
UNION ALL
• In DB2/UDB (Intel) schon seit V6 !
• Unser Beispiel:
- Die niedrigsten QB-Levels sind 1 und 6
- In QB 5 ist der „table type“ = „W“, d.h. Materialisierung findet statt
- ... Dies ist der einzige Weg, zu sehen, wie ein „rewrite“ einer Query wirkt...
Jan 2002
16
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.2 CONSTRAINT - Verbesserungen
• Bis Version 6
• Nur „foreign keys“ und „check constraints“ haben Namen
• Unterschiedliche (inkosistente) Syntax für die „constraint“-Klauseln
• „Unique“ constraint nicht änderbar (alter / drop)
• Index-Handhabung und Auswirkung unterschiedlich
zwischen „primary“ und „unique“ – constraints
• Dropauf den Index, der den PK darstellt stoppt alle Zugriffe auf die Tabelle
• Katalog-Informationen über „primary key“- und
„unique“-constraints in SYSINDEX, SYSCOLUMNS
• Keine Konsistenz in den „constraints“
Jan 2002
17
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.2 CONSTRAINT – Verbesserungen – V7
• Alle Constraints können (müssen) benannt sein
- Foreign Keys:
8-Byte Namen
:
18 Byte (Primary Key, Unique, Check)
- Sonstige
- Eindeutige Namen pro Tabelle
• Default-Name: erste referenzierte Spalte + Zähler
• Alle constraints können mit „alter table ...drop constraint “
entfernt werden
• Drop Index erfordert vorherigen DROP des Constraint
- Für primary und unique
- Ausnahme: „unique“, die vor V7 angelegt wurden
• Alle Details zu „constraints“ werden expilizit im Katalog abgelegt
• „Alte“ Syntax funktioniert weiterhin ...
(OS/390 – Anpassung an UDB-Family - dort bereits seit V6)
Jan 2002
18
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.2 CONSTRAINTs – neue Syntax (Beispiele)
alter
table employee
add constraint
u_emp_name unique
( lastname, firstnme )
create table company_cars
( license_plate
varchar
(20) not null,
constraint cars_prim primary key ( license_plate ),
manufacturer
char
(8),
constraint cars_man check
( manufacturer in (‚BMW', 'GM')),
model
char
(15),
driver
char
(6),
constraint car_driver foreign key ( driver )
references employee
)
alter
Jan 2002
table company_cars
drop constraint car_driver
19
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.2 CONSTRAINTs – neue Syntax (Beispiele)
Version
Version 66
CREATE
CREATE
ALTER
ALTER
2
2
ALTER
ALTER
DROP
DROP
DROP
DROP
DROP
DROP
DROP
DROP
DROP
DROP
Jan 2002
TABLE...
TABLE...
PRIMARY
PRIMARYKEY
KEY(SUPPLIER_ID)...
(SUPPLIER_ID)...
UNIQUE
UNIQUE(SUPPLIER_ID)...
(SUPPLIER_ID)...
FOREIGN
FOREIGNKEY
KEYFPARTS001
FPARTS001(SUPPLIER_ID)...
(SUPPLIER_ID)...
CONSTRAINT
CPARTS001
CONSTRAINT CPARTS001CHECK
CHECK...
...
TABLE...
TABLE...
ADD
ADDPRIMARY
PRIMARYKEY
KEY(SUPPLIER_ID)...
(SUPPLIER_ID)...
ADD
UNIQUE
(SUPPLIER_ID)...
ADD UNIQUE (SUPPLIER_ID)...
ADD
ADDFOREIGN
FOREIGNKEY
KEYFPARTS001
FPARTS001(SUPPLIER_ID)...
(SUPPLIER_ID)...
ADD
ADDCONSTRAINT
CONSTRAINTCPARTS001
CPARTS001CHECK
CHECK...
...
TABLE...
TABLE...
Version
PRIMARY
Version 77
PRIMARYKEY...
KEY...
CREATE
UNIQUE...
CREATE TABLE...
TABLE...
UNIQUE...
CONSTRAINT
FOREIGN
KEY
FPARTS001...
CONSTRAINTPSUPP
PSUPPPRIMARY
PRIMARYKEY
KEY(SUPPLIER_ID)...
(SUPPLIER_ID)...
FOREIGN KEY FPARTS001...
CONSTRAINT
CHECK
CONSTRAINTUSUPP001
USUPP001UNIQUE
UNIQUE(SUPPLIER_ID)...
(SUPPLIER_ID)...
CHECKCPARTS001...
CPARTS001...
CONSTRAINT
CONSTRAINT
CONSTRAINTFPARTS001
FPARTS001FOREIGN
FOREIGNKEY
KEY(SUPPLIER_ID)...
(SUPPLIER_ID)...
CONSTRAINTFPARTS001...
FPARTS001...
CONSTRAINT
CPARTS001
CHECK
...
CONSTRAINT CPARTS001 CHECK ...
ALTER
ALTER TABLE...
TABLE...
ADD
ADDCONSTRAINT
CONSTRAINTPSUPP
PSUPPPRIMARY
PRIMARYKEY(SUPPLIER_ID)...
KEY(SUPPLIER_ID)...
ADD
CONSTRAINT
USUPP001
ADD CONSTRAINT USUPP001UNIQUE
UNIQUE(SUPPLIER_ID)...
(SUPPLIER_ID)...
ADD
ADDCONSTRAINT
CONSTRAINTFPARTS001
FPARTS001FOREIGN
FOREIGNKEY(SUPPLIER_ID)...
KEY(SUPPLIER_ID)...
ADD
ADDCONSTRAINT
CONSTRAINTCPARTS001
CPARTS001CHECK
CHECK...
...
ALTER
ALTER TABLE...
TABLE...
DROP
PRIMARY
DROP
PRIMARYKEY...
KEY...
DROP
UNIQUE
DROP
UNIQUEUSUPP001
USUPP001...
...
DROP
CHECK
DROP
CHECKCPARTS001...
CPARTS001...
DROP
CONSTRAINT
DROP
CONSTRAINTFPARTS001...
FPARTS001...
DROP
FOREIGN
DROP
FOREIGNKEY
KEYFPARTS001...
FPARTS001...
20
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.2 CONSTRAINTs - Restriktionen beim DROP
Indexes die entweder einen „primary key“ oder „unique key“ darstellen, können
nicht „gedropped“ werden, bis der zugehörige „constraint“ entfernt ist !
1. Entfernen „foreign key constraint“
ALTER TABLE PARTS
DROP CONSTRAINT FPARTS01;
2. Entfernen „parent key constraint“
ALTER TABLE SUPPLIER
DROP PRIMARY PSUPP; oder
ALTER TABLE SUPPLIER
DROP CONSTRAINT PSUPP; oder
ALTER TABLE SUPPLIER
DROP UNIQUE USUPP01; oder
ALTER TABLE SUPPLIER
DROP CONSTRAINT USUPP01;
Jan 2002
21
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.2 CONSTRAINT- Informationen im Systemkatalog
• Foreign Key und Check - Constraints
• Wie bisher in SYSRELS und SYSFOREIGNKEYS
• Primary und Unique - Constraints
• Neue Tabellen SYSTABCONST u. SYSKEYCOLUSE
• TABLESTATUS in SYSTABLES
• ‚P‘
für primary keys, falls Index noch fehlt (wie bisher)
• ‚U‘
für unique constraint, falls Index noch nicht angelegt
• ‚PU‘
für das Zusammentreffen der beiden Situationen
Hinweis: OEM-Werkzeuge sind auf „Verträglichkeit“ zu prüfen
Jan 2002
22
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.2 CONSTRAINT- Informationen im Systemkatalog
SYSIBM.SYSTABCONST
speichert Details über „primary key“ und „unique key“
constraints. Es gibt referentielle Abhängigkeiten zu
SYSIBM.SYSTABLES und SYSIBM.SYSKEYCOLUSE.
Column name
Jan 2002
Type
Beschreibung
CONSTNAME
VARCHAR(128) NOT NULL
Name des constraint
TBCREATOR
CHAR(8) NOT NULL
Authorization ID des „table-owners“
TBNAME
VARCHAR(18) NOT NULL
Tabellenname des „constraint“
CREATOR
CHAR(8) NOT NULL
Authorization ID des „constraint-Creators“
TYPE
CHAR(1)
Typ des constraint:
P
Primary key
U
Unique key
IXOWNER
CHAR(8) NOT NULL
Owner des Index der den „constraint“ unterstützt
IXNAME
VARCHAR(18) NOT NULL
Name des index
CREATEDTS
TIMESTAMP NOT NULL
Create-Zeotpunkt des „constraint“
IBMREQD
CHAR(1) NOT NULL
DEFAULT ‘N’
N
No
Y
Yes
23
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.2 CONSTRAINT- Informationen im Systemkatalog
SYSIBM.SYSKEYCOLUSE
Column name
Jan 2002
speichert Details über „primary key“ und „unique key“
constraints: eine „row“ pro Spalte in Schlüsseln desselben
Typs
Type
Beschreibung
CONSTNAME
VARCHAR(128) NOT NULL
Name des constraint
TBCREATOR
CHAR(8) NOT NULL
Authorization ID des „table-owners“
TBNAME
VARCHAR(18) NOT NULL
Tabellenname auf die der „constraint“ zielt...
COLNAME
VARCHAR(18) NOT NULL
Name der Spalte
COLSEQ
SMALLINT NOT NULL
Position der Spalte im „key“
(erste Position = 1)
COLNO
SMALLINT NOT NULL
Position der Spalte in der Tabelle
IBMREQD
CHAR(1) NOT NULL
DEFAULT ‘N’
N
No
Y
Yes
24
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.2 CONSTRAINT- Informationen im Systemkatalog
Jan 2002
25
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3 Scrollable Cursor
•
Implizit über „temporary tables“ (Anwendungs-Scope),
d.h. Zugriff auf TEMPDB erforderlich
•
Zwei unterschiedliche Typen
1. Insensitive
Î Keine Verbindung zu Basis-Daten
2. Static Sensitive
Î Implizite Synchronisierung über RID und
Re-Evaluierung des WHERE ...
Jan 2002
•
Syntax-Erweiterungen für DECLARE und FETCH
•
Neue SQLCODE‘s beim Zugriff auf nicht(mehr)
existente „Cursor“-Daten
26
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.1 Scrollable Cursor Typen
Non-scrollable cursor-characteristics
• Zum Lesen eines „set of rows“ oder einem „result set“ einer „stored procedure“.
• Die „rows“ werden einzeln verarbeitet.
• Die „rows“ werden sequentiell „gefetched“
• „Result sets“ können in einer „workfile“ abgelegt werden
Scrollable cursor-characteristics
• Werden von einem AP zum Lesen eines „set of rows“ oderr einem „result set“ einer
„stored procedure genutzt
• Die „rows“ können „random“ „gefetched“ werden
• Die „rows“ können „forward“ oder „backward“ „gefetched“ sein.
• Die „rows“ können von einer „current position“ oder vom Anfang der „result table“
oder des „result set“ geholt werden
• Das „result set“ wird zum Zeitpunkt „OPEN CURSOR“ fixiert
• „Result sets“ werden in „Declared Temporary Tables“ (V6 Line Item) abge3lgt.
• „Results sets“ verschwinden zum Zeitpunkt „CLOSE CURSOR“
Jan 2002
27
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.1 Scrollable Cursor Typen
Insensitive scrollable cursor
• immer „static“
• Feste Anzahl „rows“
• Nutzung von „Declared temp tables“
Sensitive static scrollable cursor
•
•
•
•
immer „static“
Feste Anzahl „rows“
Nutzung von „Declared temp tables“
Sensitive auf Änderungen, aber nicht auf INSERT‘s
Sensitive dynamic scrollable cursor
• „direct table access“
• „live data access“
Jan 2002
28
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.1 Scrollable Cursor Typen
Updatability
•
das SELECT Statement des DECLARE CURSOR kann die Ursache dafür sein,
dass ein cursor „read-only“ ist – abhängig von den aktuellen „cursor rules“.
Non-scrollable and scrollable cursor-characteristics
• Das „result set“ kann sensitive gegen seine eigenen Änderungen sein
• Das „result set“ kann sensitive gegen fremde Änderungen sein
• Das „result set“ kann „updatable“ sein.
• Das „result set“ kann „fetched“, „updated“, oder „deleted“ werden
Jan 2002
29
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.1 Scrollable Cursor (Vergleich von Cursortypen)
Ein „cursor“ kann „read-only“ werden, wenn das SELECT-Statement mehr als eine
Tabelle oder GROUP BY etc. enthält
Jan 2002
30
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.2 Scrollable Cursor - Syntax
DECLARE cname
INSENSITIVE
SCROLL
STATIC SENSITIVE
CURSOR
Jan 2002
....
31
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.3 Öffnen eines „Scrollable Cursor“
DECLARE curs1 SENSITIVE SCROLL CURSOR
WITH HOLD FOR
SELECT
account, account_name, credit_limit
,
type
FROM
account
WHERE
account = :in_account
ACCOUNTACCOUNTTabelle
Tabelle
Jan 2002
.....
OPEN curs1 ....
Result Set
-DB2 erzeugt eine TEMP Tabelle
- der Zugriff ist „exklusiv“
- es existiert eine fixe Anzahl „rows“
- Tabelle wird zum Zeitpunkt
„CLOSE CURSOR“ gelöscht
- erfordert TEMP DB und
vordefinierte TS
RESULT
SET
FETCH...
32
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.3 Öffnen eines „Scrollable Cursor“
Schlüsselwort SCROLL
•
Definiert einen „scrollable“ Cursor
•
Bei OPEN CURSOR.... Wird eine temporäre Tabelle in der TEMP Datenbank
angelegt
•
Die TEMP DB wiederum ist von der DBA zur Verfügung zu stellen:
- CREATE DATABASE dbtemp01 AS TEMP STOGROUP gtdb2sms ;
CREATE TABLESPACE tstemp04 IN dbtemp01
USING STOGROUP gtdb2sms SEGSIZE 4 ;
CREATE TABLESPACE tstemp08 IN dbtemp01
USING STOGROUP gtdb2sms SEGSIZE 8 ;
CREATE TABLESPACE tstemp16 IN dbtemp01
USING STOGROUP gtdb2sms SEGSIZE 16;
CREATE TABLESPACE tstemp32 IN dbtemp01
USING STOGROUP gtdb2sms SEGSIZE 32 BUFFERPOOL BP32K;
•
Die bisher definierten CURSOR arbeiten unverändert in DB2V7 !!!
Jan 2002
33
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.4 Scrollable Cursor – (Cursordefinitionen)
• Read only cursor
• Not aware of updates
or deletes in base
table
• Updatable cursor
• Aware of own updates or
deletes within cursor
• Other changes to base
table not visible to cursor
• All inserts not recognized
Jan 2002
• Updatable cursor
• Aware of own updates and
deletes within cursor
• sees all committed updates and
deletes
• All inserts not recognized
34
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.4 Scrollable Cursor – Open Cursor
• Ergebnis wird beim OPEN CURSOR implizit in
temporäre Tabelle übertragen
• Nur sichtbar für diese AnwendungsInstanz (exklusiv)
• FETCH arbeitet gegen diese Kopie
• Anzahl Zeilen steht beim OPEN fest
und ändert sich nicht (!)
• Beim CLOSE wird temporäre Tabelle
automatisch gelöscht
Jan 2002
35
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.5 Scrollable Cursor - Syntax
FETCH
INSENSITIVE
SENSITIVE
NEXT / PRIOR / FIRST / LAST /
CURRENT /BEFORE / AFTER
ABSOLUTE
integer
RELATIVE
host-variable
*
*) Typ integer oder
DECIMAL (18,0)
cursorname
Jan 2002
36
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.6 Scrollable Cursor – FETCH
Ergebnismenge
Aktuelle Position
BEFORE
ABSOLUTE 0
FIRST
ABSOLUTE 1
PRIORT
CURRENT
NEXT
LAST
RELATIVE -1
RELATIVE 0
RELATIVE +1
ABSOLUTE -1
AFTER
Jan 2002
37
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.6 Scrollable Cursor – FETCH(Beispiele)
Absolute Cursorbewegung:
FETCH ... ABSOLUTE + 5 FROM curs1; oder
MOVE 5 TO cursor-position
FETCH ... ABSOLUTE :cursor-position FROM curs1
Relative Cursorbewegung:
FETCH ... RELATIVE - 5 FROM curs1; oder
MOVE -5 TO cursor-move
FETCH ... RELATIVE :cursor-move FROM curs1
FETCH ... NEXT FROM curs1;
Neue FETCH – „keywords“
Jan 2002
NEXT, PRIOR, FIRST, LAST, CURRENT,
BEFORE, AFTER, ABSOLUTE, RELATIVE
38
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.6 Scrollabe Cursor – Hinweise zum FETCH
BEFORE, AFTER
SQLCODE = 0, aber keine neuen Daten !
RELATIVE +/-99999999
Position „AFTER / BEFORE“ + SQLCODE 100
ABSOLUTE +- 9999999
CURRENT
SQLCODE –231, wenn nicht auf einer Datenzeile
ABSOLUTE –2 / -3
zulässig, entspricht vorletzte, drittletzte usw.
ABSOLUTE 0
gleicher Effekt wie BEFORE, aber SQLCODE +100
Jan 2002
39
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.7 Scrollable Cursor – INSENSITIVE vs. SENSITIVE STATIC
•
INSENSITIVE (scrollable) Cursor lassen keinen UPDATE zu
•
READ-ONLY Cursor sind immer INSENSITIVE (ggfs. Fehler bei BIND)
•
Komplettes Ergebnis bei OPEN CURSOR, externe Änderungen
(durch andere UOW) nicht sichtbar
•
STATIC SENSITIVE (scrollable) Cursor erlauben UPDATE und DELETE
•
INSERT ist auch bei SENSITIVE STATIC nicht zulässig
•
Datenänderungen werden synchronisiert über die RID
•
Ein SENSITIVE STATIC–Cursor kann INSENSITIVE ge-FETCHt werden
•
FETCH und UPDATE führt zur evtl. Re-Evaluierung der Where-Klausel
•
Das Result-SET ist „blind“ gegenüber Sätzen, die ausserhalb der
Anwendung eingefügt wurden
Jan 2002
40
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.8 Scrollable Cursor – Szenario 1
Update durch andere
UOW ?
OPEN STATIC SENSITIVE CURSOR
FETCH [ SENSITIVE ]
Neu Lesen
UPDATE WHERE CURRENT...
Vergleich Basis-Tabelle
mit Result-Set, evtl.
SQLCODE -224
Jan 2002
41
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.8 Scrollable Cursor – Szenario 2
Update durch andere
UOW ?
OPEN STATIC SENSITIVE CURSOR
FETCH INSENSITIVE
UPDATE WHERE CURRENT...
Vergleich Basis-Tabelle
mit Result-Set, evtl.
SQLCODE -224
Jan 2002
42
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.8 Scrollable Cursor – UPDATE und DELETE-Holes
Jan 2002
•
Durch DELETE-Operationen oder Änderungen von Feldern, die
in der WHERE-Bedingung angegeben waren, können sog.
„Holes“ im Result-Set entstehen. Diese werden mit SQLCODEs
-222 / - 223 signalisiert
•
HOLES können durch externe Änderungen (andere UOW) oder die
eigene Anwendung verursacht worden sein
•
Extern (durch andere UOW) verursachte HOLES werden sichtbar
• Beim FETCH SENSITIVE
• Spätestens bei einem eventuellen UPDATE
•
„Interne“ HOLES sind auch beim FETCH INSENSITIVE zu beachten
43
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.8 Scrollable Cursor – Szenario 3
Delete durch andere UOW
oder Update, so dass
WHERE des Cursors nicht
mehr erfüllt
OPEN STATIC SENSITIVE CURSOR
FETCH SENSITIVE
HOLE
UPDATE ...
HOLE
Hinweis: HOLES können auch durch eigene DELETEs / UPDATEs der Anwendung entstehen !
Jan 2002
44
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.8 Scrollable Cursor – Szenario 3 (UPDATE/DELETE Holes)
Jan 2002
45
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.8 Scrollable Cursor – INSENSITIVE „scrolling holes“
Jan 2002
46
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.8 Scrollable Cursor – SENSITIVE STATIC
•
UPDATE – Operationen werden immer im Result-Set und der
Basis-Tabelle abgebildet. Bei Nicht-Übereinstimmung der Zeile
wird die Operation mit SQLCODE abgewiesen
•
Ein FETCH SENSITIVE bedeutet, dass ggfs. beim LESEN
die Daten aus der Basis-Tabelle aktualisiert werden
•
Beim FETCH INSENSITIVE wird die Basis-Tabelle nicht
herangezogen, somit ist die Gefahr höher, dass externe
Änderungen bei folgendem UPDATE zu Fehler führen (Zeile nicht
mehr aktuell)
Jan 2002
47
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.9 Scrollable Cursor und die Auflösung von Funktionen
Jan 2002
48
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.10 Scrollable Cursor und Locking
•
Für Isolation Levels RR, RS, UR: unverändert, aber zu beachten:
alle Locks werden beim „OPEN CURSOR“ gesetzt
•
Für CS gilt „optimistic locking mechanism“
• Annahme: nur geringer Anteil gelesener Zeilen soll geändert werden
• Alle Locks werden nach OPEN CURSOR aufgegeben (!)
• Bei UPDATE (DELETE) wird Zeile ge-LOCKED, und durchläuft
die Evaluierung (Vergleich Result-Set <-> Basis-Tabelle)
• Hohe Concurrency möglich, sauberes Error-Handling im AP und
Anwendungsdesign sind unerlässlich
Jan 2002
49
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.10 Scrollable Cursor und Locking
Read Locks werden zum Zeitpunkt „OPEN CURSOR“ gesetzt
Jan 2002
50
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.10 Scrollable Cursor und Locking(optimistic)
Jan 2002
51
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.11 Scrollable Cursor in Stored Procedures
• Sind immer READ-ONLY
• Können aber dennoch STATIC SENSITIVE definiert werden
.
main()
{
EXEC SQL BEGIN DECLARE SECTION;
char hv_account[30];
char hv_acctname[30];
EXEC SQL END DECLARE SECTION;
.
EXEC SQL BEGIN DECLARE SECTION;
static volatile SQL TYPE IS
RESULT_SET_LOCATOR *CRTPROCS_rs_loc;
EXEC SQL END DECLARE SECTION;
.
EXEC SQL CALL SET_CURSOR_ACCOUNT_C1('P');
if (sqlca.sqlcode != 0) prt_sqlc();
.
.
.
EXEC SQL ASSOCIATE LOCATOR( :CRTPROCS_rs_loc )
WITH PROCEDURE PAOLOR2.CRTPROCS;
.
EXEC SQL ALLOCATE C1 CURSOR FOR
RESULT SET :CRTPROCS_rs_loc;
.
EXEC SQL FETCH C1 INTO
:hv_account,
:hv_account_name;
.
EXEC SQL CLOSE C1;
Jan 2002
#pragma linkage(cfunc, fetchable)
#include <stdlib.h>
void cfunc(char parm1[2])
{
EXEC SQL BEGIN DECLARE SECTION;
char hv_type[2];
EXEC SQL END DECLARE SECTION;
strcpy(parm1, hv_type);
EXEC SQL
DECLARE C1 INSENSITIVE SCROLL CURSOR
WITH HOLD WITH RETURN FOR
SELECT ACCOUNT, ACCOUNT_NAME
FROM ACCOUNT
WHERE TYPE = :hv_type
FOR UPDATE OF ACCOUNT_NAME;
EXEC SQL
OPEN C1;
}
Stored procedure
52
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.12 Scrollable Cursor und ODBC
• Drei neue Funktionen (ODBC-Commands)
• SQLFetchScroll
• SQLSetPos
• SQLBulkOperation
Positionieren und Lesen (mit
SQL_FETCH_NEXT, SQL_FETCH_PRIOR usw.)
Positionieren (mit
SQL_POSITION, SQL_REFRESH, usw.)
Updates für „bookmarked rows“(mit
SQL_ADD, SQL_UPDATE_BY_BOOKMARK usw.)
SQLRETURN SQLSetPos
Jan 2002
( SQLHSTMT
StatementHandle,
SQLUSMALLINT
RowNumber,
SQLUSMALLINT
Operation,
SQLSMALLINT
LockType );
53
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.3.13 Scrollable Cursor und „distributed processing“
• Optimieren des sogen. „blocking“, um den Datentransfer
zu minimieren. Blöcke werden weggelassen bei:
• Fetch-Orientierung ist reverse
• Fetch Sensitive ist erforderlich
• Das folgende Ziel für Fetch ist zu weit entfernt
• „multiple result sets“ werden unterstützt
• DRDA Support vorhanden, aber nicht für
• Private protocol
• Sogen. „hop sites“
Jan 2002
54
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
„Scrollable cursor“ sind erlaubt:
3
„static“ und „dynamic“
OS/390 compiled programs
3
compiled stored
procedures (inklusive „SQL
stored procedures“)
3
Jan 2002
ODBC
„Scrollable cursor“ sind nicht
erlaubt für:
2
2
2
2
SPUFI und QMF
REXX Programme
Java Programme
„client“ Programme mit
DB2 Connect
55
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.4 Row-Expressions
• Feldliste (COL1, COL2, ...) als Vergleichsoperator in
• IN-Listen
• „Basic Predicates“ (nur =, <>)
• Quantified Predicates (ANY / ALL)
• Syntaktische Einschränkungen
• IN-List Vergleichsoperator nur SELECT, keine Konstante
• Operatoren = und <> nicht mit SELECT (a,b) verwendbar
• Row-Expression nur vergleichbar mit
• = SOME / ANY
• <> ALL
• Prinzipiell immer „AND“-Verknüpfung
• SQLCODE –216, wenn Listen nicht „passen“
Jan 2002
56
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.4.1 Row-Expressions im Vergleich
SELECT
FROM
WHERE
AND
T1.CREATOR, T1.NAME
SYSIBM.SYSTABLES T1
T1.CREATOR NOT IN
( SELECT T2.TBCREATOR
FROM
SYSIBM.SYSINDEXES T2
WHERE
T2.TBCREATOR =
T1.CREATOR
AND
T2.TBNAME = T1.NAME)
T1.NAME NOT IN
( SELECT T2.TBNAME
FROM
SYSIBM.SYSINDEXES T2
WHERE T2.TBCREATOR =
T1.CREATOR
AND
T2.TBNAME = T1.NAME);
SELECT
FROM
WHERE
T1.CREATOR, T1.NAME
SYSIBM.SYSTABLES T1
(T1.CREATOR, T1.NAME) NOT IN
( SELECT T2.TBCREATOR, T2.TBNAME
FROM SYSIBM.SYSINDEXES T2
);
V6
V7
Dasselbe Resultat bei beiden Queries .....
Jan 2002
57
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.4.2 Row-Expressions - Beispiele
Select
NAME, COLTYPE
From
SYSIBM.SYSCOLUMNS
Where (TBCREATOR, TBNAME)
3
= ('SYSIBM', 'SYSTABLES')
Select
NAME, COLTYPE
From
SYSIBM.SYSCOLUMNS
Where (TBCREATOR, TBNAME)
2
2
2
IN ( ('SYSIBM', 'SYSTABLES'),
('SYSIBM', 'SYSINDEXES‚
'SYSINDEXES‚) )
select CREATOR, NAME
from SYSIBM.SYSTABLES
where TYPE = 'T'
and (CREATOR, NAME) NOT IN
(SELECT TBCREATOR,TBNAME
from SYSIBM.SYSINDEXES)
3
select LASTNAME from employee
where (WORKDEPT, EMPNO) = ANY
(SELECT DEPTNO, MGRNO FROM
department))
3
Jan 2002
Select
NAME, COLTYPE
From
SYSIBM.SYSCOLUMNS
Where (TBCREATOR, TBNAME)
>= ('SYSIBM', 'SYSTABLES')
select LASTNAME from employee
where (WORKDEPT, EMPNO)
= ALL
(SELECT DEPTNO, MGRNO FROM
department))
58
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.5 Limitierter FETCH
fullselect
SELECT
FROM
WHERE
Jan 2002
FETCH
T1.ACCOUNT, T1.ACCOUNT_NAME,
T1.TYPE,
T1.CREDIT_LIMIT
ACCOUNT T1
T1.ACCOUNT =
( SELECT
MIN(T2.ACCOUNT)
FROM
ACCOUNT T2
);
1
integer
EXEC SQL
SELECT
FROM
WHERE
FETCH
ROW/ROWS ONLY
ACCOUNT, ACCOUNT_NAME, TYPE,
CREDIT_LIMIT
INTO
:hv_account,
:hv_acctname,
:hv_type,
:hv_crdlmt
ACCOUNT
ACOCUNT_NAME = :hv_in_acctname
1 ROW ONLY;
59
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.5 FETCH FIRST
fullselect
•
•
•
•
FETCH FIRST
1
integer
ROW/ROWS ONLY
integer kann in Anwendungsprogrammen auch Host-Variable sein
(wirkt beim OPEN CURSOR)
Implizit wird auch „OPTIMIZE FOR n ROWS“ angenommen
Vermeidung von SQLCODE –811 bzw. CURSOR-Konstruktion
bei SELECT INTO
Vereinfachung für Abfragen „grösster“, „kleinster“ :
select *
where
from employee
salary =
(select max(salary)
from employee)
select *
from employee
order by
salary desc
fetch first row only
! Vorsicht, wenn max/min mehr als einmal vorkommt !
Jan 2002
60
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.6 SELF-REFERENCING UPDATE / DELETE
-118
-118
•
THE
THEOBJECT
OBJECTTABLE
TABLEOR
ORVIEW
VIEWOF
OFTHE
THEDELETE
DELETEOR
OR
UPDATE
STATEMENT
IS
ALSO
IDENTIFIED
IN
A
FROM
UPDATE STATEMENT IS ALSO IDENTIFIED IN A FROM
CLAUSE
CLAUSE
•
Bisherige Restriktion entfällt: WHERE Bedingung kann eine subquery
enthalten, die sich auf die zu ändernde Tabelle bezieht
Ausnahme: „positioned update/delete“ (CURSOR + WHERE CURRENT OF)
•
Non-correlated subquery: einmalige Evaluierung der Bedingung
•
Correlated subquery: RID-Liste und Spaltenwerte
werden vor UPDATE/DELETE in einer „workfile“ gespeichert
Jan 2002
61
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.6 SELF-REFERENCING UPDATE / DELETE
UPDATE
UPDATE
WHERE
WHERE
ACCOUNT
ACCOUNT
SET
SETCREDIT_LIMIT
CREDIT_LIMIT==CREDIT_LIMIT
CREDIT_LIMIT**1.1
1.1
CREDIT_LIMIT
<
(
AVG(CREDIT_LIMIT
CREDIT_LIMIT
< (SELECT
SELECT
AVG(CREDIT_LIMIT))
FROM
ACCOUNT)
FROM
ACCOUNT)
DELETE
DELETEFROM
FROMGOLD
GOLDT1
T1
WHERE
EXISTS
(
SELECT
WHERE EXISTS ( SELECT**
FROM
ACCOUNT
FROM
ACCOUNTT2
T2
WHERE
T2.CREDIT_LIMIT
<
(SELECT
WHERE T2.CREDIT_LIMIT < (SELECT
FROM
FROM
WHERE
WHERE
AND
ANDT2.ACCOUNT
T2.ACCOUNT==T1.ACCOUNT)
T1.ACCOUNT)
Vor
Vor
V7
V7
Jan 2002
SUM(T3.AMOUNT)
SUM(T3.AMOUNT)
GOLD
GOLDT3
T3
T3.ACCOUNT
T3.ACCOUNT==
T1.ACCOUNT)
T1.ACCOUNT)
DSNT408I
DSNT408I SQLCODE
SQLCODE==-118,
-118,ERROR:
ERROR:THE
THEOBJECT
OBJECTTABLE
TABLEOR
ORVIEW
VIEWOF
OFTHE
THE
DELETE
OR
UPDATE
STATEMENT
IS
ALSO
IDENTIFIED
IN
A
FROM
DELETE
OR UPDATE STATEMENT IS ALSO IDENTIFIED IN A FROMCLAUSE
CLAUSE
DSNT418I
DSNT418I SQLSTATE
SQLSTATE==42902
42902SQLSTATE
SQLSTATERETURN
RETURNCODE
CODE
62
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.6 SELF-REFERENCING UPDATE / DELETE(Restriktionen)
•
Positioned UPDATE/DELETE: SQLCODE –118 erfolgt beim BIND wenn die WHEREKlausel die Tabelle für den Update enthält oder aber „rows“ für den DELETE referenziert.
EXEC
EXECSQL
SQL
..
EXEC
EXECSQL
SQL
..
..
EXEC
EXECSQL
SQL
..
..
EXEC
EXECSQL
SQL
Jan 2002
DECLARE
DECLARECURSOR
CURSORC1
C1CURSOR
CURSORFOR
FOR
SELECT
T1.ACCOUNT,
T1.ACCOUNT_NAME,
SELECT T1.ACCOUNT, T1.ACCOUNT_NAME,T1.CREDIT_LIMIT
T1.CREDIT_LIMIT
FROM
ACCOUNT
T1
FROM
ACCOUNT T1
WHERE
AVG
WHERE T1.CREDIT_LIMIT
T1.CREDIT_LIMIT << (SELECT
(SELECT
AVG(T2.CREDIT_LIMT)
(T2.CREDIT_LIMT)
FROM
ACCOUNT
FROM
ACCOUNTT2)
T2)
FOR
UPDATE
OF
T1.CREDIT_LIMIT;
FOR UPDATE OF T1.CREDIT_LIMIT;
OPEN
OPENC1;
C1;
FETCH
FETCHC1
C1INTO
INTO:hv_account,
:hv_account,:hv_acctname,
:hv_acctname,:hv_crdlmt;
:hv_crdlmt;
UPDATE
UPDATE
SET
SET
WHERE
WHERE
ACCOUNT
ACCOUNT
CREDIT_LIMIT
CREDIT_LIMIT==CREDIT_LIMIT
CREDIT_LIMIT**1.1
1.1
CURRENT
OF
C1;
CURRENT OF C1;
63
1.
-Funktionen -- Spracherweiterungen
1. Neue
Neue Basis
Basis-Funktionen
Spracherweiterungen
1.1 UNION „everywhere“
1.2 CONSTRAINT – Verbesserungen
1.3 Scrollable Cursor
1.4 Row-Expressions
1.5 Limitierter FETCH
1.6 SELF-REFERENCING UPDATE / DELETE
Jan 2002
64
Herunterladen