SQL Folien
SQL Folien
Praktikum:
Datenbankprogrammierung
in
SQL/O RACLE
Mit Beiträgen von Erik Behrends, Rainer Himmeröder, Marco Koch, Heiko Oberdiek.
0.0 1
Praktikum: Datenbankprogrammierung in SQL/ORACLE
0.0 Einführung 2
Praktikum: Datenbankprogrammierung in SQL/ORACLE
D ISKURSWELT: M ONDIAL
• Kontinente
– Wirtschaft
– Bevölkerung • Flüsse
– Sprachen • Seen
– Religionen • Meere
– Ethn. Gruppen • Inseln
• Länder • Berge
• Landesteile • Wüsten
• Städte
• CIA World Factbook • Organisationen
• “Global Statistics”: Länder, Landesteile, Städte
• 1987: Grundidee und Teile der TERRA-Datenbasis des Instituts für Programmstrukturen
und, Datenorganisation der Universität Karlsruhe,
• . . . einige weitere WWW-Seiten,
• Datenintegration mit FLORID in Freiburg, 1998.
• Ergänzungen in 2009.
0.0 Einführung 3
Praktikum: Datenbankprogrammierung in SQL/ORACLE
TEIL I: Grundlagen
Teil I: Grundlagen
• ER-Modell und relationales Datenmodell
• Umsetzung in ein Datenbankschema: CREATE TABLE
• Anfragen: SELECT – FROM – WHERE
• Arbeiten mit der Datenbank: DELETE, UPDATE
0.0 Einführung 4
Praktikum: Datenbankprogrammierung in SQL/ORACLE
Kapitel 1
Semantische Modellierung
E NTITY -R ELATIONSHIP -M ODELL (C HEN , 1976)
1.0 ER-Modell 5
Praktikum: Datenbankprogrammierung in SQL/ORACLE
is_capital
belongs to is_capital
borders
1.0 ER-Modell 6
Praktikum: Datenbankprogrammierung in SQL/ORACLE
E NTITIES
Entitätstyp ist durch ein Paar (E, {A1 , . . . , An }) gegeben, wobei E der Name und
{A1 , . . . , An }, n ≥ 0, die Menge der Attribute des Typs ist.
Attribut: Relevante Eigenschaft der Entitäten eines Typs. Jedes Attribut kann Werte aus
einem bestimmten Wertebereich (domain) annehmen.
Entität: besitzt zu jedem Attribut ihres Entitätstyps E einen Wert.
Schlüsselattribute: Ein Schlüssel ist eine Menge von Attributen eines Entitätstyps, deren
Werte zusammen eine eindeutige Identifizierung der Entitäten eines Zustands
gewährleisten soll (siehe auch Schlüsselkandidaten, Primärschlüssel).
1.0 ER-Modell 7
Praktikum: Datenbankprogrammierung in SQL/ORACLE
E NTITIES :
Germany
356910 D
area name
code
1.0 ER-Modell 8
Praktikum: Datenbankprogrammierung in SQL/ORACLE
B EZIEHUNGEN
Beziehungstyp: Menge gleichartiger Beziehungen zwischen Entitäten; ein Beziehungstyp ist
durch ein Tripel (B, {RO1 : E1 , . . . , ROk : Ek }, {A1 , . . . , An }) gegeben, wobei B der Name,
{RO1 , . . . , ROk }, k ≥ 2, die Menge der sog. Rollen, {E1 , . . . , Ek } die den Rollen
zugeordnete Entitätstypen, und {A1 , . . . , An }, n ≥ 0, die Menge der Attribute des Typs sind.
Rollen sind paarweise verschieden - die ihnen zugeordneten Entitätstypen nicht
notwendigerweise. Falls Ei = Ej für i 6= j, so liegt eine rekursive Beziehung vor.
Attribut: Relevante Eigenschaft der Beziehungen eines Typs.
Beziehung: eines Beziehungstyps B ist definiert durch die beteiligten Entitäten gemäß den B
zugeordneten Rollen; zu jeder Rolle existiert genau eine Entität und zu jedem Attribut von
B genau ein Wert.
1.0 ER-Modell 9
Praktikum: Datenbankprogrammierung in SQL/ORACLE
B EZIEHUNGEN
City in Country
Freiburg Germany
attributierte Beziehung
Europe Russia
percent
Beziehung mit Rollen 20
Berlin Germany
rekursive Beziehung (nicht symmetrisch, mit Rollen)
main river
River flowsInto
tributary river
Rhein, Main
1.0 ER-Modell 10
Praktikum: Datenbankprogrammierung in SQL/ORACLE
B EZIEHUNGSKOMPLEXITÄTEN
Jedem Beziehungstyp ist eine Beziehungskomplexität zugeordnet, die die Mindest- und
Maximalzahl von Beziehungen ausgedrückt, in denen eine Entität eines Typs unter einer
bestimmten Rolle in einem Zustand beteiligt sein darf.
Ein Komplexitätsgrad eines Beziehungstyps B bzgl. einer seiner Rollen RO ist ein Ausdruck
der Form (min, max).
Eine Menge b von Beziehungen erfüllt den Komplexitätsgrad (min, max) einer Rolle RO, wenn
für jedes e des entsprechenden Entity-Typs gilt: es existieren mindestens min und maximal
max Beziehungen in b, in denen e unter der Rolle RO auftritt.
1.0 ER-Modell 11
Praktikum: Datenbankprogrammierung in SQL/ORACLE
B EZIEHUNGEN
is_capital
belongs to is_capital
< 1, 1 >
< 1, ∗ >
borders
1.0 ER-Modell 12
Praktikum: Datenbankprogrammierung in SQL/ORACLE
S CHWACHE E NTITÄTSTYPEN
area pop.
248678 61170500
Ein schwacher Entitätstyp ist ein Entitätstyp name Country code
ohne Schlüssel. BRD D
ent_4711 pop.
< 0, ∗ >
1.0 ER-Modell 13
Praktikum: Datenbankprogrammierung in SQL/ORACLE
AGGREGATION
Ein Fluss mündet in ein Meer/See/Fluss; genauer kann dieser Punkt durch die Angabe eines
oder zweier Länder beschrieben werden.
Die “einfache” Modellierung als dreistellige Beziehung ist wegen den Kardinalitäten nicht
adäquat:
river < 0, n > flows into < 0, n > sea
< 0, n >
Country
Mündung
river < 0, 1 >
flows into < 0, n > sea
< 1, 2 >
in
< 0, ∗ >
Country
1.0 ER-Modell 14
Praktikum: Datenbankprogrammierung in SQL/ORACLE
G ENERALISIERUNG /S PEZIALISIERUNG
• Generalisierung: Flüsse, Seen und Meere bilden die Menge der Gewässer. Diesen können
z.B. mit Städten in einer liegt-an-Beziehung stehen:
1.0 ER-Modell 15
Praktikum: Datenbankprogrammierung in SQL/ORACLE
G ENERALISIERUNG /S PEZIALISIERUNG :
• Spezialisierung: M ONDIAL enthält nicht alle geographischen Merkmale, sondern nur
Flüsse, Seen, Meere, Berge, Wüsten und Inseln (keine Tiefländer, Hochebenen,
Steppengebiete, Moore etc). Allen geo-Merkmalen gemeinsam ist, dass sie in einer
in-Beziehung zu Landesteilen stehen:
1.0 ER-Modell 16
Praktikum: Datenbankprogrammierung in SQL/ORACLE
Kapitel 2
Das Relationale Modell
A BBILDUNG ERM IN RM
Seien EER ein Entitätstyp und BER ein Beziehungstyp im ERM.
1. Entitätstypen: (EER , {A1 , . . . , An }) −→ E(A1 , . . . , An ),
2. Beziehungstypen:
(BER , {RO1 : E1 , . . . , ROk : Ek }, {A1 , . . . , Am }) −→
B(E1 _K11 , . . . , E1 _K1p1 , . . . ,
Ek _Kk1 , . . . , Ek _Kkpk , A1 , . . . , Am ) ,
wobei {Ki1 , . . . , Kipi } Primärschlüssel von Ei , 1 ≤ i ≤ k.
Falls BER Rollenbezeichnungen enthält, so wird durch die Hinzunahme der
Rollenbezeichnung die Eindeutigkeit der Schlüsselattribute im jeweiligen Beziehungstyp
erreicht.
Für k = 2 können im Falle einer (1,1)-Beziehungskomplexität das Relationsschema des
Beziehungstyps und das Schema des Entitätstyps zusammengefasst werden.
3. Für einen schwachen Entitätstyp müssen die Schlüsselattribute des identifizierenden
Entitätstyps hinzugenommen werden.
4. Aggregattypen können unberücksichtigt bleiben, sofern der betreffende Beziehungstyp
berücksichtigt wurde.
E NTITÄTSTYPEN
Continent
Name Area
VARCHAR2(20) NUMBER
Europe 9562489.6
Africa 3.02547e+07
Asia 4.50953e+07
America 3.9872e+07
Australia 8503474.56
S CHWACHE E NTITÄTSTYPEN
Für einen schwachen Entitätstyp müssen die Schlüsselattribute des identifizierenden Entitätstyps
hinzugenommen werden.
area pop.
248678 61170500
name Country code
BRD D
ent_4711
< 0, ∗ > pop.
10272069
City
in area Province name
35751 Baden-W. Name Country Province Population ...
ent_1997
< 0, ∗ >
Freiburg D Baden-W. 198496 ..
< 1, 1 >
in Prov. Berlin D Berlin 3472009 ..
< 1, 1 >
.. .. .. .. ..
B EZIEHUNGSTYPEN
encompasses
Europe R
Country Continent Percent
name code
VARCHAR2(4) VARCHAR2(20) NUMBER
continent encompasses Country R Europe 20
R Asia 80
percent
D Europe 100
20
... ... ...
B EZIEHUNGSTYPEN
B EZIEHUNGSTYPEN
Falls BER Rollenbezeichnungen enthält, so werden diese als Name der entsprechenden
(Fremdschlüssel)attribute gewählt:
sublanguage
sublang suplang
English Germanic
Kapitel 3
SQL = Structured Query Language
• Standard-Anfragesprache
• Standardisierung:
SQL-89, SQL-92 (SQL2), SQL:1999 (SQL3), SQL:2003
• SQL2 in 3 Stufen eingeführt (entry, intermediate und full level).
• SQL3: Objektorientierung
• SQL:2003: XML
• deskriptive Anfragesprache
• Ergebnisse immer Mengen von Tupeln (Relationen)
• Implementierungen: ORACLE (im Praktikum), IBM DB2, Microsoft SQL Server,
PostgreSQL, MySQL, etc.
3.0 SQL 25
Praktikum: Datenbankprogrammierung in SQL/ORACLE
AUFBAU
Datenbanksprache:
DDL: Data Definition Language zur Definition der Schemata
• Tabellen
• Sichten
• Indexe
• Integritätsbedingungen
DML: Data Manipulation Language zur Verarbeitung von DB-Zuständen
• Suchen
• Einfügen
• Verändern
• Löschen
Data Dictionary: Enthält Metadaten über die Datenbank.
(in Tabellen; Anfragen daran werden auch mit der DML gestellt)
... inzwischen gehen SQL-Systeme weit über diese Dinge hinaus.
3.0 SQL 26
Praktikum: Datenbankprogrammierung in SQL/ORACLE
DATA D ICTIONARY
ALL_OBJECTS: Enthält alle Objekte, die einem Benutzer zugänglich sind.
ALL_CATALOG: Enthält alle Tabellen, Views und Synonyme, die einem Benutzer zugänglich sind.
ALL_TABLES: Enthält alle Tabellen, die einem Benutzer zugänglich sind.
Analog für diverse andere Dinge (select * from ALL_CATALOG where TABLE_NAME LIKE
’ALL%’;).
USER_OBJECTS: Enthält alle Objekte, die einem Benutzer gehören.
Analog für die anderen, meistens existieren für USER_... auch Abkürzungen, etwa OBJ für
USER_OBJECTS, TABS für USER_TABLES.
ALL_USERS: Enthält Informationen über alle Benutzer der Datenbank.
Jede der Tabellen besitzt mehrere Spalten, die spezifische Informationen über die jeweiligen
Objekte enthalten.
Die Definition einzelner Tabellen und Views wird mit DESCRIBE ‹table› oder kurz DESC
‹table› abgefragt:
DESC City;
Gebe zu jeder Stadt ihren Namen und das Land, in dem sie liegt, aus.
SELECT Name, Country
FROM City;
Name COUNTRY
Tokyo J
Stockholm S
Warsaw PL
Cochabamba BOL
Hamburg D
Berlin D
.. ..
DISTINCT
D UPLIKATELIMINIERUNG
• Duplikateliminierung nicht automatisch:
– Duplikateliminierung teuer (Sortieren + Eliminieren)
– Nutzer will Duplikate sehen
– später: Aggregatfunktionen auf Relationen mit Duplikaten
• Duplikateliminierung: DISTINCT-Klausel
• später: Duplikateliminierung automatisch bei Anwendung der Mengenoperatoren UNION,
INTERSECT, ...
Beispiel:
Beispiel:
Beispiel:
ORDER BY
Name Density
Western Sahara ,836958647
Mongolia 1,59528243
French Guiana 1,6613956
Namibia 2,03199228
Mauritania 2,26646745
Australia 2,37559768
AGGREGATFUNKTIONEN
• COUNT (*| [DISTINCT] ‹attribute›)
• MAX (‹attribute›)
• MIN (‹attribute›)
• SUM ([DISTINCT] ‹attribute›)
• AVG ([DISTINCT] ‹attribute›)
Beispiel: Ermittle die Anzahl der in der DB abgespeicherten Städte.
3.2 Aggregatfunktionen 41
Praktikum: Datenbankprogrammierung in SQL/ORACLE
AGGREGATFUNKTIONEN
Beispiel: Ermittle die Gesamtsumme aller Einwohner von Städten Österreichs sowie die
Einwohnerzahl der größten Stadt Österreichs.
Und was ist, wenn man diese Werte für jedes Land haben will??
3.2 Aggregatfunktionen 42
Praktikum: Datenbankprogrammierung in SQL/ORACLE
G RUPPIERUNG
GROUP BY berechnet für jede Gruppe eine Zeile, die Daten enthalten kann, die mit Hilfe der
Aggregatfunktionen über mehrere Zeilen berechnet werden.
SELECT ‹expr-list›
FROM ‹table›
WHERE ‹predicate›
GROUP BY ‹attr-list›;
gibt für jeden Wert von ‹attr-list› eine Zeile aus. Damit darf ‹expr-list› nur
• Konstanten,
• Attribute aus ‹attr-list›,
• Attribute, die für jede solche Gruppe nur einen Wert annehmen (etwa Code, wenn
‹attr-list› Country ist),
• Aggregatfunktionen, die dann über alle Tupels in der entsprechenden Gruppe gebildet
werden,
enthalten.
Die WHERE-Klausel ‹predicate› enthält dabei nur Attribute der Relationen in ‹table› (also
keine Aggregatfunktionen).
3.2 Gruppierung 43
Praktikum: Datenbankprogrammierung in SQL/ORACLE
G RUPPIERUNG
Beispiel: Gesucht sei für jedes Land die Gesamtzahl der Einwohner, die in den gespeicherten
Städten leben.
3.2 Gruppierung 44
Praktikum: Datenbankprogrammierung in SQL/ORACLE
B EDINGUNGEN AN G RUPPIERUNGEN
Die HAVING-Klausel ermöglicht es, Bedingungen an die durch GROUP BY gebildeten Gruppen zu
formulieren:
SELECT ‹expr-list›
FROM ‹table›
WHERE ‹predicate1›
GROUP BY ‹attr-list›
HAVING ‹predicate2›;
• WHERE-Klausel: Bedingungen an einzelne Tupel bevor gruppiert wird,
• HAVING-Klausel: Bedingungen, nach denen die Gruppen zur Ausgabe ausgewählt werden.
In der HAVING-Klausel dürfen neben Aggregatfunktionen nur Attribute vorkommen, die
explizit in der GROUP BY-Klausel aufgeführt wurden.
3.2 Gruppierung 45
Praktikum: Datenbankprogrammierung in SQL/ORACLE
B EDINGUNGEN AN G RUPPIERUNGEN
Beispiel: Gesucht ist für jedes Land die Gesamtzahl der Einwohner, die in den gespeicherten
Städten mit mehr als 10000 Einwohnern leben. Es sollen nur solche Länder ausgegeben
werden, bei denen diese Summe größer als zehn Millionen ist.
3.2 Gruppierung 46
Praktikum: Datenbankprogrammierung in SQL/ORACLE
G ESCHACHTELTE AGGREGATIONSOPERATOREN
3.2 Gruppierung 47
Praktikum: Datenbankprogrammierung in SQL/ORACLE
Geschachtelte Aggregationsoperatoren
• Oracle:
SELECT organization, COUNT(*) Organization COUNT(*)
FROM ismember
UPU 226
GROUP BY organization
HAVING COUNT(*) = ( SELECT max(count(*))
FROM ismember
GROUP by organization );
3.2 Gruppierung 48
Praktikum: Datenbankprogrammierung in SQL/ORACLE
M ENGENOPERATIONEN
3.2 Mengenoperationen 49
Praktikum: Datenbankprogrammierung in SQL/ORACLE
3.3 Join-Anfragen
Eine Möglichkeit, mehrere Relationen in eine Anfrage einzubeziehen, sind Join-Anfragen.
SELECT <attr-list›
FROM ‹table-list›
WHERE ‹predicate›;
Prinzipiell kann man sich einen Join als kartesisches Produkt der beteiligten Relationen
vorstellen (Theorie: siehe Vorlesung).
• Attributmenge: Vereinigung aller Attribute
• ggf. durch ‹table›.‹attr› qualifiziert.
• Join “mit sich selbst” – Aliase.
3.3 Join-Anfragen 50
Praktikum: Datenbankprogrammierung in SQL/ORACLE
Join-Anfragen
3.3 Join-Anfragen 51
Praktikum: Datenbankprogrammierung in SQL/ORACLE
E QUIJOIN
Beispiel: Es soll für jede politische Organisation festgestellt werden, in welchem Erdteil sie
ihren Sitz hat.
encompasses: Country, Continent, Percentage.
Organization: Abbreviation, Name, City, Country, Province.
3.3 Join-Anfragen 52
Praktikum: Datenbankprogrammierung in SQL/ORACLE
3.3 Join-Anfragen 53
Praktikum: Datenbankprogrammierung in SQL/ORACLE
3.3 Join-Anfragen 54
Praktikum: Datenbankprogrammierung in SQL/ORACLE
3.3 Join-Anfragen 55
Praktikum: Datenbankprogrammierung in SQL/ORACLE
• äußeres Join:
SELECT ...
FROM ‹table_1›
[LEFT | RIGHT | FULL] OUTER JOIN ‹table_2›
ON ‹conditions›
WHERE ‹more conditions›
SELECT [Link], [Link]
FROM river r FULL OUTER JOIN lake l
ON [Link] = [Link];
deutlich kürzer und klarer als SFW mit UNION um das Outer Join zu umschreiben.
3.3 Join-Anfragen 56
Praktikum: Datenbankprogrammierung in SQL/ORACLE
3.4 Subqueries
In der WHERE-Klausel können Ergebnisse von Unterabfragen verwendet werden:
SELECT ‹attr-list›
FROM ‹table›
WHERE ‹attribute› ‹op› [ANY|ALL] ‹subquery›;
SELECT ‹attr-list›
FROM ‹table›
WHERE ‹attribute› IN ‹subquery›;
• ‹subquery› ist eine SELECT-Anfrage (Subquery),
• für ‹op› ∈ {=, <, >, <=, >=} muss ‹subquery› eine einspaltige Ergebnisrelation liefern,
mit deren Werten der Wert von ‹attribute› verglichen wird.
• für IN ‹subquery› sind auch mehrspaltige Ergebnisrelationen erlaubt.
• für ‹op› ohne ANY oder ALL muss das Ergebnis von ‹subquery› einzeilig sein.
3.4 Subqueries 57
Praktikum: Datenbankprogrammierung in SQL/ORACLE
U NKORRELIERTE S UBQUERIES
• unabhängig von den Werten des in der umgebenden Anfrage verarbeiteten Tupels,
• wird vor der umgebenden Anfrage einmal ausgewertet,
• das Ergebnis wird bei der Auswertung der WHERE-Klausel der äußeren Anfrage verwendet,
• streng sequentielle Auswertung, daher ist eine Qualifizierung mehrfach vorkommender
Attribute nicht erforderlich.
3.4 Subqueries 58
Praktikum: Datenbankprogrammierung in SQL/ORACLE
U NKORRELIERTE S UBQUERIES
3.4 Subqueries 59
Praktikum: Datenbankprogrammierung in SQL/ORACLE
(mehrspaltige (Fremd)Schlüssel)
Beispiel: Alle Städte, von denen bekannt ist, dass sie an einem Gewässer liegen:
3.4 Subqueries 60
Praktikum: Datenbankprogrammierung in SQL/ORACLE
Beispiel: ALL ist z.B. dazu geeignet, wenn man alle Länder bestimmen will, die kleiner als alle
Staaten sind, die mehr als 10 Millionen Einwohner haben:
3.4 Subqueries 61
Praktikum: Datenbankprogrammierung in SQL/ORACLE
KORRELIERTE S UBQUERY
• Subquery ist von Attributwerten des gerade von der umgebenden Anfrage verarbeiteten
Tupels abhängig,
• wird für jedes Tupel der umgebenden Anfrage einmal ausgewertet,
• Qualifizierung der importierten Attribute erforderlich.
Beispiel: Es sollen alle Städte bestimmt werden, in denen mehr als ein Viertel der Bevölkerung
des jeweiligen Landes wohnt.
3.4 Subqueries 62
Praktikum: Datenbankprogrammierung in SQL/ORACLE
D ER EXISTS-O PERATOR
3.4 Subqueries 63
Praktikum: Datenbankprogrammierung in SQL/ORACLE
SELECT Name
FROM Country
WHERE Code IN
( SELECT Country
FROM City
WHERE [Link] > 1000000);
3.4 Subqueries 64
Praktikum: Datenbankprogrammierung in SQL/ORACLE
Beispiel: Gesucht seien diejenigen Länder, für die keine Städte mit mehr als einer Million
Einwohnern in der Datenbasis abgespeichert sind.
SELECT Name
FROM Country
WHERE NOT EXISTS
( SELECT *
FROM City
WHERE Population > 1000000
AND [Link] = [Link]) ;
Eine äquivalente Anfrage ohne Subquery müsste mit MINUS und einem der obigen gebildet
werden.
(vgl. Umformungen in relationale Algebra)
3.4 Subqueries 65
Praktikum: Datenbankprogrammierung in SQL/ORACLE
SELECT ‹attr-list›
FROM ‹table/subquery-list›
WHERE ‹condition›;
Tabellen oder Werte, die auf unterschiedliche Weise zusammengestellt oder berechnet werden,
können in Beziehung zueinander gestellt werden.
Hinweis: dies ist (neben dem Mengenoperatoren UNION, INTERSECT und MINUS/EXCEPT)
die einzige Form, in der Subqueries in der relationalen Algebra verwendet werden können – als
Teilterme.
3.4 Subqueries 66
Praktikum: Datenbankprogrammierung in SQL/ORACLE
3.4 Subqueries 67
Praktikum: Datenbankprogrammierung in SQL/ORACLE
Beispiel: Berechnen Sie die Anzahl der Menschen, die in der größten Stadt ihres Landes
leben.
3.4 Subqueries 68
Praktikum: Datenbankprogrammierung in SQL/ORACLE
3.4 Subqueries 69
Praktikum: Datenbankprogrammierung in SQL/ORACLE
... eine Subquery, die einen einzelnen Wert ergibt, kann auch statt einer Konstanten in der
SELECT-Zeile stehen:
(die einelementige Dummy-Tabelle “dual” kann man immer nehmen, wenn man eigentlich keine
FROM-Zeile benötigen würde)
Beispiel: Gesucht ist die Zahl der Menschen, die nicht in den gespeicherten Städten leben.
3.4 Subqueries 70
Praktikum: Datenbankprogrammierung in SQL/ORACLE
N ULLWERTE
• Wert ist nicht vorhanden, nicht bekannt, nicht definiert,
• Tatsächliche Bedeutung ist anwendungsabhängig,
• Abfrage: WHERE ... IS [NOT] NULL
SELECT * FROM City WHERE population IS NULL;
• Nullwerte erfüllen keine (Vergleichs)bedingungen (insbesondere auch keine
Join-Gleicheitsbedingung):
SELECT [Link], [Link], [Link]
FROM City c1, City c2
WHERE [Link] = [Link]
AND [Link] <> [Link] ORDER BY 3;
• Nullwerte werden bei ORDER BY als größte Werte angesehen. Mit NULLS LAST|FIRST
kann man dies (passend zu ASC|DESC) beeinflussen:
SELECT name, population FROM city
ORDER BY population [ASC|DESC] [NULLS LAST|FIRST];
Nullwerte (Cont’d)
Example
select country,
count(case when population >= 1000000 then 1 end) as big,
count(case when population between 100000 and 999999
then 1 end) as medium,
count(case when population < 100000 then 1 end) as small
from city
group by country
Auswertungsplan
• Abfolge interner algebraischer Operatoren (auf einer niedrigeren Ebene als die relationale
Algebra; vgl. DB-Vorlesungsabschitt zu Join-Algorithmen):
– table full scan
– table index lookup (select * from country where code=’D’)
– full join
– hash join
– merge join
– index-based join
– etc.
AUSWERTUNGSPLAN ANSCHAUEN
• SQL Developer: Anfrage angeben und auf das 3. oder 4. Icon (Autotrace, Explain Plan)
klicken. Stellt das Ergebnis in Tabellenform mit Schritten und erwarteten Kosten dar.
• sqlplus: SET AUTOTRACE ON.
Danach wird nach jedem Anfrageergebnis der Auswertungsplan angegeben.
• sqlplus: explain plan for select ... from ... where ...
schreibt den Auswertungsplan in eine interne Tabelle:
select substr (lpad(’ ’, level-1) || operation ||
’ (’ || options || ’)’,1,30 ) as "Operation",
object_name as "Object",
cost, bytes, cardinality as "Rows", time
from plan_table
start with id = 0
connect by prior id=parent_id;
[Filename: PLSQL/[Link]]
• vor dem nächsten EXPLAIN PLAN sollte man
DELETE FROM PLAN_TABLE
machen.
Kapitel 4
Schema-Definition
• das Datenbankschema umfasst alle Informationen über die Struktur der Datenbank,
• Tabellen, Views, Constraints, Indexe, Cluster, Trigger ...
• objektrelationale DB: Datentypen, ggf. Methoden
• wird mit Hilfe der DDL (Data Definition Language) manipuliert,
• CREATE, ALTER und DROP von Schemaobjekten,
• Vergabe von Zugriffsrechten: GRANT.
4.0 Schema-Definition 81
Praktikum: Datenbankprogrammierung in SQL/ORACLE
4.0 Schema-Definition 82
Praktikum: Datenbankprogrammierung in SQL/ORACLE
TABELLENDEFINITION
Das folgende SQL-Statement erzeugt z.B. die Relation City (noch ohne
Integritätsbedingungen):
CREATE TABLE City
( Name VARCHAR2(50),
Country VARCHAR2(4),
Province VARCHAR2(50),
Population NUMBER,
Latitude NUMBER,
Longitude NUMBER );
Die so erzeugten Tabellen- und Spaltennamen sind case-insensitive.
4.0 Schema-Definition 83
Praktikum: Datenbankprogrammierung in SQL/ORACLE
TABELLENDEFINITION
Falls man case-sensitive Spaltennamen benötigt, kann man dies mit doppelten
Anführungszeichen erreichen:
CREATE TABLE "Bla"
("a" NUMBER,
"A" NUMBER);
desc "Bla";
insert into "Bla" values(1,2);
select "a" from "Bla"; -> 1
select "A" from "Bla"; -> 2
select a from "Bla"; -> 2(!) Default ist CAPITALS (siehe auch alle Ausgaben
von Anfragen an das Data Dictionary)
4.0 Schema-Definition 84
Praktikum: Datenbankprogrammierung in SQL/ORACLE
TABELLENDEFINITION : C ONSTRAINTS
4.0 Schema-Definition 85
Praktikum: Datenbankprogrammierung in SQL/ORACLE
4.0 Schema-Definition 86
Praktikum: Datenbankprogrammierung in SQL/ORACLE
TABELLENDEFINITION : C ONSTRAINTS
4.0 Schema-Definition 87
Praktikum: Datenbankprogrammierung in SQL/ORACLE
TABELLENDEFINITION : S YNTAX
Dabei ist CONSTRAINT ‹name› optional (ggf. Zuordnung eines systeminternen Namens).
• ‹name› wird bei NULL-, UNIQUE-, CHECK- und REFERENCES-Constraints benötigt, wenn das
Constraint irgendwann einmal geändert oder gelöscht werden soll,
• PRIMARY KEY kann man ohne Namensnennung löschen und ändern.
• Angabe von DEFERRABLE: siehe Folie 156 ff.
4.0 Schema-Definition 89
Praktikum: Datenbankprogrammierung in SQL/ORACLE
4.0 Schema-Definition 91
Praktikum: Datenbankprogrammierung in SQL/ORACLE
4.0 Schema-Definition 92
Praktikum: Datenbankprogrammierung in SQL/ORACLE
Tabellendefinition: Fremdschlüssel
Ein Berg liegt in einer Provinz eines Landes:
Country Code
belongs_to
Name
4.0 Schema-Definition 93
Praktikum: Datenbankprogrammierung in SQL/ORACLE
Tabellendefinition
abbrev
in in
Name
4.0 Schema-Definition 94
Praktikum: Datenbankprogrammierung in SQL/ORACLE
Tabellendefinition
• Die meisten Organisationen haben ihren Sitz in einer Stadt:
abbrev
in in
Name
4.0 Schema-Definition 95
Praktikum: Datenbankprogrammierung in SQL/ORACLE
TABELLENDEFINITION
4.0 Schema-Definition 96
Praktikum: Datenbankprogrammierung in SQL/ORACLE
Beispiel: Ein Benutzer benötigt häufig die Information, welche Stadt in welchem Land liegt, ist
jedoch weder an Landeskürzeln noch Einwohnerzahlen interessiert.
CREATE VIEW CityCountry (City, Country) AS
SELECT *
SELECT [Link], [Link]
FROM CityCountry
FROM City, Country
WHERE Country = ’Cameroon’;
WHERE [Link] = [Link];
4.0 Views 97
Praktikum: Datenbankprogrammierung in SQL/ORACLE
PAPIERKORB /R ECYCLEBIN
Seit Version 11 besitzt Oracle einen Recyclebin, wo alles reinfällt, was gedroppt wurde:
• Vorteil: man kann es wiederholen
• Nachteil: es braucht weiterhin Platz im Tablespace.
• Inhalt anschauen (vgl. Data Dictionary: all_objects)
SELECT type, object_name, original_name
FROM RECYCLEBIN;
• (Etwas aus) Recyclebin löschen:
PURGE RECYCLEBIN;
PURGE TABLE ‹tablename›;
• Tabelle droppen und nicht im Recyclebin sichern:
DROP ‹tablename› PURGE;
• Tabelle wieder holen:
FLASHBACK TABLE ‹tablename›
TO {BEFORE DROP | TIMESTAMP ‹timestamp›}
[ RENAME TO ‹name›] ;
Kapitel 5
Einfügen und Ändern von Daten
Eine Tabelle Metropolis (Name, Country, Population) kann man z.B. mit dem folgenden
Statement füllen:
INSERT INTO Metropolis
SELECT Name, Country, Population
FROM City
WHERE Population > 1000000;
Es geht auch noch kompakter (implizite Tabellendefinition):
CREATE TABLE Metropolis AS
SELECT Name, Country, Population
FROM City WHERE Population > 1000000;
• Im Gegensatz zu einem View wird diese Tabelle beim Aufruf gefüllt, und ändert sich bei
Änderungen an der Tabelle City nicht automatisch mit.
Tupel können mit Hilfe der DELETE-Klausel aus Relationen gelöscht werden:
DELETE FROM ‹table›
WHERE ‹predicate›;
Dabei gilt für die WHERE-Klausel das für SELECT gesagte.
Mit einer leeren WHERE-Bedingung kann man z.B. eine ganze Tabelle abräumen (die Tabelle
bleibt bestehen, sie kann mit DROP TABLE entfernt werden):
DELETE FROM City;
Der folgende Befehl löscht sämtliche Städte, deren Einwohnerzahl kleiner als 50.000 ist.
DELETE FROM City
WHERE Population < 50000;
Sicherungspunkte setzen
Für eine längere Transaktion können zwischendurch Sicherungspunkte gesetzt werden:
SAVEPOINT ‹savepoint›;
Kapitel 6
Spezialisierte Datentypen
• (einfache) Built-In-Typen: Zeitangaben
• zusammengesetzte benutzerdefinierte Datentypen
(z.B. Geo-Koordinaten aus Länge, Breite) [seit Oracle 8i/1997]
• Verlassen der 1. Normalform: Mengenwertige Einträge – Geschachtelte Tabellen [seit
Oracle 8i/8.1.5/1997]
• selbstdefinierte Objekttypen (Siehe Folie 256)
– Objekte an Stelle von Tupeln und Attributwerten
– mit Objektmethoden
– basierend auf PL-SQL [seit Oracle 8.0/1997/1998]
– mit Java-Methoden [seit Oracle 8i/8.1.5/1999]
– Objekttypen basierend auf Java-Klassen, Vererbung [seit Oracle 9i/2001]
• Built-In-Typen mit festem Verhalten
– XMLType (siehe Folie 413) [seit Oracle 9i-2/2002]
– Ergänzungen “Extensions” (Spatial Data (seit Oracle 8i/8.1.5) etc.)
6.0 Spezialisierte Datentypen 110
Praktikum: Datenbankprogrammierung in SQL/ORACLE
Beispiel: Alle Länder, die zwischen 1988 und 1992 gegründet wurden:
MONTHS_BETWEEN(...)
-4
Formattoleranz
• NLS_date_format ist verbindlich für das Ausgabeformat
• für das Eingabeformat wendet Oracle zusätzlich Heuristiken an:
ALTER SESSION SET NLS_DATE_FORMAT = ’DD MM YYYY’;
SELECT to_char(to_date(’24.12.2002’)) FROM dual; -- wird erkannt
SELECT to_char(to_date(’24 JUN 2002’)) FROM dual; -- wird erkannt
SELECT to_char(to_date(’JUN 24 2002’)) FROM dual; -- wird nicht erkannt
-- ORA-01858: a non-numeric character was found where a numeric was expected
• Wenn man ein Datum in einem CREATE TABLE constraint verwenden muss, muss es zu
dem zu diesem Zeitpunkt aktiven Format passen.
• produktabhängig: SYSDATE (in Oracle), CURRENT_DATE (in Postgres) ...
• In Oracle darf SYSDATE in constraints nicht verwendet werden, “da es veränderlich ist und
somit das Constraint zur Laufzeit ohne ein Update verletzt werden könnte”.
• in Postgres ist es erlaubt:
create table test(a date check(a <= current_date),
b date check(b >= current_date));
insert into text values(current_date,current_date);
Das Constraint wird nur zum Eingabe/Updatezeitpunkt geprüft.
Das Tupel ist am nächsten Tag auch noch da und selektierbar.
Z USAMMENGESETZTE DATENTYPEN
Zugriff auf einzelne Komponenten von komplexen Attributen in der bei Records üblichen
dot-Notation.
Hierbei muss der Pfad mit dem Alias einer Relation beginnen (Eindeutigkeit!):
SELECT Name, [Link],
[Link]
FROM Mountain B;
6.3 Collections
• “First Normal Form”: nur atomare Werte
• Erweiterung II: Collections: Wert eines Attributs ist eine Menge
• ... es geht, aber die Syntax dafür wird umständlich und durchbricht die elegante Einfachheit
von SQL und fällt in eine häßliche Programmiersprachenebene.
NestedPolitics
Country Independence Dep. Memberships
D 18-JAN-1871 NULL EU, NATO, OECD, . . .
GBJ NULL GB ∅
: : : :
• Collection kann durch Aggregation aus einem GROUP-BY gebildet werden:
SELECT country, collect(organization)
FROM isMember
GROUP BY country;
• Ergebnis z.B. SYSTPkEqWcRtkgT/gQEyGzFEpmA==(’EU’, ’NATO’, ’OECD’, ...)
• erzeugt ad-hoc einen systemeigenen Typ “SYSTP...”, der die Collection aufnimmt.
6.3 Collections 119
Praktikum: Datenbankprogrammierung in SQL/ORACLE
Verwendet eine einfache Form des komplexeren Konzeptes “Nested Tables” (siehe Folie 128 ff.)
CREATE [OR REPLACE] TYPE ‹collection_type› AS
TABLE OF ‹basic_type›;
/
CREATE TABLE ‹table_name›
( ... ,
‹collection-attr› ‹collection_type› ,
... )
NESTED TABLE ‹collection-attr› STORE AS ‹name ›;
TABLE-Typ MON_ORGLIST definieren:
CREATE OR REPLACE TYPE MON_ORGLIST AS TABLE OF VARCHAR2(12);
/
CREATE TABLE NestedPolitics
( country VARCHAR2(4) PRIMARY KEY,
independence DATE,
dependent VARCHAR2(4), -- REFERENCES Country(Code)
memberships MON_ORGLIST)
NESTED TABLE memberships STORE AS o_list;
6.3 Collections 120
Praktikum: Datenbankprogrammierung in SQL/ORACLE
• collect(...) erzeugt eine Instanz eines ad-hoc-Typs, der Zeichenketten (oder Zahlen oder
DATE) enthält,
• man muss (leider) explizit mitteilen, dass diese in den Zieltyp (hier MON_ORGLIST) gecastet
werden muss:
CAST(‹instanz-eines-typs› AS ‹kompatibler typ›)
INSERT INTO NestedPolitics
( SELECT [Link], [Link], [Link],
CAST(collect([Link]) AS MON_ORGLIST)
FROM Politics p LEFT OUTER JOIN isMember i
ON [Link] = [Link]
GROUP BY [Link], [Link], [Link]);
SELECT country, memberships
FROM NestedPolitics
WHERE country = ’D’;
Country Organizations
’D’ MON_ORGLIST(’EU’, ’NATO’, ’OECD’, . . . )
• Man sieht relativ einfach, dass die nested table o_list ähnlich der bestehenden “flachen”
Tabelle isMember gespeichert ist, und dass
SELECT [Link], [Link], [Link]
FROM Politics p, isMember im
WHERE [Link] = [Link];
SELECT [Link], [Link], [Link]
FROM Politics p,
-- korreliertes Join, waere z.B. in OQL zulaessig
(SELECT * FROM isMember where country = [Link]) i
äquivalent ist.
• Anmerkung:
korreliertes Join: i-te Relation in Abhängigkeit von i-1 -ter berechnen
– in SQL nicht erlaubt
– in Sprachen zu Datenmodellen, die Referenzen/Objektwertige Attribute,
mengen-/mehrwertige Attribute oder baumartige Hierarchien besitzen, üblicherweise
erlaubt (OQL, XML/XQuery; Forschungs-Sprachen aus 1995-2000: OEM, F-Logic)
– daher auch für SQL mit Collections naheliegend.
UPDATE NestedPolitics
SET memberships = (SELECT memberships
FROM NestedPolitics
WHERE country = ’D’)
WHERE country=’BAV’;
-- optional THE (SELECT ...)
• Man kann immer nur eine Collection gleichzeitig anfassen, und muss diese mit einer
SELECT-Anfrage auswählen
(also nicht ’XXX’ in alle Mitgliedschaftslisten einfügen, oder überall ’EU’ durch ’EWG’
ersetzen)
INSERT INTO THE (SELECT memberships
FROM NestedPolitics
WHERE country = ’D’)
VALUES(’XXX’);
DELETE FROM THE (SELECT memberships
FROM NestedPolitics
WHERE country = ’D’)
WHERE column_value = ’XXX’;
UPDATE THE (SELECT memberships
FROM NestedPolitics
WHERE country = ’D’)
SET column_value = ’XXX’
WHERE column_value = ’EU’;
Nested_Spoken
Country Languages
Name Percent
D German 100
CH German 65 • Tabellenwertige Attribute
• Generischer Typ
French 18
TABLE OF <inner_type>
Italian 12 ⇒ Generische Syntax
Romansch 1
FL NULL
F French 100
.. ..
. .
Geschachtelte Tabellen
SELECT *
FROM Nested_Spoken Country Languages(Name, Percentage)
WHERE Country=’CH’; CH Spoken_List(Spoken_T(’French’, 18),
Spoken_T(’German’, 65),
Spoken_T(’Italian’, 12),
Spoken_T(’Romansch’, 1))
SELECT Languages
FROM Nested_Spoken Languages(Name, Percentage)
WHERE Country=’CH’; Spoken_List(Spoken_T(’French’, 18),
Spoken_T(’German’, 65),
Spoken_T(’Italian’, 12),
Spoken_T(’Romansch’, 1))
... also erst Tupel erzeugen und dann die geschachtelten Tabellen mit einer korrelierten
SET-Subquery hinzufügen:
UPDATE Nested_Spoken B
SET Languages =
CAST(MULTISET(SELECT Name, Percentage
FROM Language A
WHERE [Link] = [Link])
AS Spoken_List);
KOMPLEXE DATENTYPEN
SELECT * FROM USER_TYPES
Kapitel 7
TEIL II: Dies und Das
Teil I: Grundlagen
Teil II: Weiteres zum “normalen” SQL
• ER-Modell und relationales Datenmo-
• Änderungen des Datenbankschemas
dell
• Referentielle Integrität
• Umsetzung in ein Datenbankschema:
• Transaktionen und Integritätsbedingungen
CREATE TABLE
• View Updates
• Anfragen: SELECT – FROM – WHERE
• Zugriffsrechte
• Arbeiten mit der Datenbank: DELETE,
• Anpassung der Datenbank an Sprache, Zei-
UPDATE
chensatz etc.
• Optimierung
• CREATE-Anweisung
• ALTER-Anweisung
• DROP-Anweisung
• TABLE
• VIEW
• TYPE
• INDEX
• ROLE
• PROCEDURE
• TRIGGER
..
.
• Soll eine Bedingung hinzugefügt werden, die im momentanen Zustand verletzt ist, erhält
man eine Fehlermeldung.
ALTER TABLE City
ADD (CONSTRAINT citypop CHECK (population > 100000));
Integritätsbedingungen (de)aktivieren
• (Integritäts)bedingungen an eine Tabelle
- entfernen,
- zeitweise außer Kraft setzen,
- wieder aktivieren.
ALTER TABLE ‹table›
DROP PRIMARY KEY [CASCADE] |
UNIQUE (‹column-list›) |
CONSTRAINT ‹constraint›
DISABLE PRIMARY KEY [CASCADE] |
UNIQUE (‹column-list›) |
CONSTRAINT ‹constraint› | ALL TRIGGERS
ENABLE PRIMARY KEY |
UNIQUE (‹column-list›) |
CONSTRAINT ‹constraint› | ALL TRIGGERS;
• PRIMARY KEY darf nicht gelöscht/disabled werden solange REFERENCES-Deklaration besteht.
• DROP PRIMARY KEY CASCADE löscht/disabled REFERENCES-Deklarationen darauf ebenfalls.
• ENABLE: kaskadierend disable’te Constraints müssen manuell reaktiviert werden.
7.1 Ändern von Tabellen 142
Praktikum: Datenbankprogrammierung in SQL/ORACLE
percent
R EFERENTIELLE I NTEGRITÄT
Country
Name Code Capital Province
Germany D Berlin Berlin
United States USA Washington Distr. Columbia
... ... ... ...
City
Name Country Province
Berlin D Berlin
Washington USA Distr. Columbia
... ... ...
R EFERENTIELLE I NTEGRITÄT
• als Spaltenbedingung:
‹attr› [CONSTRAINT ‹name›]
REFERENCES ‹table’›(‹attr’›)
CREATE TABLE City
(...
Country VARCHAR2(4)
CONSTRAINT CityRefsCountry
REFERENCES Country(Code) );
• als Tabellenbedingung:
[CONSTRAINT ‹name›]
FOREIGN KEY (‹attr-list›)
REFERENCES ‹table’›(‹attr-list’›)
CREATE TABLE Country
(...
CONSTRAINT CapitalRefsCity
FOREIGN KEY (Capital,Code,Province)
REFERENCES City(Name,Country,Province) );
R EFERENTIELLE A KTIONEN
• Bei Veränderungen am Inhalt einer Tabelle sollen automatisch Aktionen ausgeführt
werden, um die referentielle Integrität der Datenbasis zu erhalten.
• Ist dies nicht möglich, so werden die gewünschten Operationen nicht ausgeführt, bzw.
zurückgesetzt.
1. INSERT in die referenzierte Tabelle oder DELETE aus der referenzierenden Tabelle ist immer
unkritisch:
INSERT INTO Country VALUES (’Lummerland,’LU’,...);
DELETE FROM isMember WHERE country=’D’;
2. Ein INSERT oder UPDATE in der referenzierenden Tabelle, darf keinen Fremdschlüsselwert
erzeugen, der nicht in der referenzierten Tabelle existiert:
INSERT INTO City VALUES (’Karl-Marx-Stadt’,’DDR’,...);
Anderenfalls ist es unkritisch:
UPDATE City SET Country=’A’ WHERE Name=’Munich’;
3. DELETE und UPDATE bzgl. der referenzierten Tabelle: Anpassung der referenzierenden
Tabelle durch Referentielle Aktionen sinnvoll:
UPDATE Country SET Code=’UK’ WHERE Code=’GB’; oder
DELETE FROM Country WHERE Code=’I’;
SET DEFAULT:
Die Operation wird ausgeführt und bei den referenzierenden Tupeln wird der
entsprechende Fremdschlüsselwert auf die für die entsprechende Spalten festgelegten
DEFAULT-Werte gesetzt (dafür muss dann wiederum ein entsprechendes Tupel in der
referenzierten Relation existieren). Falls kein DEFAULT-Wert definiert wurde, entspricht das
Verhalten SET NULL (s.u.).
SET NULL:
Die Operation wird ausgeführt und bei den referenzierenden Tupeln wird der
entsprechende Fremdschlüsselwert durch NULL ersetzt (dazu müssen NULLs zulässig sein).
located: Stadt liegt an Fluss/See/Meer
located(Bremerhaven,Bremen,D,Weser,NULL,North Sea)
DELETE FROM River WHERE Name=’Weser’;
located(Bremerhaven,Bremen,D,NULL,NULL,North Sea)
Referentielle Aktionen
Country
Name Code Capital Province
Germany D Berlin Berlin
United States USA Washington Distr. Columbia
... ... ... ...
CASCADE
NO ACTION
City
Name Country Province
Berlin D Berlin
Washington USA Distr. Columbia
... ... ...
Province
Name Country Capital
Berlin D Berlin
[Link]. US Washington
... ... ...
City
Name Country Province
Berlin D B
Washington USA [Link].
... ... ...
Im allgemeinen Fall:
• Schon eine einzelne Operation bringt in Verbindung mit ON DELETE/UPDATE SET NULL/SET
DEFAULT und ON UPDATE CASCADE Mehrdeutigkeiten, Widersprüche etc.
• Aufgrund von SQL-Triggern induziert ein User-Update häufig mehrere Datenbank-Updates,
• nichttriviale Entscheidung, welche Updates getriggert werden sollen,
• im Fall von Inkonsistenzen Analyse der Ursache sowie maximal zulässiger Teilmengen der
User-Requests,
• Stabile Modelle, exponentieller Aufwand.
... siehe dbis-Webseiten
• Theorie: Integritätsbedingungen werden (erst) zum Ende der Transaktion überprüft (und
nicht nach jedem einzelnen Statement)
• Praxis: Es ist effizienter (und manchmal benutzerfreundlicher), sie nach jedem einzelnen
Statement zu überprüfen.
⇒ konfigurierbar:
IMMEDIATE vs. DEFERRED
Syntax
• Bei Definition (CREATE TABLE und ALTER TABLE) von Constraints kann DEFERRABLE bzw.
NOT DEFERRABLE (Default) und im Fall von DEFERRABLE INITIALLY DEFERRED oder
INITIALLY IMMEDIATE (was auch der Default ist) angegeben werden.
ALTER TABLE isMember
ADD CONSTRAINT MemberCRef
FOREIGN KEY (Country) REFERENCES Country(Code)
ON DELETE CASCADE
DEFERRABLE INITIALLY DEFERRED
ADD CONSTRAINT MemberOrgRef
FOREIGN KEY (Organization) REFERENCES Organization(Abbreviation)
DEFERRABLE;
• (Oracle): Das Setting kann vom Benutzer (lokal) geändert werden (für diejenigen
Constraints, die überhaupt DEFERRABLE sind):
– Für die aktuelle Transaktion (Hinweis: mit einem DDL-Statement würde diese beendet!):
SET CONSTRAINT[S] {‹name›|ALL} {IMMEDIATE|DEFERRED}
– Für die ganze Session, geht dann nur für alle Constraints gemeinsam:
ALTER SESSION SET CONSTRAINT[S] = {IMMEDIATE|DEFERRED}
Einzelanalyse DEFERRED/IMMEDIATE
• CHECK-Constraints: IMMEDIATE meistens sinnvoller,
• PRIMARY KEY, UNIQUE: IMMEDIATE meistens sinnvoller,
• NOT NULL: DEFERRED praktisch um ein eingefügtes Tupel erst später zu vervollständigen,
• Referentielle Integritätsbedingungen:
– wenn man die Einfügereihenfolge nicht weiß, ist DEFERRED sinnvoll,
– bei zyklischen Strukturen (Country/Capital/City) sollte mindestens ein Constraint
DEFERRED sein.
DEFERRED/IMMEDIATE vs. DISABLE/ENABLE
• DISABLE/ENABLE erfordert ALTER TABLE-Rechte,
DEFERRABLE wird einmal vom Admin gesetzt, und dann kann jeder Benutzer in seiner
Session entscheiden, ob er DEFERRED setzen möchte.
• Mehrbenutzerbetrieb: Ausschalten der Constraints gilt für alle. Beim Wiedereinschalten hat
man die Fehler der anderen mit am Hals.
• bei sehr komplexen Updates will man mit Transaktionen arbeiten und
Bedingungsverletzungen zeitweise erlauben
→ alleine, Constraints disablen, schrittweise committen.
View Updates
View Updates
View Updates
Beispiel:
• Country darf nicht verändert werden:
City Country
Berlin Germany
Freiburg Germany
View Updates
View Updates
Beispiel:
CREATE OR REPLACE VIEW temp AS
SELECT country, population
FROM Province A
WHERE population = (SELECT MAX(population)
FROM Province B
WHERE [Link] = [Link]);
SELECT * FROM temp WHERE Country = ’D’;
Country Name Population
D Nordrhein-Westfalen 17816079
UPDATE temp
SET population = 0 where Country = ’D’;
SELECT * FROM Province WHERE Name = ’D’;
Ergebnis: die Bevölkerung der bevölkerungsreichsten Provinz Deutschlands wird auf 0 gesetzt.
Damit ändert sich auch das View !
SELECT * FROM temp WHERE Country = ’D’; Country Name Population
D Bayern 11921944
View Updates
• Tupel können durch Update aus dem Wertebereich des Views hinausfallen.
• Views häufig verwendet, um den “Aktionsradius” eines Benutzers einzuschränken.
• Verlassen des Wertebereichs kann durch WITH CHECK OPTION verhindert werden:
Beispiel
CREATE OR REPLACE VIEW UScities AS
SELECT *
FROM City
WHERE Country = ’USA’
WITH CHECK OPTION;
UPDATE UScities
SET Country = ’D’ WHERE Name = ’Miami’;
FEHLER in Zeile 1:
ORA-01402: Verletzung der WHERE-Klausel
einer View WITH CHECK OPTION
Es ist übrigens erlaubt, Tupel aus dem View zu löschen.
M ATERIALIZED V IEWS
• Views werden bei jeder Anfrage neu berechnet.
+ repräsentieren immer den aktuellen Datenbankzustand.
- zeitaufwendig, ineffizient bei wenig veränderlichen Daten
⇒ Materialized Views
• werden bei der Definition berechnet und
• bei jeder Datenänderung automatisch aktualisiert (u.a. durch Trigger ).
• ⇒ Problem der View Maintenance.
7.5 Zugriffsrechte
Benutzeridentifikation
• Benutzername
• Password
• sqlplus /: Identifizierung durch UNIX-Account
Schemakonzept
• Jedem Benutzer ist sein Database Schema zugeordnet, in dem “seine” Objekte liegen.
• Bezeichnung der Tabellen global durch ‹username›.‹table›
(z.B. [Link]),
• im eigenen Schema nur durch ‹table›.
S YSTEMPRIVILEGIEN
• berechtigen zu Schemaoperationen
• CREATE [ANY] TABLE/VIEW/TYPE/INDEX/CLUSTER/TRIGGER/PROCEDURE:
Benutzer darf die entsprechenden Schema-Objekte erzeugen,
• ALTER [ANY] TABLE/TYPE/TRIGGER/PROCEDURE:
Benutzer darf die entsprechenden Schema-Objekte verändern,
• DROP [ANY] TABLE/VIEW/TYPE/INDEX/CLUSTER/TRIGGER/PROCEDURE:
Benutzer darf die entsprechenden Schema-Objekte löschen.
• SELECT/INSERT/UPDATE/DELETE [ANY] TABLE:
Benutzer darf in Tabellen Tupel lesen/erzeugen/verändern/entfernen.
S YSTEMPRIVILEGIEN
Rechte vergeben: GRANT ‹privilege-list› TO ‹user-list› | PUBLIC
[ WITH ADMIN OPTION ];
• PUBLIC: jeder erhält das Recht.
• WITH ADMIN OPTION: Empfänger darf dieses Recht weiter vergeben.
Rechte entziehen: REVOKE ‹privilege-list› | ALL
FROM ‹user-list› | PUBLIC;
nur wenn man dieses Recht selbst vergeben hat (im Fall von ADMIN OPTION kaskadierend).
Beispiele:
• GRANT CREATE ANY INDEX, DROP ANY INDEX erlaubt opti-person, überall Indexe zu
TO opti-person WITH ADMIN OPTION; erzeugen und zu löschen,
• GRANT DROP ANY TABLE TO destroyer; darf überall Tabellen löschen
GRANT SELECT ANY TABLE TO supervisor; darf alle Tabellen aller Benutzer lesen
• REVOKE CREATE TABLE FROM mueller; darf keine Tabellen mehr erzeugen.
Informationen über eigene Systemprivilegien: SELECT * FROM SESSION_PRIVS;
Stichwort: Rollenkonzept – fasst eine Menge von Rechten zusammen
O BJEKTPRIVILEGIEN
berechtigen dazu, Operationen auf existierenden Objekten auszuführen.
• Eigentümer eines Datenbankobjektes
• Niemand sonst darf mit einem solchen Objekt arbeiten, außer
• Eigentümer (oder DBA) erteilt explizit entsprechende Rechte:
GRANT ‹privilege-list› | ALL [(‹column-list›)]
ON ‹object›
TO ‹user-list› | PUBLIC
[ WITH GRANT OPTION ];
• ‹object›: eine Instanz von TABLE, VIEW, PROCEDURE/FUNCTION, TYPE,
• Tabellen und Views: Genauere Einschränkung für INSERT, REFERENCES und UPDATE durch
‹column-list›,
• ‹privilege-list›: DELETE, INSERT, SELECT, UPDATE für Tabellen und Views,
INDEX, ALTER und REFERENCES für Tabellen,
EXECUTE für Prozeduren, Funktionen und TYPEn.
• ALL: alle Privilegien die man an dem Objekt (ggf. auf der angegebenen Spalte) hat.
• GRANT OPTION: Der Empfänger darf das Recht weitergeben.
7.5 Zugriffsrechte 172
Praktikum: Datenbankprogrammierung in SQL/ORACLE
Objektprivilegien (Forts.)
Rechte entziehen:
REVOKE ‹privilege-list› | ALL
ON ‹object›
FROM ‹user-list› | PUBLIC
[CASCADE CONSTRAINTS];
• CASCADE CONSTRAINTS (bei REFERENCES): alle referentiellen Integritätsbedingungen, die auf
einem entzogenen REFERENCES-Privileg beruhen, fallen weg.
• Berechtigung von mehreren Benutzern erhalten: Fällt mit dem letzten REVOKE weg.
• im Fall von GRANT OPTION kaskadierend.
Überblick über vergebene/erhaltene Rechte:
SELECT * FROM USER_TAB_PRIVS;
• Rechte, die man für eigene Tabellen vergeben hat,
• Rechte, die man für fremde Tabellen bekommen hat
SELECT * FROM USER_COL_PRIVS;
SELECT * FROM USER_TAB/COL_PRIVS_MADE/RECD;
S YNONYME
Beispiel: Benutzer will oft die Relation “City”, aus dem Schema “dbis” verwenden.
• SELECT * FROM [Link];
• CREATE SYNONYM DCity
FOR [Link];
SELECT * FROM DCity;
pol ist Besitzer der Relation Country, will Country ohne Hauptstadt und deren Lage für geo les-
und schreibbar machen.
View mit Lese- und Schreibrecht für geo:
CREATE VIEW pubCountry AS
SELECT Name, Code, Population, Area
FROM Country;
GRANT SELECT, INSERT, DELETE, UPDATE
ON pubCountry TO geo;
• Referenzen auf Views müssen separat erlaubt werden:
‹pol›: GRANT REFERENCES (Code) ON Country TO geo;
‹geo›: ... REFERENCES [Link](Code);
• Man (Admin!) kann einem Benutzer erlauben, “sich” mit dem Rechten eines anderen
Accounts (und dessen Schema) einzuloggen.
• Dabei kann man auch User anlegen, die nur als “Schema-Accounts” existieren, und sich
selber garnicht einloggen können:
ALTER USER ‹data-owner› GRANT CONNECT THROUGH ‹user›
(zu lesen als ‘connect by’, nicht als ‘connect as’)
ALTER USER dbis GRANT CONNECT THROUGH may;
• und dann:
may@login> sqlplus
SQL> connect may[dbis]/may-passwort
SQL> select * from continent
greift automatisch auf [Link] zu,
hat alle Rechte, die dbis hat.
• Die “realen-Personen”-Benutzer benötigen dann nicht einmal ein eigenes Schema, und
können auch keine eigenen (privaten) Tabellen in der “Firmen”-Datenbank anlegen.
Anpassungs-Parameter
Parameter Value
NLS_LANGUAGE {AMERICAN|...}
NLS_NUMERIC_CHARACTERS {.,|,.} Dezimalpunkt/komma, z.B. 50.000,00
NLS_CALENDAR {GREGORIAN|...}
NLS_DATE_FORMAT {DD-MON-YYYY|...}
NLS_DATE_LANGUAGE {AMERICAN|...}
NLS_CHARACTERSET {AL32UTF8|...}
NLS_SORT {BINARY|GERMAN} Behandlung von Umlauten
NLS_LENGTH_SEMANTICS {BYTE|CHAR}
NLS_RDBMS_VERSION {[Link].1.0|[Link]|. . . }
Datenspeicherung:
• Hintergrundspeicherzugriff effizient steuern
−→ Zugriffspfade: Indexe, Hashing
• möglichst viele semantisch zusammengehörende Daten mit einem
Hintergrundspeicherzugriff holen
−→ Clustering
Anfrageoptimierung:
• Datenmengen klein halten
• frühzeitig selektieren
• Systeminterne Optimierung
Algorithmische Optimierung !
Z UGRIFFSPFADE : I NDEXE
Zugriff über indizierte Spalte(n) erheblich effizienter.
• Baumstruktur; ORACLE: B∗ -Mehrweg-Baum,
• B∗ -Baum: Knoten enthalten nur Weg-Information, Verzweigungsgrad hoch, Höhe des
Baumes klein.
. 5 . 9 . 13 .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Z UGRIFFSPFADE : I NDEXE
Zugriff über indizierte Spalte(n) erheblich effizienter:
• benötigte Indexknoten aus Hintergrundspeicher holen,
• dann nur ein Zugriff um ein Tupel zu bekommen.
H ASHING
Aufgrund der Werte einer/mehrerer Spalten (Hashkey) wird durch eine Hashfunktion
berechnet, wo das/die entsprechende(n) Tupel zu finden sind.
• Zugriff in konstanter Zeit,
• keine Ordnung.
• gezielter Zugriff auf die Daten über ein bestimmtes Land
Hashkey: [Link]
Hashkey-Wert
Hashfunktion
F D NL
··· 58317450 ··· 83536115 ··· 15568034 ···
547030 356910 37330
In ORACLE ist Hashing nur für Cluster implementiert.
C LUSTER
• Zusammenfassung einer Gruppe von Tabellen, die alle eine oder mehrere gemeinsame
Spalten (Clusterschlüssel) besitzen, oder
• Gruppierung einer Tabelle nach dem Wert einer bestimmten Spalte (Clusterschlüssel);
• bei einem Hintergrundspeicherzugriff werden semantisch zusammengehörende Daten in
den Hauptspeicher geladen.
Clustering
Clustering
Teil I: Grundlagen
Teil II: Diverses
Teil III: Prozedurale Konzepte, OO, Einbettung
• PL/SQL: Prozeduren, Funktionen, Trigger
• Objektorientierung
• SQL und Java
• SQL und XML
S ITUATION
• keine prozeduralen Konzepte in SQL (Schleifen, Verzweigungen, Variablendeklarationen)
• viele Aufgaben nur umständlich über Zwischentabellen oder überhaupt nicht in SQL zu
realisieren
– Transitive Hülle.
• Programme repräsentieren anwendungsspezifisches Wissen, das nicht in der Datenbank
enthalten ist.
E RWEITERUNGEN
• Einbettung von SQL in prozedurale Wirtssprachen (embedded SQL); meistens Pascal, C,
C++, oder auch Java (JDBC/SQLJ),
• Erweiterung von SQL um prozedurale Elemente innerhalb der SQL-Umgebung, PL/SQL
(Procedural language extensions to SQL).
• Vorteile von PL/SQL: Bessere Integration der prozeduralen Elemente in die Datenbank;
Nutzung in Prozeduren, Funktionen und Triggern.
• benötigt für Objektmethoden.
Kapitel 8
Prozedurale Erweiterungen: PL/SQL
Weitere Nutzung
Block Header
• Block Header: Art des Objekts (Funktion, Pro-
IS
zedur oder anonym (innerhalb eines anderen
Declaration Section Blocks)), und Parameterdeklarationen.
BEGIN • Declaration Section: Deklarationen der in dem
Block verwendeten Variablen,
Execution Section
• Execution Section: Befehlssequenz des Blocks,
EXCEPTION • Exception Section: Reaktionen auf eventuell auf-
Exception Section tretende Fehlermeldungen.
END;
Wichtig: nach dem Semikolon noch ein Vorwärtsslash (“/”) in einer separaten Zeile, um die
Deklaration auszuführen!!!
Einfache Datentypen:
BOOLEAN: TRUE, FALSE, NULL,
BINARY_INTEGER, PLS_INTEGER: Ganzzahlen mit Vorzeichen.
NATURAL, INT, SMALLINT, REAL, . . . : Numerische Datentypen.
DECLARE
anzahl NUMBER DEFAULT 0;
name VARCHAR2(50);
anchored T YPDEKLARATION
Angabe einer PL/SQL-Variablen, oder Tabellenspalte (!) deren Typ man übernehmen will:
‹variable› ‹variable’›%TYPE
[NOT NULL] [DEFAULT ‹value›];
oder
‹variable› ‹table›.‹col›%TYPE
[NOT NULL] [DEFAULT ‹value›];
• cityname [Link]%TYPE
• %TYPE wird zur Compile-Time bestimmt.
PL/SQL-DATENTYPEN : R ECORDS
Ein RECORD enthält mehrere Felder, entspricht einem Tupel in der Datenbasis:
TYPE city_type IS RECORD
(Name [Link]%TYPE,
Country VARCHAR2(4),
Province VARCHAR2(50),
Population NUMBER,
Latitude NUMBER,
Longitude NUMBER);
the_city city_type;
Äquivalent zu oben:
the_city city%ROWTYPE;
Z UWEISUNG AN VARIABLEN
• “klassisch” innerhalb des Programms:
a := b;
• Zuweisung des (einspaltigen und einzeiligen!) Ergebnisses einer Datenbankanfrage an
eine PL/SQL-Variable:
SELECT ...
INTO ‹PL/SQL-Variable›
FROM ...
DECLARE
cname [Link]%TYPE;
BEGIN
SELECT name
INTO cname
FROM country
WHERE code=’D’;
dbms_output.put_line(cname);
END;
/ [Filename: PLSQL/[Link]]
AUSGABE -G ENERIERUNG
• verwendet das DBMS_Output Package
• einmalig SET SERVEROUTPUT ON
(z.B., beim Starten von sqlplus)
• innerhalb von PL/SQL-Blocks:
dbms_output.put_line(’bla’);
• Bei Prozeduren etc.: Ausgabe erscheint erst nach kompletter Ausführung der Prozedur etc.
set serveroutput on;
DECLARE
bla NUMBER;
BEGIN
bla := 42;
dbms_output.put_line(bla);
END;
/
[Filename: PLSQL/[Link]]
Zuweisung an Records
• Aggregierte Zuweisung: zwei Variablen desselben Record-Typs:
‹variable› := ‹variable’›;
• Feldzuweisung: ein Feld wird einzeln zugewiesen:
‹[Link]› := ‹variable›|‹value›;
• SELECT INTO: Ergebnis einer Anfrage, die nur ein einziges Tupel liefert:
DECLARE
SELECT ...
c continent%ROWTYPE;
INTO ‹record-variable›
BEGIN
FROM ... ;
SELECT *
INTO c
FROM continent
WHERE name=’Europe’;
dbms_output.put_line([Link] || ’ : ’ || [Link]);
END;
/ [Filename: PLSQL/[Link]]
Vergleich von Records
Beim Vergleich von Records muss jedes Feld einzeln verglichen werden.
P ROZEDUREN
CREATE [OR REPLACE] PROCEDURE ‹proc_name›
[(‹parameter-list›)]
IS ‹pl/sql-body›;
/
• OR REPLACE: existierende Prozedurdefinition wird überschrieben.
• (‹parameter-list›): Deklaration der formalen Parameter:
(‹variable› [IN|OUT|IN OUT] ‹datatype›,
.
.
.
‹variable› [IN|OUT|IN OUT] ‹datatype›)
• IN, OUT, IN OUT: geben an, wie die Prozedur/Funktion auf den Parameter zugreifen kann
(Lesen, Schreiben, beides).
• Default: IN.
• Bei OUT und IN OUT muss beim Aufruf eine Variable angegeben sein, bei IN ist auch eine
Konstante erlaubt.
• ‹datatype›: alle von PL/SQL unterstützten Datentypen; ohne Längenangabe (VARCHAR2
anstelle VARCHAR2(20)).
• ‹pl/sql-body› enthält die Definition der Prozedur in PL/SQL.
8.1 PL/SQL 200
Praktikum: Datenbankprogrammierung in SQL/ORACLE
F UNKTIONEN
Beispiel: Prozedur
• Einfache Prozedur: PL/SQL-Body enthält nur SQL-Befehle
Beispiel: Funktion
KONTROLLSTRUKTUREN
• IF THEN - [ELSIF THEN] - [ELSE] - END IF,
• verschiedene Schleifen:
• Simple LOOP: LOOP ... END LOOP;
• WHILE LOOP: WHILE ‹bedingung› LOOP ... END LOOP;
• Numeric FOR LOOP: FOR ‹loop_index› IN
[REVERSE] ‹Anfang› .. ‹Ende›
LOOP ... END LOOP;
Die Variable ‹loop_index› wird dabei automatisch als INTEGER deklariert.
• EXIT [WHEN ‹bedingung›]: LOOP verlassen.
• den berüchtigten GOTO-Befehl mit Labels:
‹‹label_i›› ... GOTO label_j;
• NULL-Werte verzweigen immer in den ELSE-Zweig.
• GOTO: nicht von außen in ein IF-Konstrukt, einen LOOP, oder einen lokalen Block
hineinspringen, nicht von einem IF-Zweig in einen anderen springen.
• hinter einem Label muss immer mindestens ein ausführbares Statement stehen;
• NULL Statement.
8.1 PL/SQL 207
Praktikum: Datenbankprogrammierung in SQL/ORACLE
G ESCHACHTELTE B LÖCKE
Innerhalb der Execution Section werden anonyme Blöcke zur Strukturierung verwendet. Hier
wird die Declaration Section mit DECLARE eingeleitet (es gibt keinen Block Header):
BEGIN
-- Befehle des äußeren Blocks --
DECLARE
-- Deklarationen des inneren Blocks
BEGIN
-- Befehle des inneren Blocks
END;
-- Befehle des äußeren Blocks --
END;
(vgl. Informatik I)
• Kollektion: Sammlung von Items (Liste, Baum, Heap, Menge)
• Iterator: Hilfsklasse zum Durchlaufen/Aufzählen aller Items
• Methoden:
– Erzeugen/Initialisieren des Iterators,
– Weiterschalten, Test, ob noch weitere Elemente vorhanden sind,
– Zugriff auf ein Element,
– (Schliessen des Iterators)
... Iteratoren werden im Weiteren immer wieder verwendet.
C URSORBASIERTER DATENBANKZUGRIFF
Zeilenweiser Zugriff auf eine Relation aus einem PL/SQL-Programm.
Cursordeklaration in der Declaration Section:
CURSOR ‹cursor-name› [(‹parameter-list›)]
IS ‹select-statement›;
• (‹parameter-list›): Parameter-Liste,
• nur IN als Übergaberichtung erlaubt.
• Zwischen SELECT und FROM auch PL/SQL-Variablen und PL/SQL-Funktionen.
PL/SQL-Variablen können ebenfalls in den WHERE-, GROUP- und HAVING-Klauseln verwendet
werden.
Cursore: Grundprinzip
• OPEN ‹cursor-name›[(‹argument-list›)];
Erzeugt mit dem gegebenen SELECT-Statement eine virtuelle Tabelle mit einem “Fenster”,
das über einem Tupel stehen kann und schrittweise vorwärts bewegt wird. Mit OPEN wird der
Cursor initialisiert:
OPEN cities_in (’D’);
OPEN
Name
FETCH
Bonn
FETCH
Kiel
FETCH
Hamburg
..
.
Cursore: Verwendung
• FETCH ‹cursor-name› INTO ‹record-variable›; oder
FETCH ‹cursor-name› INTO ‹variable-list›;
bewegt den Cursor auf die nächste Zeile des Ergebnisses der Anfrage und kopiert diese in
die angegebene Record-Variable oder Variablenliste.
• Diese kann z.B. mit DECLARE CURSOR cities_in
dem Record-Typ des Cursors definiert (crs_country [Link]%TYPE)
werden: IS SELECT Name
‹variable› ‹cursor-name›%ROWTYPE; FROM City
• CLOSE ‹cursor-name›; schließt einen WHERE Country = crs_country;
Cursor. city_in cities_in%ROWTYPE;
BEGIN
OPEN cities_in (’D’);
FETCH cities_in INTO city_in;
dbms_output.put_line(city_in.Name);
FETCH cities_in INTO city_in;
dbms_output.put_line(city_in.Name);
CLOSE cities_in;
END;
/ [Filename: PLSQL/[Link]]
8.2 PL/SQL 212
Praktikum: Datenbankprogrammierung in SQL/ORACLE
Cursore: Attribute
Cursore: Attribute
Cursore: Hinweis
nicht möglich:
OPEN cities_in (’D’);
OPEN cities_in (’CH’);
FETCH cities_in INTO ‹variable›;
Beispiel: Für jede Stadt in dem gegebenen Land soll der Name ausgegeben werden:
Mit WHERE CURRENT OF ‹cursor-name› kann man auf das zuletzt von dem genannten Cursor
geFETCHte Tupel zugreifen:
UPDATE ‹table-name›
SET ‹set_clause›
WHERE CURRENT OF ‹cursor_name›;
DELETE FROM ‹table-name›
WHERE CURRENT OF ‹cursor_name›;
• Dabei bestimmt die Positionierung des Cursors bezüglich der Basistabellen den Ort der
Änderung (im Gegensatz zu View Updates).
PL/SQL Tables
• Hiermit kann man auch Tabellennamen, Spaltennamen und beliebige Dinge in das
DDL-Statement oder auch in eine Anfrage einfügen.
CREATE OR REPLACE PROCEDURE clean
IS
BEGIN
FOR tn IN
( SELECT table_name FROM all_tables
WHERE table_name LIKE ’TMP_%’)
LOOP
execute immediate ’DROP TABLE ’ || tn.table_name;
END LOOP;
END;
/
[Filename: PLSQL/[Link]]
(R E )A KTIVES V ERHALTEN
• Bis jetzt: Funktionen und Prozeduren werden durch den Benutzer explizit aufgerufen.
• Trigger: Ausführung wird durch das Eintreten eines Ereignisses in der Datenbank
angestossen.
8.6 Trigger
E INSCHUB : I NTEGRITÄTSBEDINGUNGEN
• Spalten- und Tabellenbedingungen
• Wertebereichsbedingungen (domain constraints),
• Verbot von Nullwerten,
• Uniqueness und Primärschlüssel-Bedingungen,
• CHECK-Bedingungen.
! Alles nur als Bedingungen an eine Zeile innerhalb einer Tabelle formulierbar.
A SSERTIONS
• Bedingungen, die den gesamten DB-Zustand betreffen.
CREATE ASSERTION ‹name› CHECK (‹bedingung›)
• Diese werden allerdings von O RACLE bisher nicht unterstützt.
⇒ Also muss man sich etwas anderes überlegen.
Trigger
Trigger
CREATE [OR REPLACE] TRIGGER ‹trigger-name›
BEFORE | AFTER
{INSERT | DELETE | UPDATE} [OF ‹column-list›]
[ OR {INSERT | DELETE | UPDATE} [OF ‹column-list›]]*
ON ‹table›
[REFERENCING OLD AS ‹name› NEW AS ‹name›]
[FOR EACH ROW]
[WHEN (‹condition›)]
‹pl/sql-block›;
Trigger: Beispiel
Wenn ein Landes-Code geändert wird, pflanzt sich diese Änderung auf die Relation Province
fort:
CREATE OR REPLACE TRIGGER change_Code
BEFORE UPDATE OF Code ON Country
FOR EACH ROW
BEGIN
UPDATE Province
SET Country = :[Link]
WHERE Country = :[Link];
END;
/
[Filename: PLSQL/[Link]]
UPDATE Country
SET Code = ’UK’
WHERE Code = ’GB’;
Trigger: Beispiel
Wenn ein Land neu angelegt wird, wird ein Eintrag in Politics mit dem aktuellen Jahr erzeugt:
CREATE TRIGGER new_Country
AFTER INSERT ON Country
FOR EACH ROW
WHEN (:[Link] > 2)
BEGIN
INSERT INTO Politics (Country,Independence)
VALUES (:[Link],SYSDATE);
END;
/
[Filename: PLSQL/[Link]]
INSERT INTO Country (Name,Code,Population)
VALUES (’Lummerland’, ’LU’, 4);
• Zeilenorientierte Trigger: immer direkt vor/nach der Veränderung einer Zeile aufgerufen
• jede Ausführung des Triggers sieht einen anderen Datenbestand der Tabelle, auf der er
definiert ist, sowie der Tabellen, die er evtl. ändert
• ❀ Ergebnis abhängig von der Reihenfolge der veränderten Tupel
O RACLE: Betroffene Tabellen werden während der gesamten Aktion als mutating
gekennzeichnet, können nicht von Triggern gelesen oder geschrieben werden.
Nachteil: Oft ein zu strenges Kriterium.
• Trigger soll auf Tabelle zugreifen auf der er selber definiert ist.
– Nur das auslösende Tupel soll von dem Trigger gelesen/geschrieben werden:
Verwendung eines BEFORE-Triggers und der :NEW- und :OLD-Variablen
– Es sollen neben dem auslösenden Tupel auch weitere Tupel verwendet werden:
Verwendung eines Statement-orientierten Triggers
• Trigger soll auf andere Tabellen zugreifen: Verwendung von Statement-Triggern und ggf.
Hilfstabellen.
Ablauf
Trigger/Fehlerbehandlung: Beispiel
Beispiel
CREATE OR REPLACE TRIGGER dummytrigger
INSTEAD OF INSERT ON AllCountry
FOR EACH ROW
BEGIN
-- username must be in capitals!!!
IF user=’MAY’
THEN NULL;
END IF;
... INSERT INTO AllCountry
END; (Name, Code, Population, Area, GDP, Inflation,
/ population_growth, infant_mortality)
VALUES (’Lummerland’,’LU’,4,1,0.5,0,25,0);
• der folgende Job trägt nach einer Minute die (dann) aktuelle Zeit in die Tabelle “jobtest” ein,
danach wird der Job gelöscht.
• Syntax in SQLplus:
execute DBMS_SCHEDULER.CREATE_JOB (‹job-spezifikation›);
... dabei werden aber keine Zeilenumbrüche akzeptiert.
• also dasselbe (didaktisch) besser in einen PL/SQL-begin/end-Block packen:
create table jobtest (x DATE);
begin
DBMS_SCHEDULER.CREATE_JOB
(job_name => ’job1’,
job_type => ’PLSQL_BLOCK’,
job_action => ’begin insert into jobtest
values (SYSDATE); end;’,
start_date => SYSDATE+1/1440,
enabled => TRUE);
end;
/ [Filename: PLSQL/[Link]]
• der folgende Job erhöht alle zwei Minuten zu jeweils 5 angegebenen Sekundenzeitpunkten
die Bevölkerung um 1:
begin
DBMS_SCHEDULER.DROP_JOB(’job2’);
DBMS_SCHEDULER.CREATE_JOB
(job_name => ’job2’,
job_type => ’PLSQL_BLOCK’,
job_action => ’begin
update country set population = population + 1 where code=’’CN’’;
end;’,
auto_drop => FALSE,
repeat_interval => ’FREQ = MINUTELY; INTERVAL = 2;
BYSECOND = 5, 18, 31, 45, 51’,
start_date => SYSDATE+1/2880, -- after 30 secs
end_date => SYSDATE+11/1440, -- after 11 minutes
enabled => TRUE);
end;
/ [Filename: PLSQL/[Link]]
• ... in der 11. Minute nur noch 2x. Zusammen also 5x5 (0,2,4,6,8 min) + 1x2 = 27x.
Externe Jobs
• siehe Dokumentation.
• benötigt das Recht CREATE EXTERNAL JOB,
• werden auf dem Rechner ausgeführt, auf dem Oracle läuft,
• Oracle führt einen Benutzerwechsel durch (konfigurierbar, default: nobody/nogroup),
• job_action enthält nur Pfad des auszuführenden Programms, Parameter müssen separat
übergeben werden,
• Fehlermeldungen erhält man nur bei manuellem Aufruf mit
execute DBMS_SCHEDULER.RUN_JOB(’job1’);
PL/SQL in SQLPlus-Skripten
• PL/SQL begin ... end;-Blöcke können in SQLPlus-Skripten enthalten sein, und werden
auf dem Client ausgewertet.
Um ausgeführt zu werden, müssen sie mit “/” abgeschlossen werden.
Beispiel (cont’d)
• [Link] ist ein SQLplus-Skript, das einfach nur das PL/SQL-Skript aufruft:
BEGIN
@[Link];
END ;
/
[Filename: SQLPlus/[Link]]
• [Link] ist ein PL/SQL-Skript, das von anderen Skripten (innerhalb eines
PL/SQL-begin-end-Blocks) aufgerufen werden kann.
(es enthält kein “/” am Ende!)
(in einem reinen SQLPlus-Skript könnte “GRANT ...” alleine stehen)
[Filename: SQLPlus/[Link]]
execute immediate ’GRANT EXECUTE ON geocoord TO student’;
Kapitel 9
Objekt-Relationale Datenbanksysteme
Integration von relationalen Konzepten und Objektorientierung:
• Komplexe Datentypen: Erweiterung des Domain-Konzepts von SQL-2 (vgl. DATE,
Geo-Koordinaten)
• Abstrakte Datentypen (“Objekttypen”):
– Unterscheidung zwischen dem Zustand und Verhalten eines Objektes (Kapselung
interner Funktionalität).
– Im Gegensatz zu einem Tupel besitzt ein Objekt
∗ Attribute (beschreiben seinen Zustand),
∗ Methoden – Abfragen und Ändern des Zustandes: Prozeduren und Funktionen
(Oracle 8: PL/SQL, Oracle 8i/8.1.5: auch Java, siehe Folie 341)
∗ MAP/ORDER-Funktionen: Ordnung auf Objekttyp
• Spezielle Ausprägungen:
– Geschachtelte Tabellen als Attributwerte,
– Erweiternde Datentypen (Spatial etc.),
– Built-In XMLType zur Verarbeitung von XML-Daten (siehe Folie 413).
9.0 Objekt-Relationale Konzepte 256
Praktikum: Datenbankprogrammierung in SQL/ORACLE
Objektorientierte Datenbanken
Typdeklaration
• Attribute,
• Signaturen der Methoden,
Typ-Implementierung
O BJEKTTYPDEKLARATION
CREATE [OR REPLACE] TYPE ‹type› AS OBJECT
( ‹attr› ‹datatype›,
‹attr› ‹datatype›,
.
.
.
MEMBER FUNCTION ‹func-name› [(‹parameter-list›)]
RETURN ‹datatype›,
.
.
.
MEMBER PROCEDURE ‹proc-name› [(‹parameter-list›)],
.
.
.
[ MAP MEMBER FUNCTION ‹func-name›
RETURN ‹datatype›, |
ORDER MEMBER FUNCTION ‹func-name›(‹var› ‹type›)
RETURN ‹datatype›]
);
/ ← dieser Slash ist unbedingt notwendig!
• ‹parameter-list› wie in PL/SQL,
• ähnlich CREATE TABLE, aber keine Integritätsbedingungen (erst bei der
(Objekt)tabellen-Definition)
Beispiel: Geo-Koordinaten
• Methode Distance(geo-coord-Wert)
• MAP-Methode: Entfernung von Greenwich.
T YPE B ODY
• Implementierung der Objektmethoden,
• muss der der bei CREATE TYPE vorgegebenen Signatur entsprechen,
• für alle deklarierten Methoden muss die Implementierung angegeben werden.
• Variable SELF, um auf die Attribute des Host-Objektes zuzugreifen.
Type Body
CREATE [OR REPLACE] TYPE BODY ‹type›
AS
MEMBER FUNCTION ‹func-name› [(‹parameter-list›)] RETURN ‹datatype›
IS
[‹var-decl-list›;]
BEGIN ‹PL/SQL-code› END;
:
MEMBER PROCEDURE ‹proc-name› [(‹parameter-list›)]
IS
[‹var-decl-list›;]
BEGIN ‹PL/SQL-code› END;
:
[ MAP MEMBER FUNCTION ‹func-name› RETURN ‹datatype› |
ORDER MEMBER FUNCTION ‹func-name›(‹var› ‹type›) RETURN ‹datatype›
IS
[‹var-decl-list›;]
BEGIN ‹PL/SQL-code› END; ]
END;
/
Beispiel: Geo-Koordinaten
CREATE OR REPLACE TYPE BODY GeoCoord
AS
MEMBER FUNCTION Distance (other IN GeoCoord) RETURN NUMBER
IS
BEGIN
RETURN 6370 * ACOS(COS([Link]/180*3.14)
* COS([Link]/180*3.14)
* COS(([Link] - [Link])/180*3.14)
+ SIN([Link]/180*3.14) * SIN([Link]/180*3.14));
END;
MAP MEMBER FUNCTION Distance_Greenwich RETURN NUMBER
IS
BEGIN
RETURN [Link](GeoCoord(51.5, 0));
END;
END;
/ [Filename: ObjRel/[Link]]
M ETHODENAUFRUF
• Funktionen: in Anfragen oder in PL/SQL-Programmen
• Prozeduren: in PL/SQL-Programmen
• Syntax: ‹object›.‹method-name›(‹argument-list›)
Beispiel
Wie groß ist der Abstand zwischen zwei Längengraden auf der Höhe von Berlin, bzw. am
Äquator?
SELECT geoCoord(52.45,-30).Distance(geoCoord(52.45,-31))
FROM DUAL;
SELECT geoCoord(0,-30).Distance(geoCoord(0,-31))
FROM DUAL;
S PALTENOBJEKTE
• Attribut eines Tupels oder eines Objekts ist objektwertig:
Z EILENOBJEKTE
• Elemente von Objekttabellen,
• ihre Attribute verhalten sich genauso wie die Attribute von Tupeltabellen,
• zusätzlich kann man Methoden aufrufen,
• referentielle Integritätsbedingungen zwischen bestehenden relationalen Tabellen und
solchen Objekttabellen wie üblich formulierbar,
• (erhalten eine eindeutige OID und sind damit referenzierbar)
Zeilenobjekte
Beispiel: CityORType
Objekt-Relationaler City-Typ:
• Spalten des Typs sind literal- oder objektwertig,
• noch keine Objektreferenzen
Zeilenobjekte
O BJEKTTABELLEN : Z EILENOBJEKTE
• der (ggf. mehrspaltige) Primärschlüssel wird als Tabellenbedingung angegeben,
• Die Fremdschlüsselbedingung auf die relationale Tabelle Country wird ebenfalls als
Tabellenbedingung angegeben:
Die VALUE()-Funktion
VALUE (‹var›)
selektiert eine Objektinstanz
SELECT VALUE(cty)
FROM ORCity cty; VALUE(Cty)(Name, Province, Country, Population,
Coordinates(Latitude, Longitude))
CityORType(’Berlin’, ’Berlin’, ’D’, 3472009, GeoCoord(52, 13))
CityORType(’Bonn’, ’Nordrh.-Westf., ’D’, 293072, GeoCoord(50, 8))
CityORType(’Stuttgart’, ’Baden-Württ., ’D’, 588482, GeoCoord(49, 9))
:
Die REF()-Funktion
REF (‹var›)
• eine Referenz auf das Objekt, die im Prinzip äquivalent zu dessen OID ist
• kann bei objektorientierter Modellierung (Siehe Abschnitt 283) als Wert einer
REF(‹type›)-Spalte verwendet werden,
• kann zur Überprüfung von Objektgleichheit verwendet werden
(wenn in der WHERE-Klausel “VALUE” anstatt “REF” verwendet würde, würden alle Städte mit
Population NULL mit sich selbst als “nicht nachgewiesenermaßen ungleich” gesehen und
ausgegeben werden)
MAP-Methoden: Beispiel
ORDER-M ETHODEN
• Vergleich von SELF mit einem anderen Objekt desselben Typs, das formal als Parameter
angegeben wird.
• Ergebnis: NUMBER
– x < 0 falls SELF < Parameter,
– 0 (Gleichheit), oder
– x > 0 falls SELF > Parameter.
• Mit
SELECT ...
FROM ‹tablename› x
ORDER BY VALUE(x)
werden die Ausgabeobjekte paarweise verglichen und entsprechend der ORDER-Methode
geordnet.
• Ein Beispiel hierfür ist die Erstellung der Fussball-Bundesligatabelle: Ein Verein wird vor
einem anderen plaziert, wenn er mehr Punkte hat. Bei Punktgleichheit entscheidet die
Tordifferenz. Ist auch diese dieselbe, so entscheidet die Anzahl der geschossenen Tore
(vgl. Aufgabe).
B EISPIEL /AUFGABE
Objektorientierte Modellierung
Geht über die Nutzung als “Datentypen” hinaus ...
• ... zu Modellierungsaspekten:
• Spezialisierung: Klassenhierarchie; Subtypen als Spezialisierung allgemeiner Typen.
• Objekt-Identität und Referenzen auf Objekte als Werte von Attributen zum Ausdrücken von
Beziehungen,
• Objekte: Wertattribute und Referenzattribute.
• Anfragen durch Navigation etc. (⇒ unsymmetrisch)
O BJEKTREFERENZEN
• Weiterer Datentyp für Attribute: Referenzen auf Objekte
‹ref-attr› REF ‹object-datatype›
• Objekttyp als Ziel der Referenz.
• nur Objekte, die eine OID besitzen – also Zeilenobjekte einer Objekttabelle – können
referenziert werden.
• Erzeugen einer Referenz (Selektieren einer OID) mit REF():
SELECT ..., REF(‹var›), ...
FROM ‹object-table› ‹var›
WHERE ... ;
Objektreferenzen: Constraints
• Type Body noch nicht definiert. Erstmal nur mit einem Objekt als Beispiel:
Einfügen unter Verwendung des Objektkonstruktors:
UPDATE Organization_ObjTab
SET hasHqIn =
( SELECT REF(cty)
FROM ORCity cty
WHERE Name = ’Brussels’ AND Province = ’Brabant’ AND Country = ’B’)
WHERE Abbrev = ’EU’;
[Filename (alles zusammen): Obj/[Link]]
Z YKLISCHE R EFERENZEN
Die Modellierung als Objektgraph (d.h., Beziehungen nicht durch Tabellen, sondern als
Objektreferenzen) führt oft zu Zyklen:
• City_Type: country REF Country_Type
• Country_Type: capital REF City_Type
• Deklaration jedes Datentypen benötigt bereits die Definition des anderen.
• Definition von unvollständigen Typen
“Forward-Deklaration”:
CREATE TYPE ‹name›;
/
• wird später durch eine komplette Typdeklaration ergänzt.
Unvollständige Datentypen
Unvollständige Datentypen können nur zur Definition von Referenzen auf sie benutzt werden,
nicht zur Definition von Spalten oder in geschachtelten Tabellen:
CREATE OR REPLACE TYPE City_type;
/
• Die Nutzung in Referenzen ist damit erlaubt:
CREATE TYPE city_list AS TABLE OF REF City_type;
/
CREATE OR REPLACE TYPE Country_Type AS OBJECT
( Name VARCHAR2(50),
• Die direkte Nutzung wäre erst erlaubt, wenn Ci-
Code VARCHAR2(4),
ty_type komplett ist:
Capital REF City_Type);
CREATE TYPE city_list_2 AS TABLE OF City_type;
/
/ – waere eine Tabelle von City-Objekten
CREATE OR REPLACE TYPE Country_Type_2 AS OBJECT
( Name VARCHAR2(50),
Code VARCHAR2(4),
Capital City_Type);
/ – Capital waere ein Spaltenobjekt
O BJEKTORIENTIERUNG : M ODELLIERUNGSASPEKTE
• Beziehungen durch Referenzattribute,
• Anfragen per Navigation (anstatt Join),
• können nur in einer Richtung verfolgt werden,
• erfordert also ggf. doppelte Speicherung,
• müssen dann auf beiden Seiten separat konsistent gehalten werden.
Beispiel/Aufgabe
• PL/SQL unterstützt keine Navigation entlang Pfadausdrücken (in SQL ist es erlaubt).
• Jede MEMBER METHOD besitzt einen impliziten Parameter SELF, der das jeweilige Host-Objekt
referenziert.
• Tabellenwertige Attribute können innerhalb PL/SQL wie PL/SQL-Tabellen behandelt
werden:
Built-in Methoden für Collections (PL/SQL-Tabellen) können auch auf tabellenwertige
Attribute angewendet werden:
‹attr-name›.COUNT: Anzahl der in der geschachtelten Tabelle enthaltenen Tupel
Verwendung in in PL/SQL eingebetteten SQL-Statements – z.B. SELECT ‹attr›.COUNT –
nicht erlaubt.
• Weitere Erweiterung: Java (siehe Folie 341).
Member-Methods: Beispiel
• FROM THE(SELECT ...) kann nicht durch FROM [Link] ersetzt werden (PL/SQL vs. SQL).
M ETHODENAUFRUFE
Funktionen
Prozeduren
M ODELLIERUNG VS . I MPLEMENTIERUNG
• Das Beispiel illustriert Objektmethoden und ihre Anbindung durch freie Methoden am
objektorientierten Szenario:
– Headquarter als Referenz,
– Mitglieder als geschachtelte Tabelle,
• man kann dieselben Methoden auch mit einer objektrelationalen Tabelle OROrganization,
und Ablegen der Mitgliedschaften in der Relation isMember implementieren (Aufgabe).
⇒ für den Benutzer bleiben die freien Methoden dieselben.
geo_object
• die Tabelle geo_obj ist eine Kollektion von Objekten der Klasse geo_obj_type (abstrakt)
• enthält Instanzen der finalen Subklassen, z.B. Flüsse und Berge.
• Substituierbarkeit:
“Ein Objekt eines Typs t kann überall auftreten, wo ein Objekt eines Obertyps von t
erwartet wird”
– Zeilenobjekte in Objekttabellen
– Spaltenobjekte (objektwertige Attribute)
– Referenzattribute
– Argumente und Rückgabewerten von Methoden
• select name from geo_obj;
da alle geo_objects einen Namen haben.
Speziellste Klassenzugehörigkeit
• SYS_TYPEID(‹object›)
ergibt die ID der speziellsten Klasse, zu der ein Objekt gehört
• herausfinden des Klassennamens in all_types
T YPTESTS
• ‹object› IS OF(‹type›)
testet ob ‹object› vom Typ ‹type› ist.
• normalerweise testet man Zugehörigkeit zu einem Subtyp des für die Tabelle bekannten
Typs.
T YPUMWANDLUNGEN
• TREAT (‹object› AS ‹type›)
behandelt ‹object› als eine Instanz des Typs ‹type›
• falls möglich
• sonst: NULL
SELECT [Link],
(TREAT (value(x) AS mountain_type)).elevation
FROM geo_obj x
WHERE value(x) IS OF (mountain_type);
Recht an Objekttypen:
GRANT EXECUTE ON ‹Object-datatype› TO ...
• bei der Benutzung eines Datentyps stehen vor allem die Methoden (u.a. die entsprechende
Konstruktormethode) im Vordergrund.
R EFERENTIELLE I NTEGRITÄT
• Vgl. FOREIGN KEY ... REFERENCES ... ON DELETE/UPDATE CASCADE
• Veränderungen an Objekten:
OID bleibt unverändert
→ referentielle Integrität bleibt gewahrt.
• Löschen von Objekten:
dangling references möglich.
Überprüfung durch
WHERE ‹ref-attribute› IS DANGLING
9.6 Object-Views
• maßgeschneiderte Object-Views mit sehr weitgehender Funktionalität
Legacy-Datenbanken: Integration bestehender Datenbanken in ein “modernes”
objektorientiertes Modell:
Objekt-Views über relationale Ebene legen:
“Objekt-Abstraktionen”
Effizienz + Benutzerfreundlichkeit:
Die relationale Repräsentation ist oft effizienter:
• Geschachtelte Tabellen intern als separate Tabellen gespeichert.
• n : m-Beziehungen: gegenseitige geschachtelte Tabellen notwendig.
⇒ Definition eines relationalen Basisschemas mit Object-Views.
Einfache Modifizierbarkeit: CREATE OR REPLACE TYPE und ALTER TYPE nur sehr
eingeschränkt
⇒ Veränderungen durch Neudefinition geeigneter Object-Views abfangen.
Häufige Empfehlung: Object Views mit geschachtelten Tabellen, Referenzen etc. auf Basis
eines relationalen Grundschemas verwenden.
O BJECT-V IEWS
Benutzer führt seine Änderungen auf dem durch die Objektviews gegebenen externen Schema
durch.
• enthalten Zeilenobjekte, d. h. hier werden neue Objekte definiert.
• Abbildung direkter Änderungen (INSERT, UPDATE und DELETE) durch INSTEAD OF-Trigger auf
das darunterliegende Schema.
• Benutzer darf erst gar keine solchen Statements an das View stellen. Entsprechende
Funktionalität durch Methoden der Objekttypen, die die Änderungen direkt auf den
zugrundeliegenden Basistabellen ausführen.
Syntax
• durch WITH OBJECT OID ‹attr-list› wird angegeben, wie die Objekt-ID berechnet wird
werden soll.
• Verwendung von CAST und MULTISET.
CREATE [OR REPLACE] VIEW ‹name› OF ‹type›
WITH OBJECT OID (‹attr-list›)
AS ‹select-statement›;
• in ‹select-statement› wird kein Objektkonstruktor verwendet!
9.6 Objekt-Relationale Konzepte 319
Praktikum: Datenbankprogrammierung in SQL/ORACLE
9.8 Fazit
Kapitel 10
Embedded SQL
KOPPLUNGSARTEN ZWISCHEN DATENBANK - UND P ROGRAMMIERSPRACHEN
Embedded-SQL-Programm
z.B. [Link]/[Link]
Metadaten
Embedded-SQL-Precompiler
Quellprogramm
z.B. demo1.c/[Link]
Datenbank
(C-)Compiler/Linker
ausführbares Programm
z.B. demo1/[Link]
• SQLJ (siehe Folie 401): Zwischenschritt bei der Compilierung muss nicht separat
ausgeführt werden.
V ERBINDUNGSAUFBAU
H OSTVARIABLEN
• Kommunikation zwischen Datenbank und Anwendungsprogramm
• Output-Variablen übertragen Werte von der Datenbank zum Anwendungsprogramm
• Input-Variablen übertragen Werte vom Anwendungsprogramm zur Datenbank.
• jeder Hostvariablen zugeordnet: Indikatorvariable zur Verarbeitung von NULL-Werten.
• werden in der Declare Section deklariert:
EXEC SQL BEGIN DECLARE SECTION;
int population; /* host variable */
short population\_ind; /* indicator variable */
EXEC SQL END DECLARE SECTION;
• in SQL-Statements wird Hostvariablen und Indikatorvariablen ein Doppelpunkt (“:”)
vorangestellt
• Datentypen der Datenbank- und Programmiersprache müssen kompatibel sein
I NDIKATORVARIABLEN
• -1 : der Attributwert ist NULL, der Wert der Hostvariablen ist somit undefiniert.
• 0 : die Hostvariable enthält einen gültigen Attributwert.
• >0 : die Hostvariable enthält nur einen Teil des Spaltenwertes. Die Indikatorvariable gibt
die ursprüngliche Länge des Spaltenwertes an.
• -2 : die Hostvariable enthält einen Teil des Spaltenwertes wobei dessen ursprüngliche
Länge nicht bekannt ist.
• -1 : unabhängig vom Wert der Hostvariable wird NULL in die betreffende Spalte eingefügt.
• >=0 : der Wert der Hostvariable wird in die Spalte eingefügt.
C URSORE
• Analog zu PL/SQL
• notwendig zur Verarbeitung einer Ergebnismenge, die mehr als ein Tupel enthält
Cursor-Operationen
• DECLARE ‹cursor-name› CURSOR FOR ‹sql statement›
• OPEN ‹cursor-name›
• FETCH ‹cursor-name› INTO ‹varlist›
• CLOSE ‹cursor-name›
Fehlersituationen
• der Cursor wurde nicht geöffnet bzw. nicht deklariert
• es wurden keine (weiteren) Daten gefunden
• der Cursor wurde geschlossen, aber noch nicht wieder geöffnet
Beispiel
int main() {
EXEC SQL BEGIN DECLARE SECTION;
char cityName[50]; /* output host var */
int cityEinw; /* output host var */
char* landID = "D"; /* input host var */
short ind1, ind2; /* indicator vars */
char* uid = "/";
EXEC SQL END DECLARE SECTION;
EXEC SQL CONNECT :uid; /* Verbindung zur Datenbank herstellen */
EXEC SQL DECLARE StadtCursor CURSOR FOR /* Cursor deklarieren */
SELECT Name, Einwohner FROM Stadt WHERE Code = :landID;
EXEC SQL OPEN StadtCursor; /* Cursor oeffnen */
printf("Stadt Einwohner\n");
while (1)
{ EXEC SQL FETCH StadtCursor INTO :cityName:ind1 ,
:cityEinw INDICATOR :ind2;
if(ind1 != -1 && ind2 != -1)
{ printf("%s %d \n", cityName, cityEinw); }}; /* keine NULLwerte ausgeben *
EXEC SQL CLOSE StadtCursor; }
H OSTARRAYS
• sinnvoll, wenn die Größe der Antwortmenge bekannt ist oder nur ein bestimmter Teil
interessiert.
• vereinfacht Programmierung, da damit häufig auf einen Cursor verzichtet werden kann.
• verringert zudem Kommunikationsaufwand zwischen Client und Server.
DYNAMISCHES SQL
T RANSAKTIONEN
• Anwendungsprogramm wird als geschlossene Transaktion behandelt, falls es nicht durch
COMMIT- oder ROLLBACK-Anweisungen unterteilt ist
• In Oracle wird nach Beendigung des Programms automatisch ein COMMIT ausgeführt
• DDL-Anweisungen generieren vor und nach ihrer Ausführung implizit ein COMMIT
• Verbindung zur Datenbank durch
EXEC SQL COMMIT RELEASE; oder
EXEC SQL ROLLBACK RELEASE;
beenden.
• Savepoints: EXEC SQL SAVEPOINT <name>
WHENEVER-Statement
spezifiziert Aktionen die im Fehlerfall automatisch vom DBS ausgeführt werden sollen.
EXEC SQL WHENEVER ‹condition› ‹action›;
‹condition›
• SQLWARNING : die letzte Anweisung verursachte eine “no data found” verschiedene Warnung
(siehe auch sqlwarn). Dies entspricht sqlcode > 0 aber ungleich 1403.
• SQLERROR : die letzte Anweisung verursachte einen (ernsthaften) Fehler. Dies entspricht
sqlcode < 0.
• NOT FOUND : SELECT INTO bzw. FETCH liefern keine Antworttupel zurück. Dies entspricht
sqlcode 1403.
‹action›
• CONTINUE : das Programm fährt mit der nächsten Anweisung fort.
• DO flq proc_name› : Aufruf einer Prozedur (Fehlerroutine); DO break zum Abbruch einer
Schleife.
• GOTO ‹label› : Sprung zu dem angegebenen Label.
• STOP: das Programm wird ohne commit beendet (exit()), stattdessen wird ein rollback
ausgeführt.
Kapitel 11
Java und Datenbanken
• Java: plattformunabhängig
• überall, wo eine Java Virtual Machine (JVM) läuft, können Java-Programme ablaufen.
• APIs: Application Programming Interfaces; Sammlungen von Klassen und Schnittstellen,
die eine bestimmte Funktionalität bereitstellen.
Mehrere der bisher behandelten Aspekte können mit Java gekoppelt werden:
• Prozeduren und Funktionen, Member Methods: Java Stored Procedures (Folie 341),
• Objekttypen: Java Object Types (Folie 347)
(so kann man beliebige Datenstrukturen implementieren und anbieten → XML),
• Low-Level-Infrastruktur für Datenbankzugriff aus Java: JDBC (Folie 354),
• Embedded SQL (intern basierend auf JDBC): SQLJ (Folie 401).
S TANDARDISIERUNG
• JDBC ist ein Java-API, das (DB-produktunabhängigen) low-level-Datenbankzugriff aus
Java erlaubt.
• SQLJ: ANSI-Standard als Teil des SQL-Standards, bestehend aus drei Teilen:
– Part 0: Embedded SQL in Java (ANSI X3.135.10-1998, bzw ISO-Standard “Database
Language SQL:1999 – Part 10: Object Language Bindings (SQL/OLB)”; siehe Abschnitt
“SQLJ”)
– Part 1: SQL routines using Java (ANSI NCITS 331.1-1999, siehe Abschnitt “Java in
Stored Procedures”).
– Part 2: SQL types using Java (ANSI NCITS 331.2-2000, siehe Abschnitt “Java in
SQL-Objekttypen”, u.a. → XMLType).
– Part 1 und 2 bilden zusammen Part 13 des SQL:1999-Standards (ISO/IEC
9075-13:2002) “SQL Routines and Types Using the Java Programming Language
(SQL/JRT)”
import [Link].*;
JDBC-A RCHITEKTUR
JDBC-Treiber-
Java-Programm Oracle-Treiber Oracle-DB
Manager
.. ..
. .
MySQL-Treiber MySQL-DB
JDBC-A RCHITEKTUR
• Kern: Treiber-Manager ([Link])
• darunter: Treiber für einzelne DBMS’e
JDBC-API
• flexibel:
– Applikation kann unabhängig vom darunterliegenden DBMS programmiert werden
• “low-level”:
– Statements werden durch Strings übertragen
– im Gegensatz zu SQLJ (später) keine Verwendung von Programmvariablen in den
SQL-Befehlen
(d.h. Werte müssen explizit eingesetzt werden)
Darauf aufbauend:
• Embedded SQL für Java (SQLJ)
• direkte Darstellung von Tabellen und Tupeln in Form von Java-Klassen
JDBC-F UNKTIONALITÄT
• Aufbau einer Verbindung zur Datenbank (DriverManager, Connection)
• Versenden von SQL-Anweisungen an die Datenbank (Statement, PreparedStatement und
CallableStatement)
• Verarbeitung der Ergebnismenge (ResultSet)
V ERBINDUNGSAUFBAU
• DriverManager erzeugt offene Verbindungs-Instanz:
Connection conn = [Link](‹jdbc-url›, ‹user-id›, ‹passwd›);
oder
Connection conn = [Link](‹jdbc-url›, ‹props-filename›);
(Login-Daten aus Datei, via [Link]).
• Datenbank wird eindeutig durch die JDBC-URL bezeichnet:
– jdbc:<subprotocol>:<subname>
– <subprotocol>: Name des produktspezifischen Treiber-Protokolls
– <subname> ist produktspezifisch zusammengesetzt
Bei uns, mit einer Oracle-Datenbank:
jdbc:oracle:‹driver-name›:@//‹IP-Address DB Server›:‹Port›/‹Service›
String url =
’jdbc:oracle:thin:@//[Link]/[Link]’;
(die aktuelle URL steht hoffentlich auf dem Aufgabenblatt)
• Verbindung beenden: [Link]();
Statement-Objekte
• werden durch Aufruf von Methoden einer bestehenden Verbindung ‹connection› erzeugt.
• Statement: einfache SQL-Anweisungen ohne Parameter
• PreparedStatement: Vorcompilierte Anfragen, Anfragen mit Parametern
• CallableStatement: Aufruf von gespeicherten Prozeduren
K LASSE “S TATEMENT ”
Statement ‹name› = ‹connection›.createStatement();
Sei ‹string› ein SQL-Statement ohne Semikolon.
• ResultSet ‹statement›.executeQuery(‹string›):
SQL-Anfragen an die Datenbank. Dabei wird eine Ergebnismenge zurückgegeben.
• int ‹statement›.executeUpdate(‹string›): SQL-Statements, die eine Veränderung an
der Datenbasis vornehmen (einschliesslich DDL-Statements). Der Rückgabewert gibt an,
wieviele Tupel von der SQL-Anweisung betroffen waren.
• boolean ‹statement›.execute(‹string›) – Sonstiges:
– Aufrufe von Prozeduren/Funktionen (siehe CallableStatements),
– Oracle: PL/SQL-Blocks sind auch erlaubt (siehe Folie 392),
– Statement dynamisch als String erzeugt, und man weiß nicht, ob es eine Query oder ein
Update ist,
– “true” wenn das (erste) Ergebnis ein ResultSet ist; “false” sonst (siehe Folie 389).
Ein Statement-Objekt kann beliebig oft wiederverwendet werden, um SQL-Anweisungen zu
übermitteln.
Mit der Methode close() kann ein Statement-Objekt geschlossen werden.
Beispiel-Code
import [Link].*;
class JdbcCities {
public static void main (String args []) throws SQLException
{ // Oracle-Treiber laden
[Link] (new [Link]());
// Verbindung zur Datenbank herstellen
String url = "jdbc:oracle:thin://@[Link]/[Link]";
Connection conn = [Link](url,"scott","tiger");
// Anfrage an die Datenbank
Statement stmt = [Link]();
ResultSet rset = [Link]("SELECT Name, Population FROM City");
while ([Link]()) { // Ergebnis verarbeiten
String s = [Link](1);
int i = [Link]("Population");
[Link] (s + " " + i + "\n");
}
[Link](); [Link](); [Link]();
}}
• [Link] (Dateiname ist frei wählbar) ist eine Datei (bzw. Datei im .jar-Archiv), die
folgendermassen aussieht:
#[Link]:
## fuer normales JDBC
url=jdbc:oracle:thin:@//[Link]/[Link]
user=scott
password=tiger
### fuer SQLJ dasselbe nochmal
[Link]=jdbc:oracle:thin:@//[Link]/[Link]
[Link]=scott
[Link]=tiger
[Filename: Java/[Link] – muss jeder selber schreiben]
• Eine Datei dieser Form kann man in eine Instanz von [Link] einlesen (ein
key-Value-Hash) und dann mit getProperty() oder automatisch abfragen.
• [Link] ggf. mit ins .jar legen.
• JDBC steht zwischen Java (Objekttypen) und SQL (Typen mit unterschiedlichen Namen).
• [Link] definiert generische SQL-Typen, mit denen JDBC arbeitet:
(oft Subklassen der Java-Typen)
• Für Instanzen von Spaltenobjekten wird “null” ausgegeben, oder man erhält sogar einen
Fehler:
dbis@c42> java jdbcSelect mountain
• Objekte mit getObject(n) auslesen
(behandelt auch Strings, Zahlen etc. korrekt)
• Instanzen von mit PL/SQL benutzerdefinierten SQL-Typen haben als SQL-Typ (aus den
Metadaten mit [Link](i)) [Link] und
implementieren das Interface [Link].
• Objekttyp-Name (aus der Instanz): String name = [Link]()
• attribute: Object[ ] attrs = [Link]()
enthält dann Strings, Zahlwerte, oder wieder Objekte
• gibt die Instanzen von via PL/SQL definierten Objekttypen generisch als STRUCTS,
Kontruktoraufruf und Parameter (ohne Komma zwischen den Parametern) aus:
dbis@c42> java jdbcSelectObj mountain
Ausgabe der Koordinaten z.B. als [Link](19.2 -98.6) .
• Wenn man Methoden/Felder einer Instanz einer Java-Klasse verwenden will, die bei Object
nicht automatisch definiert sind, muss man entsprechend testen (Java-Typen haben als
[Link] bei Oracle die Konstante 2008) und explizit casten.
import [Link].*;
import [Link];
import [Link];
class JdbcSelectObjCast {
public static void main (String args []) throws Exception {
[Link](new [Link]());
Properties props = new Properties();
[Link](new FileInputStream("[Link]"));
Connection conn = [Link]([Link]("url"), props);
Statement stmt = [Link]();
ResultSet rset = [Link]("SELECT * FROM " + args[0]);
ResultSetMetaData rsmd = [Link]();
int numCols = [Link]();
P REPARED S TATEMENTS
PreparedStatement ‹name› =
‹connection›.prepareStatement(‹string›);
• SQL-Anweisung ‹string› wird vorcompiliert.
• damit ist die Anweisung fest im Objektzustand enthalten
• effizienter als Statement, wenn ein SQL-Statement häufig (mit ggf. verschiedenen
Parametern) ausgeführt werden soll.
• Abhängig von ‹string› ist eine der (parameterlosen!) Methoden
– ‹prepared-statement›.executeQuery() → ResultSet
oder
– ‹prepared-statement›.executeUpdate() → boolean
anzuwenden.
Wenn man (String automatisch erstellt) das nicht weiss, kann man execute() anwenden
(siehe Folie 389).
Beispielsequenz:
[Link](1,"D");
ResultSet rset = [Link]();
if ([Link]()) [Link]([Link](1));
[Link](1,"CH");
ResultSet rset = [Link]();
if ([Link]()) [Link]([Link](1));
PreparedStatement (Cont’d)
Beispiel: PreparedStatement
import [Link].*;
import [Link];
import [Link];
class JdbcCountryPop {
public static void main (String args []) throws Exception {
[Link](new [Link]());
Properties props = new Properties();
[Link](new FileInputStream("[Link]"));
Connection conn = [Link]([Link]("url"), props);
PreparedStatement giveCountryPop =
[Link]("SELECT Population FROM Country WHERE Code = ?");
[Link](1,args[0]);
ResultSet rset = [Link]();
if([Link]()) {
dbis@c42> java JdbcCountryPop D
int pop = [Link](1);
dbis@c42> java JdbcCountryPop X
if ([Link]()) [Link]("null");
else [Link](pop); }
else [Link]("No existing country code");
[Link]();
}} [Filename: Java/[Link]]
Der Aufruf einer Prozedur oder Funktion wird als CallableStatement-Objekt erzeugt:
• Aufrufsyntax von Prozeduren bei den verschiedenen Datenbanksystemen unterschiedlich
⇒ JDBC verwendet eine generische Syntax per Escape-Sequenz (Umsetzung dann durch
Treiber)
CallableStatement ‹name› =
‹connection›.prepareCall("{call ‹procedure/function pattern›}");
CallableStatement cstmt =
[Link]("{call bla()}");
Beispiel: CallableStatement
import [Link].*;
import [Link];
import [Link];
class JdbcCallProc {
public static void main (String args []) throws Exception {
[Link](new [Link]());
Properties props = new Properties();
[Link](new FileInputStream("[Link]"));
Connection conn = [Link]([Link]("url"), props);
[Link](string)/executeBatch()
[Link]()
[Link]()
Sonderfall: ‹string› dynamisch generiert. Wenn man nicht weiß, ob es eine Query oder ein
Update oder sogar ein Call ist, kann man mit execute() generisch vorgehen.
• erste Annahme: liefert nur ein Ergebnis: ein ResultSet oder einen UpdateCount.
• boolean ‹stmt›.execute(‹string›),
boolean ‹prepstmt›.execute(),
(boolean ‹callstmt›.execute() ist immer mit execute(), kein Rückgabeobjekt, boolean =
false.)
• “true” wenn das (erste) Ergebnis ein ResultSet ist;
“false” sonst.
• ResultSet ‹stmt›.getResultSet(): Falls das (erste) Ergebnis eine Ergebnismenge ist,
wird diese zurückgegeben; falls kein Ergebnis mehr vorhanden, oder das (erste) Ergebnis
ein Update-Zähler ist: null zurückgeben.
• int ‹stmt›.getUpdateCount(): Falls das (erste) Ergebnis ein Update-Zähler ist, wird
dieser (n ≥ 0) zurückgegeben; falls kein Ergebnis mehr vorhanden, oder das (erste)
Ergebnis eine Ergebnismenge ist, wird -1 zurückgegeben.
Test: Folge von Statements als PL/SQL-Block mit execute() verarbeiten, PL/SQL (Oracle)
import [Link]; import [Link]; import [Link];
import [Link]; import [Link]; import [Link];
public class JdbcSequenceOracle {
public static void main(String[] args){
try { Properties props = new Properties();
[Link](new FileInputStream("[Link]"));
Connection con = [Link]([Link]("url"), props);
String sql = "DECLARE s varchar2(20);" +
"BEGIN SELECT name INTO s FROM continent WHERE name=’Asia’; " +
"DELETE FROM continent; UPDATE country SET population=80000000 WHERE code=’D’; END;";
Statement stmt = [Link]();
boolean hasMoreResultSets = [Link](sql);
while ( hasMoreResultSets || [Link]() != -1 ) {
if ( hasMoreResultSets ) { // if has rs
ResultSet rs = [Link]();
int size = 0; while ([Link]()) { size++; }
[Link]("Result set size: " + size); }
else { // if ddl/dml/... • in PL/SQL sind keine DDL-
int queryResult = [Link](); Statements erlaubt,
[Link](queryResult + " tuples updated");
• die Sequenz wird ausgeführt, aber
} // check whether to continue in the loop:
hasMoreResultSets = [Link](); } liefert keinerlei Rückgabewerte.
[Link](); [Link]();
} catch (Exception e) { [Link](); } } } [Filename: Java/[Link]]
11.3 Java und Datenbanken 392
Praktikum: Datenbankprogrammierung in SQL/ORACLE
T RANSAKTIONSSTEUERUNG
• Hinweis: “commit” als Statement-String ist nicht erlaubt (es tut einfach nichts)!
Per Default ist für eine Connection der Auto-Commit-Modus gesetzt:
• implizites Commit nach jeder ausgeführten Anweisung (Transaktion besteht also nur aus
einem Statement)
• [Link](false) schaltet den Auto-Commit-Modus aus und man muss explizite
Commits ausführen.
Dann hat man die folgenden Methoden:
• [Link](String name) (setzt Sicherungspunkt)
• [Link]() (macht Änderungen persistent)
• [Link]([‹savepoint›)] (nimmt alle Änderungen [bis zu ‹savepoint›] zurück.
F EHLERBEHANDLUNG IN A NWENDUNGEN
• JDBC-Aufrufe werfen ggf. SQLExceptions.
• Nicht geschlossene Verbindungen bleiben offen.
• SQL-Ausführung in try-catch-Block mit finally einbetten:
Connection con = null;
Statement stmt = null;
ResultSet rset = null;
try {
... con, stmt, rset aufbauen und verarbeiten ...
} catch (SQLException e) { [Link](); }
finally { [Link](); [Link](); [Link](); }
F EHLERBEHANDLUNG , E FFIZIENZ
• Wenn die Java-Objekte conn, stmt, rset nur lokal sind, baut der Garbage-Collector sie auch
schnell genug ab und schließt die Verbindungen.
• Bei häufigem Kontakt zu derselben Datenbank ist es effizienter, Connection-Objekte nur
einmal zu erzeugen/aufzubauen und dann in einem Pool zu verwalten:
[Link]‹T›
• [Link]() gibt die Connection dann an den Pool zurück.
• In diesem Fall werden bei Fehlern liegengebliebene Connections ohne try-catch-finally
nicht zurückgegeben, und bleiben offen.
⇒ bei 150 (default) Connections blockiert der Server:
[Link]: I/O-Fehler: Got minus one from a read call
Fehlerbehandlung - Demo
import [Link].*;
import [Link]; import [Link]; import [Link];
class JdbcConnectionOverflow {
public static void main (String args [])
throws Exception {
[Link](new [Link]());
Properties props = new Properties();
[Link](new FileInputStream("[Link]"));
String url = [Link]("url");
Connection conn; Statement stmt; ResultSet rset;
int i = 0;
HashSet<Connection> s = new HashSet<Connection>();
while (true) {
try { [Link](200); i++; [Link](i);
conn = [Link](url, props);
[Link](conn);
stmt = [Link]();
rset = [Link]("select * from qwertz");
} catch (SQLException e) { [Link](); }
catch (InterruptedException ex) { [Link]().interrupt(); }
}}}
[Filename: Java/[Link]]
/* ADMIN only:
select username, count(*) from V$SESSION group by username; */
Es kann vorkommen, dass JDBC-Aufrufe plötzlich lange dauern (und beim nächsten Versuch
wieder schnell gehen usw.).
Siehe [Link]
the-db-suddenly-become-very-slow-using-sqlcl/
Der Oracle JDBC Driver benötigt eine Zufallszahl, um die Verbindungsdaten zu verschlüsseln.
Die übliche Art, wie diese mit /dev/random generiert werden, kann stocken.
Abhilfe: Aufruf von java mit:
java -[Link]=[Link] java-file argumente
EXEC getPopulation(’D’);
80219712
11.5 SQLJ
Realisierung des “Embedded SQL”-Konzeptes für Java:
• Standardisierte Spracherweiterung, SQLJ-Programm
• Eingebettete SQLJ-Aufrufe werden vom Precompiler [Link]
DBMS_JAVA.GET_OJVM_PROPERTY(PROPSTRING=>’[Link]’)
--------------------------------------------------------------------------------
1.8.0_331
A NWEISUNGEN IN SQLJ
• Anfragen:
#sql anIterator
= {SELECT name, population FROM country};
wobei anIterator ein (auch per SQLJ) geeignet definierter Iterator ist.
• DML und DDL:
#sql{‹statement›};
• Prozeduraufrufe:
#sql{CALL ‹proc_name›[(‹parameter-list›)]};
• Funktionsaufrufe:
#sql ‹variable›=
{VALUES(‹func_name›[(‹parameter-list›)])};
• Aufruf unbenannter Blöcke:
#sql {BEGIN ... END};
V ERBINDUNGSAUFBAU ZU O RACLE
Ausführliche Variante
import [Link].*;
import [Link];
//--------------
import [Link].*;
import [Link];
:
String url = "jdbc:oracle:thin:@//[Link]/[Link]-goettingen.
String user = "...";
String passwd = "...";
[Link] (new [Link]());
Connection con = [Link](url,user,passwd);
DefaultContext ctx = new DefaultContext(con);
[Link](ctx);
[Link](url, user, passwd);
//--------------
• verwendet [Link]
import [Link].*;
import [Link];
:
[Link](<JavaClass>.class, "[Link]");
:
• <JavaClass>.class ist eine Klasse, die im Dateisystem/jar-Archiv im selben Verzeichnis
wie [Link] liegt (der Name dieser Klasse dient nur dazu, [Link] zu finden!).
H OSTVARIABLEN
• Verwendung von Variablen einer Host-Sprache (hier Java) in SQL-Statements
• Dient dem Datenaustausch zwischen Datenbank und Anwendungsprogramm
• in SQLJ-Statements wird Hostvariablen ein Doppelpunkt (“:”) vorangestellt
• Datentypen der Datenbank- und Programmiersprache müssen kompatibel sein (siehe
JDBC)
In Host-Variablen schreiben:
int countries;
#sql{SELECT COUNT(*) INTO :countries FROM country};
I TERATOREN
• Allgemein: Design-Pattern, sequenzieller Zugriff auf alle Objekte, die in einem Container
enthalten sind
• Hier: Iteratoren bilden das Cursor-Konzept auf SQLJ ab.
• Iteratoren mit benannten Spalten:
– Spaltenzugriff über Spaltennamen
‹var›:= ‹iterator›.namei ()
– Weiterschaltung mit ‹iterator›.next()
• Positionsiteratoren:
– Spaltenzugriff über Positionen,
– dabei Weiterschaltung
– im embbedded-SQL-escape
#sql{FETCH :‹iterator› INTO :‹var›1 , ... , :‹var›n }
(Syntax im Stil des Datenbankzugriffs bei Netzwerkdatenbanken im CODASYL-Standard
(1964))
Positionsiteratoren
import [Link].*; import [Link];
class sqljPosIteratorExample {
public static void main (String args []){
try { // Datenbank-Verbindung aufbauen
[Link]([Link], "[Link]");
// Deklaration des Iterators nur mit Typen
#sql iterator CountryPosIterator(String, int);
// Hilfsvariablen der Hostsprache
String name = "";
int pop = 0;
CountryPosIterator cIter; // Iteratorinstanz definieren
// Initialisieren des Iterators mit der SQL-Anweisung
#sql cIter = {SELECT name, population FROM country};
// Abarbeitung der Ergebnismenge durch Iteration
while (true) { // hole naechsten Datensatz
#sql{FETCH :cIter INTO :name,:pop};
// Ende des Iterators erreicht?
if([Link]()) break;
[Link](name + " has " + pop + " inhabitants."); }
[Link](); [Filename: Java/[Link]]
} catch (SQLException e) { [Link]([Link]()); } } }
11.5 Java und Datenbanken 409
Praktikum: Datenbankprogrammierung in SQL/ORACLE
JDBC SQLJ
int countries;
Statement stmt = [Link]();
String query = "SELECT COUNT(*) FROM country";
ResultSet rset = [Link](query);
[Link]();
countries = [Link](1);
int countries;
#sql{SELECT COUNT(*) INTO :countries FROM country};
E NTWICKLUNGSLINIE O RACLE
• 1977: Gründung durch Larry Ellison, Bob Miner, Ed Oates und Bruce Scott
• 1979: erstes Produkt
• 1992: Oracle 7
• letzte 7er (1997): 7.3.4: erste JDBC-Version
• 1997/1998: Oracle 8 (bis 8.0.4): Objekttypen, Nested Tables
• 3.1999: Oracle 8i/8.1.5 (i = Internet); JVM, Java Stored Procedures & Member Methods,
SQLJ
• 2.2001: Oracle 8.1.6: ein bisschen XML-Support (als Java-Tools)
• 6.2001: Oracle 9i: Java-Klassen als Object Types, Vererbung
• 5.2002: 9i-R2/9.2.0: verbesserter XML-Support (XMLType)
• 2003: Oracle 10g (g = Grid); Recycle Bin, XPath, XQuery
• 2007: 11g
• 2013: 12c: VARCHAR2 bis zu 32767 Bytes; Container-DB mit bis zu 252 Pluggable-DBs
Kapitel 12
SQL und XML
12.1 XML: “Extensible Markup Language”
... mehr als nur “Language”: Datenmodell, viele Sprachen
• Instantiierung von SGML (vgl. HTML)
• mit anwendungsspezifischen Tags
⇒ wer HTML kennt, weiß, wie XML “aussieht”.
• Baumstruktur, rekursiver Aufbau
• Elemente (Name, Attribute und Inhalt)
• Navigation im Baum
• vgl. Pfadausdrücke in Java, OQL, SQL; (z.B. [Link])
• Pfadausdrücke in Unix: (z.B. /home/may/teaching/dbp/[Link])
⇒ Adressierungssprache “XPath”
XML: B EISPIEL
<country id="D" capital="cty-Germany-Berlin">
<name>Germany</name>
<total_area>356910</total_area>
<population year="2011">80219695</population>
<encompassed continent="europe">100</encompassed>
<ethnicgroup name="German">85</ethnicgroup>
<ethnicgroup name="Polish">2.5</ethnicgroup>
<religion name="Roman Catholic">28.5</religion>
<religion name="Protestant">27.5</religion>
<language name="German">95</language>
<border country="F">451</border>
<border country="A">784</border>
<border country="CZ">646</border>
<province id="prov-Germany-Baden-Wuerttemberg">
<name>Baden Württemberg</name>
<area>35742</area>
<population year="2011">10486660</population>
<city id="cty-Germany-Stuttgart">
<name>Stuttgart</name>
:
<latitude>48.7</latitude>
<longitude>9.1</longitude>
<population year="2011">585890</population>
</city>
<city id="cty-Germany-Mannheim">
<name>Mannheim</name>
:
</city>
:
</province>
<province id="prov-Germany-Berlin">
<name>Berlin</name>
<area>889</area>
<population year="2011">3292365</population>
<city id="cty-Germany-Berlin">
<name>Berlin</name>
<latitude>52.45</latitude>
<longitude>13.3</longitude>
<population year="2011">3292365</population>
</city>
</province>
:
</country>
12.1 XML und SQLX 415
Praktikum: Datenbankprogrammierung in SQL/ORACLE
XML
(Siehe Vorlesung “Semistrukturierte Daten und XML”)
• Verwendung:
– Dokumente
– Datenaustausch
– Datenspeicherung
• sehr flexibles “Datenmodell”: DOM-API
rekursiv definierte Baumstruktur aus
– Elementen,
– Attributen und
– Textknoten.
• Schema: DTD (Document Type Description), XML Schema
• Erweiterungen: XPath, XPointer, XLink
• Anfragesprache: XQuery
• Transformationssprache: XSL/XSLT
• Als Repräsentationssprache für viele Anwendungen genutzt