E - Beuth Hochschule für Technik Berlin

Werbung
SQL/92
Standardkataloge
- Eine Menge von Views (mit Standardnamen) beschreibt die Metadaten eines Kataloges.
- Es gibt eine "Schema Manipulation Language" zum Entfernen von
DB-Objekten - mit zwei Verhaltensweisen:
. RESTRICT = Verbot der Durchführung, wenn existierende Objekte
durch das Löschen in Mitleidenschaft gezogen werden.
. CASCADE = vollzieht die Löschung auch bei abhängigen Objekten
in irgendeiner Form.
- Datenbankobjekte:
SQL environment
implementation
character set
collation
TFH Berlin
authorization
identifier
table
column
catalog
/schema
viewed
table
constraint
domain
column
module
assertion
constraint
privilege
translation
SQL/92
Neue Datentypen
Data Type
Numeric
Exact
String
Datetime
Approximate
Bit
Fixed
Varying
Interval
Date
Time
Timestamp
Character
Fixed
Varying
Varying CHAR (Varying Length Character String) soll voll kompatibel mit dem festen Charaktertyp sein.
BIT-Strings sind ein neuer Datentyp. Es gibt eine Menge von Stringoperationen, z.B. Konkatenation,
Position, Substring, Gross-Klein-Transformation, Blank oder andere Elimination. Zeichenmengen und
-reihenfolgen werden benutzerdefiniert.
Der Typ DATE hat die Werte YEAR, MONTH, DAY.
Der Typ TIME hat die Werte HOUR, MINUTE, SECOND (und Bruchteile).
Der Typ TIMESTAMP hat die Werte YEAR, MONTH, DAY, HOUR, MINUTE, SECOND (und Bruchteile).
Werte für Intervalle können sein: YEAR, MONTH oder DAY, HOUR, MINUTE, SECOND (und Bruchteile).
TFH Berlin
SQL/92
Mehr Orthogonalität
Konstruktoren für Zeilen und Tabellen
INSERT INTO province
VALUES (('BC','British Columbia'), ('AB','Alberta'), ...('NF','Newfoundland'))
SELECT nation, population
FROM nations
UNION ALL
VALUES ('Quebec',6000000), ('California',24000000)
Prädikate operieren eher über Zeilen als über Skalare.
(SELECT lname, fname FROM people WHERE ...)
=
(SELECT last, first FROM hobbies WHERE ...)
Eine Subquery kann überall benutzt werden, wo ein Ausdruck erlaubt ist.
SELECT * FROM people
WHERE (lname, fname) = (SELECT last, first FROM hobbies
WHERE hobby = 'travel')
SELECT AVG(salary),
(SELECT AVG(salary) FROM mgr_employee),
(SELECT AVG(salary) FROM temp_employee)
SELECT last, first, (SELECT description
FROM hobby_description h
WHERE h.name = hobbies.hobby)
FROM hobbies
WHERE ...
UPDATE employee
SET salary = (SELECT MAX(salary)
FROM mgr_employee
WHERE employee.name = 'Doe')
UPDATE employee
SET salary = (SELECT MAX(salary)
FROM mgr_employee)
WHERE employee.name = 'Doe'
TFH Berlin
SQL/92
Neue Jointypen
People
Hobbies
lname fname
nick
last
first
hobby
Holland William
Smith Roberta
Bill
Bobbie
Holland William Fishing
Zysko Ana
Painting
cross join (neue Syntax)
SELECT * FROM (people
CROSS JOIN hobbies) AS result
früher: SELECT *
FROM people, hobbies
lname fname
nick
last
first
Holland William
Holland William
Smith Roberta
Smith Roberta
Bill
Bill
Bobbie
Bobbie
Holland William
Zysko Ana
Holland William
Zysko Ana
hobby
Fishing
Painting
Fishing
Painting
inner join (neue Syntax)
SELECT * FROM (people
INNER JOIN hobbies
ON lname=last) AS result
früher: SELECT *
FROM people, hobbies
WHERE lname = last
lname fname
nick
last
first
hobby
Holland William
Bill
Holland William Fishing
union join
SELECT * FROM (people
UNION JOIN hobbies) AS result
früher: -
lname fname
nick
last
Holland William
Holland William
null
null
null
null
Bill
Bill
null
null
null
null
null
null
Holland William
Zysko Ana
TFH Berlin
first
hobby
null
null
Fishing
Painting
SQL/92
Neue Jointypen
People
Hobbies
lname fname
nick
last
first
hobby
Holland William
Smith Roberta
Bill
Bobbie
Holland William Fishing
Zysko Ana
Painting
linker outer join
SELECT * FROM (people
LEFT OUTER JOIN hobbies
ON lname=last) AS result
früher: -
lname fname
nick
last
first
hobby
Holland William
Smith Roberta
Bill
Holland William Fishing
Bobbie null
null
null
rechter outer join
SELECT * FROM (people
RIGHT OUTER JOIN hobbies
ON lname=last) AS result
früher: -
lname fname
nick
last
first
hobby
Holland William
null
null
Bill
null
null
Holland William Fishing
Zysko Ana
Painting
voller outer join
SELECT * FROM (people
FULL OUTER JOIN hobbies
ON lname=last) AS result
früher: -
lname fname
nick
Holland William
Smith Roberta
null
null
Bill
Holland William Fishing
Bobbie null
null
null
null
Zysko Ana
Painting
TFH Berlin
last
first
hobby
SQL/92
Isolation levels
Isolierungsstufen stellen dar, wie sicher ein Benutzer sein kann, dass die von ihm gelesenen Zeilen
aktuellen Inhalt haben. Sie nehmen dem Programmierer die Aufgabe der eigenen Realisierung mit
Sperrbefehlen ab.
Isolierungsstufe 0:
Es wird nichts gesperrt.
(READ UNCOMMITTED)
Isolierungsstufe 1:
Es wird implizit eine Zeile gesperrt, wenn sie angefasst wird.
Es ist immer nur eine Zeile pro Tabelle gesperrt.
(READ COMMITTED)
Isolierungsstufe 2:
Es wird eine Zeile gesperrt, wenn sie angefasst wird.
Diese Sperre wird für wiederholtes Arbeiten gehalten.
(REPEATABLE READ)
Isolierungsstufe 3:
Es wird implizit eine ganze Ergebnismenge für wiederholtes Arbeiten gesperrt.
(CURSOR STABILITY)
Zugriffsmodus: READ ONLY and READ WRITE
Beispiel:
SET TRANSACTION READ WRITE
READ COMMITTED
DIAGNOSTICS SIZE 20;
SET TRANSACTION darf nicht innerhalb einer (anderen) aktiven Transaktion ausgeführt
werden.
TFH Berlin
SQL/92
Cursor
Cursor werden ausgebaut: Sie werden beweglich (scrollable) und erlauben Vorwärts- und
Rückwärtsbewegungen und Sprünge.
FETCH mit:
FIRST
LAST
NEXT
PRIOR
ABSOLUTE n
RELATIVE n
EXEC SQL DECLARE c SCROLL CURSOR FOR SELECT ...;
EXEC SQL OPEN c;
EXEC SQL FETCH ABSOLUTE 10 FROM c INTO ...;
EXEC SQL FETCH RELATIVE 32 FROM c INTO ...;
EXEC SQL FETCH PRIOR FROM c INTO ...;
Cursor können mit Vorabsperren angekündigt werden:
EXEC SQL DECLARE c1 CURSOR FOR
SELECT lname, fname FROM people
READ ONLY;
EXEC SQL DECLARE c2 CURSOR FOR
SELECT lname, fname, nick FROM people
FOR UPDATE OF nick;
TFH Berlin
SQL/92
Dynamisches SQL
Dynamisches SQL wird gebraucht, wenn die Tabellen, Spalten oder
Präikate zur Compilezeit nicht bekannt sind.
einmalige sofortige Ausführung
s = "INSERT INTO people VALUES ('Harris', ...)";
EXEC SQL EXECUTE IMMEDIATE :s;
mehrmalige Ausführung
EXEC SQL PREPARE stmt FROM :s;
EXEC SQL EXECUTE stmt;
EXEC SQL EXECUTE stmt;
dynamische Parametergenerierung
s = "INSERT INTO people VALUES (?, ?, ...)";
EXEC SQL PREPARE stmt FROM :s;
lname = "Harris"; fname = "Todd";
EXEC SQL EXECUTE stmt USING :fname, ...;
Ein dynamisches Descriptorfeld kann benutzt werden, wenn die Anzahl der dynamischen Parameter nicht
bekannt ist.
s = "INSERT INTO people VALUES (?, ?, ...)";
EXEC SQL PREPARE stmt FROM :s;
EXEC SQL ALLOCATE DESCRIPTOR 'input_params';
EXEC SQL DESCRIBE INPUT stmt
INTO SQL DESCRIPTOR 'input_params';
EXEC SQL GET DESCRIPTOR 'input_params';
:n = COUNT;
for (i=1;<n;i++)
{
EXEC SQL GET DESCRIPTOR 'input_params'
VALUE :i, t = TYPE, ...;
EXEC SQL SET DESCRIPTOR 'input_params'
VALUE :i, DATA = :d, INDICATOR = :ind;
}
EXEC SQL EXECUTE stmt
USING SQL DESCRIPTOR'input_params';
Dynamisierung bei Statementnamen, Cursornamen, Descriptor Area Namen.
s = "...";
s_stmt = "my_stmt";
s_desc = "my_descriptor";
s_cursor = "my_cursor";
EXEC SQL PREPARE :s_stmt FROM :s;
EXEC SQL ALLOCATE DESCRIPTOR :s_desc;
EXEC SQL ALLOCATE :s_cursor CURSOR FOR :s_stmt;
EXEC SQL OPEN :s_cursor;
TFH Berlin
SQL/92
SQLSTATE
SQLSTATE ersetzt SQLCODE und ist erweitert:
5 Zeichen:
2 Zeichen repräsentieren die Klasse,
3 Zeichen repräsentieren die Subklasse.
Klassen und Subklassen konnen vom Anwender erweitert werden.
SQLSTATE SQLCODE Beschreibung
'00000' 0
'02000' 100
'22001' - n
'22012' - n
erfolgreiche Ausführung
keine Daten
Datenproblem, rechtes Abschneiden
Datenproblem, Division durch Null
Zwischen einem SQL-Client und einem SQL-Server werden Connections hergestellt.
Es gibt eine SQL-Session zu jeder Connection.
env = "IBMSYS";
connect = "STLconnection";
user = "Todd";
EXEC SQL CONNECT TO :env AS :connect USER :user;
...
EXEC SQL COMMIT;
env = "IBMSYS2";
EXEC SQL SET CONNECTION :env;
TFH Berlin
Herunterladen