Kapitel 4 Objektrelationale Datenmodell- und Spracherweiterungen kommerzieller Datenbanksysteme IBM DB2 Universal Database, Version 8.1 Oracle 9i, Release 2 IBM Informix Dynamic Server, Version 9.3 PostgreSQL, Version 7.3.1 Disclaimer Dieses Kapitel basiert auf dem folgenden Buch, welches auch zur weiteren Vertiefung empfohlen wird: Can Türker: SQL:1999 & SQL:2003 — Objektrelationales SQL, SQLJ & SQL/XML. dpunkt-Verlag, Heidelberg, 2003. ISBN: 3-89864-219-4 Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-2 Objektrelationale Erweiterungen in DB2 z Neue Basisdatentypen z Benutzerdefinierte Typen – – Distinct-Typen Strukturierte Typen (mit Typvererbung) z Referenztyp z Typisierte Tabellen (mit Subtabellenbildung) z Typisierte Sichten (mit Subsichtenbildung) Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-3 Neue Basisdatentypen z Large Objects – – – – z BLOB (Binary Large Object) CLOB (Character Large Object) Operationen SUBSTR, POSSTR, || (CONCAT) IS [NOT] NULL, LIKE, LENGTH Nicht erlaubt BLOB/CLOB-Attribute als Teil eines Schlüssels oder in booleschen bzw. arithmetischen Ausdrücken GROUP BY, ORDER BY, EQUALS, GREATER/LESS THAN BOOLEAN Datentyp nicht unterstützt Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-4 Basisdatentypen Basisdatentyp Bedeutung SMALLINT (16 Bit) ganze Zahl [-32768, 32767] INTEGER (32 Bit) ganze Zahl [-2147483648, 2147483647] BIGINT (64 Bit) ganze Zahl [-9223372036854775808, 9223372036854775807] DECIMAL(p,q) NUMERIC(p,q) Festkommazahl mit Genauigkeit p und q Nachkommastellen (p ≤ 31) FLOAT(p) REAL DOUBLE Fließkommazahl mit Genauigkeit p (≤ 31) CHAR(q) Alphanumerische Zeichenkette mit fester Länge q (≤ 254) VARCHAR(q) Alphanumerische Zeichenkette mit variabler Länge q (≤ 3745) CLOB Alphanumerische Zeichenkette mit variabler Länge bis 2GB BLOB Binäre Zeichenkette mit variabler Länge bis 2GB DATE Datum TIME Zeit TIMESTAMP Zeitstempel Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-5 Verwendung neuer Basisdatentypen Definition einer Tabelle mit LOB-Attributen: CREATE TABLE MitarbeiterTupelTabelle ( Name VARCHAR(30), Bild BLOB(1M), Bewerbung CLOB(50k) ); Erzeugen von LOB-Attributen: INSERT INTO MitarbeiterTupelTabelle VALUES ( 'Billy', BLOB('Bilddaten innerhalb einer Anwendung zuweisen!'), CLOB('Bewerbung innerhalb einer Anwendung zuweisen!') ); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-6 Distinct-Typen z Distinct-Typ ist eine Kopie eines Basisdatentyps z Syntax: z Distinct-Typdefinition generiert automatisch – – CREATE DISTINCT TYPE Distinct-Typname AS Basisdatentyp WITH COMPARISONS Cast-Funktionen zur Konversion zwischen Distinct-Typ und Ausgangstyp Vergleichsoperatoren (=, <, >, <=, <=, <>) für Instanzen des Distinct-Typs Gilt nicht für die Typen BLOB, CLOB, LONG VARCHAR, LONG VARGRAPHIC (hier darf WITH COMPARISONS nicht verwendet werden) Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-7 Beispieldefinition und Verwendung von Distinct-Typen Definition von Distinct-Typen: CREATE DISTINCT TYPE Franken AS DECIMAL(9,2) WITH COMPARISONS; CREATE DISTINCT TYPE Euro AS DECIMAL(9,2) WITH COMPARISONS; Verwendung von Distinct-Typen in Tabellendefinitionen: CREATE TABLE CHBank(Nr INTEGER, Stand Franken); CREATE TABLE EuroBank(Nr INTEGER, Stand Euro); Anfrage basierend auf Distinct-Typen und generierten Cast-Funktionen: SELECT c.Nr, c.Stand FROM CHBank c, EuroBank e WHERE CAST(c.Stand AS DECIMAL) < CAST(e.Stand AS DECIMAL); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-8 Strukturierte Typen z Abstrakter Objekttyp mit Attributen und Methoden – – – – – z Defaultwerte und Integritätsbedingungen werden nicht unterstützt Keine kollektionswertigen Attribute Attribut eines strukturierten Typs darf weder denselben Typ noch einen Subtyp dieses strukturierten Typs haben Typvererbung: Ein Subtyp erbt die Attribute und Methoden des Supertyps Substituierbarkeit: Subtypinstanz ist als Supertypinstanz verwendbar Typdefinition generiert automatisch – – – Methoden zum Zugriff auf und Ändern der Attributwerte Konstruktoren zum Erzeugen von Instanzen Operatoren zum Vergleichen von Instanzen Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-9 Strukturierte Typen – Definition von Wurzeltypen z Syntax: – CREATE TYPE Typname AS (Attributdefinitionsliste) [[NOT] INSTANTIABLE] [NOT FINAL] MODE DB2SQL [REF USING Typ] [CAST (SOURCE AS REF) WITH Funktionsname] [CAST (REF AS SOURCE) WITH Funktionsname] [Methodendeklarationsliste] Jede Instanz eines strukturierten Typs kann mit einer OID assoziiert werden Default-Typ der OID ist VARCHAR(16) Typ der OID kann mit REF USING geändert werden Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-10 Strukturierte Typen – Beispiele CREATE TYPE AdresseTyp AS ( Strasse VARCHAR(30), Nr DECIMAL(4), PLZ DECIMAL(5), Ort VARCHAR(40), Land VARCHAR(25) ) MODE DB2SQL; CREATE TYPE KundeTyp AS ( KNr INTEGER, Name VARCHAR(30), Anschrift AdresseTyp ) REF USING INTEGER MODE DB2SQL; CREATE TYPE LieferantTyp AS ( LNr INTEGER, Name VARCHAR(25), Anschrift AdresseTyp ) MODE DB2SQL; CREATE TYPE AuftragTyp AS ( ANr INTEGER, Kunde REF(KundeTyp) Eingang DATE, Bearbeitet DATE, Lieferant REF(LieferantTyp) ) MODE DB2SQL; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-11 Referenztyp z REF: Referenz auf ein Objekt eines strukturierten Typs – z Attributwert ist eine OID (object identifier) Beispiel: Ein Teil referenziert ein anderes Teil CREATE TYPE TeilTyp AS ( Nr DECIMAL(10), Bezeichnung VARCHAR(25), Farbe VARCHAR(15), IstTeilVon REF(TeilTyp), Preis Franken ) MODE DB2SQL METHOD Gesamtpreis() RETURNS Franken LANGUAGE SQL; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-12 Methodenimplementierung z Methodendeklaration und -implementierung erfolgt analog zu SQL:1999 – Deklaration erfolgt innerhalb der Definition/Änderung des Objekttyps ALTER TYPE TeilTyp ADD METHOD AnzahlUnterteile() RETURNS INTEGER LANGUAGE SQL; – Implementierung in einer separaten Anweisung (hier SQL-Variante) CREATE METHOD AnzahlUnterteile() RETURNS INTEGER FOR TeilTyp RETURN (SELECT COUNT(*) FROM Teil WHERE IstTeilVon->Bezeichnung = SELF..Bezeichnung); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-13 Subtypbildung – Aufbau von Typhierarchien z Subtypdefinition mittels UNDER-Klausel – – – – z Subtyp erbt alle Attribute und Methoden des Supertyps Supertyp muss selbst ein strukturierter Typ sein Subtyp darf nur maximal einen direkten Supertyp haben Keine (direkte) Mehrfachvererbung möglich Geerbte Methoden können überschrieben werden (OVERRIDING) Syntax: CREATE TYPE Typname UNDER Supertypname AS (Attributdefinitionsliste) [[NOT] INSTANTIABLE] [NOT FINAL] MODE DB2SQL [Methodendeklarationsliste] Beispiel: CREATE TYPE BWKundeTyp UNDER KundeTyp AS ( Interessen VARCHAR(50) ) MODE DB2SQL; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-14 Typisierte Tabelle z Basiert auf einem strukturierten Typen z Speichert Instanz des strukturierten Typs als Zeile der Tabelle z OID-Attribut ist sichtbar! – – – z Muss für alle Wurzeltabellen explizit angegeben werden Wert wird innerhalb von INSERT belegt und ist danach unveränderlich Wert muss NOT NULL und eindeutig innerhalb der Tabellenhierarchie sein Kann Integritätsbedingungen enthalten – Primär-/Unique-/Fremdschlüssel, Not Null, Check-Klausel, Scope-Klausel Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-15 Typisierte Tabellen – Definition von Wurzeltabellen • Syntax: CREATE TABLE Tabellenname OF StrukturierterTyp ( REF IS OID-Attributname USER GENERATED [Attributoptionsliste] ) • Attributoption: Attributname WITH OPTIONS Optionsliste | CHECK-Integritätsbedingung | UNIQUE-Integritätsbedingung • Optionen: SCOPE TypisierteTabelle | DEFAULT Wert | Integritätsbedingung Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-16 Typisierte Tabelle – Beispiele CREATE TABLE Teil OF TeilTyp ( REF IS oid USER GENERATED, Nr WITH OPTIONS NOT NULL PRIMARY KEY, IstTeilVon WITH OPTIONS SCOPE Teil ); CREATE TABLE Kunde OF KundeTyp ( REF IS oid USER GENERATED, KNr WITH OPTIONS NOT NULL PRIMARY KEY, Name WITH OPTIONS NOT NULL ); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-17 Typisierte Tabelle – Weitere Beispiele CREATE TABLE Auftrag OF AuftragTyp ( REF IS oid USER GENERATED, ANr WITH OPTIONS NOT NULL PRIMARY KEY ); CREATE TABLE Lieferant OF LieferantTyp ( REF IS oid USER GENERATED, LNr WITH OPTIONS NOT NULL PRIMARY KEY, Name WITH OPTIONS NOT NULL ); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-18 Operationen auf typisierten Tabellen -- OID (erstes Attribut) durch INSERT INTO Kunde -- Referenzkonstruktoraufruf erzeugt VALUES (KundeTyp(17), 17, 'Billy', AdresseTyp()..Strasse('Seefeldstrasse')..Nr(31)..Plz(8008) ..Ort('Zurich')..Land('Schweiz')); UPDATE Kunde SET Anschrift= AdresseTyp()..Strasse('Kreuzstrasse')..Nr(31)..Plz(8008) ..Ort('Zurich')..Land('Schweiz') WHERE Name = 'Billy'; DELETE FROM Kunde WHERE Anschrift..Ort = 'Zurich'; Zugriff auf Attribute/Methoden einer Instanz eines strukturierten Typs erfolgt mittels dem Doppel-DotOperator .. Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-19 Attributbelegungen z Ändern von strukturierten Attributen UPDATE Kunde SET Anschrift..Stadt = 'Zuerich' WHERE Anschrift..Stadt = 'Zurich'; z Ändern von Referenzattributen UPDATE Teil SET IstTeilVon =(SELECT oid FROM Teil WHERE Bezeichnung = 'Fahrrad') WHERE Bezeichnung = 'Rad'; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-20 Überladen des Konstruktors Definition eines Konstruktors: CREATE FUNCTION AdresseTyp (S VARCHAR(30), N DECIMAL(4), P DECIMAL(5), O VARCHAR(25), L VARCHAR(20)) RETURNS AdresseTyp LANGUAGE SQL RETURN AdresseTyp()..Strasse(S)..Nr(N)..PLZ(P)..Ort(O)..Land(L); Einfügen eines neuen Kunden mit Hilfe des neuen Konstruktors: INSERT INTO Kunde VALUES (KundeTyp(17), 17, 'Billy', AdresseTyp('Seefeldstrasse', 31, 8008, 'Zurich', 'Schweiz')); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-21 OID-Erzeugung z OIDs sind "systemgenerierbar", wenn der strukturierte Typ ohne REF USING definiert wurde INSERT INTO Teil VALUES (TeilTyp(GENERATE_UNIQUE()), 13, 'Fahrrad', 'Silber-Blau', NULL); z Nutzer kann weiterhin OIDs vergeben INSERT INTO Teil VALUES (TeilTyp('RYWZBA12WS'), 18, 'Rahmen', 'Blau', (SELECT oid FROM Teil WHERE Nr =13)); – Referenzattributbelegung mit einer Anfrage (oben) oder Direktangabe (unten) INSERT INTO Teil VALUES (TeilTyp(GENERATE_UNIQUE()), 56, 'Gabel', 'Blau', TeilTyp('RYWZBA12WS')); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-22 Einfache Anfragen – Beispiele Zugriff auf OID-Attribut: SELECT oid FROM Kunde; Zugriff auf eine Komponente eines objektwertigen Attributs: SELECT Anschrift..Stadt FROM Kunde; Zugriff auf ein Referenzattribut (OID des referenzierten Objekts): SELECT IstTeilVon FROM Teil; Zugriff auf ein Attribut eines referenzierten Objekts (Dereferenzierung mit anschliessendem Komponentenzugriff): SELECT IstTeilVon->Bezeichnung FROM Teil; SELECT DEREF(IstTeilVon)..Bezeichnung FROM Teil; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-23 Subtabellenbildung – Aufbau von Tabellenhierarchien z Syntax: CREATE TABLE Tabellenname OF StrukturierterTyp UNDER Supertabelle INHERIT SELECT PRIVILEGES [( Attributoptionsliste )] – – – – – Typ der Subtabelle muss ein direkter Subtyp des Typs der Supertabelle sein (Tiefe) Extension der Subtabelle muss immer eine Untermenge der (tiefen) Extension der Supertabelle sein Instanzen der Subtabelle sind auch Mitglieder der zugehörigen Supertabellen Subtabelle darf nur maximal eine direkte Supertabelle haben Keine (direkte) Mehrfachspezialisierung möglich Subtabelle kann neue Integritätsbedingungen hinzudefinieren Subtabellen besitzen keine eigene Referenzklausel Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-24 Subtabelle – Beispiel CREATE TABLE BWKunde OF BWKundeTyp UNDER Kunde INHERIT SELECT PRIVILEGES ( Interessen WITH OPTIONS NOT NULL ); z Achtung: – – Schlüsselwort INHERIT SELECT PRIVILEGES ist nicht optional Strukturierter Typ der Subtabelle mindestens ein "eigenes" Attribut definieren Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-25 Anfragen an Tabellenhierarchien SELECT Name FROM Kunde; liefert die Namen aller Kunden (inklusive der BWKunden) SELECT Name FROM BWKunde; Zugriff auf tiefe Extension einer Supertabelle Zugriff auf tiefe Extension einer Subtabelle liefert die Namen aller BWKunden SELECT Name FROM ONLY(Kunde); Zugriff auf flache Extension einer Supertabelle liefert nur die Namen der Kunden, die keine BWKunden sind SELECT Name, Interessen FROM OUTER(Kunde); liefert Namen und Interessen aller Kunden Zugriff auf Attribute der Subtabelle auf Supertabellenebene Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-26 Typisierte Sichten z Syntax: Definition einer typisierten Sicht CREATE VIEW Sichtenname OF StrukturierterTyp MODE DB2SQL ( REF IS OID-Attributname USER GENERATED [Attributoptionsliste] ) AS Anfrageausdruck [WITH CHECK OPTION] – – – Referenzklausel ist zwingend notwendig für Wurzelsichten Sichtanfrage über genau einer Tabelle bzw. Sicht nur benutzerdefinierte OIDs sind erlaubt Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-27 Subsichtenbildung – Aufbau von Sichtenhierarchien z Syntax: Definition einer Subsicht CREATE VIEW Sichtenname OF StrukturierterTyp MODE DB2SQL UNDER Supersicht INHERIT SELECT PRIVILEGES [( Attributoptionsliste )] AS Anfrageausdruck [WITH CHECK OPTION] – – – – Typ der Subsicht muss ein direkter Subtyp des Typs der Supersicht sein Supersicht muss auf eine flache Extension zugreifen (ONLY) Supersicht darf keine andere Subsicht desselben Subtyps besitzen Subsicht erweitert Supersicht: Alle Instanzen der Subsicht sind auch automatisch in der Supersicht sichtbar Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-28 Typisierte Sichten – Beispiele Definition einer Wurzelsicht: CREATE VIEW ZuercherKunde OF KundeTyp MODE DB2SQL (REF IS oid USER GENERATED) AS (SELECT * FROM ONLY(Kunde) WHERE Anschrift..Ort = 'Zurich'); Definition einer Subsicht: CREATE VIEW AKunde OF BWKundeTyp MODE DB2SQL UNDER ZuercherKunde INHERIT SELECT PRIVILEGES AS (SELECT * FROM BWKunde WHERE Name LIKE 'A%'); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-29 DB2 – Datenmodell SET MULTISET OBJECT ROW REF Einstiegspunkte Typisierte Tabelle: Untypisierte Tabelle: Basisdatentyp Subtypbeziehung SET(OBJECT(...)) MULTISET(ROW(...)) Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) Untermengenbeziehung 4-30 DB2 – Datenmodellüberblick UNDER Attributtypen Basistyp Referenztyp Distinct-Typ Strukturierter Typ Attributtypen OF Tupeltabelle (Multimenge von Tupeln eines Tupeltyps) Typisierte Tabelle (Menge von Objekten eines strukturierten Typs) Sichtberechnung basiert auf Tupelsicht (Multimenge von Tupeln eines Tupeltyps) UNDER UNDER OF Typisierte Sicht (Multimenge von Objekten eines strukturierten Typs) Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-31 Definition von Funktionen – Beispiele CREATE FUNCTION AnzahlAuftraege (k VARCHAR(30)) RETURNS INTEGER LANGUAGE SQL RETURN (SELECT COUNT(*) FROM Auftrag WHERE Kunde->Name = k); CREATE FUNCTION AnzahlAuftraege () RETURNS TABLE(Name VARCHAR(30), Anzahl INTEGER) LANGUAGE SQL RETURN (SELECT Kunde->Name, COUNT(*) FROM Auftrag GROUP BY Kunde->Name); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) Funktion, die einen "atomaren" Wert liefert! Funktion, die eine Tabelle liefert! 4-32 SFW-Block (1) z SELECT: Was darf in der Projektionsliste stehen? – – – z Attribute (auch abgeleitete, berechnete) Methoden-/Funktionsaufrufe Unterabfragen 9 9 (9) Nur skalare Unterabfragen, die genau einen Wert liefern! Beispiel: SELECT Name, AnzahlAuftraege(Name), (SELECT COUNT(*) FROM Auftrag a WHERE a.Kunde->Name = k.Name) FROM Kunde k; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-33 SFW-Block (2) z FROM: Welche Tabellenausdrücke sind erlaubt? – – – – – z Tupeltabellen Objekttabellen (auch flache Extensionen) Kollektionsabgeleitete Tabellen Methoden-/Funktionsaufrufe (die Tabellen liefern) Unterabfragen (abgeleitete Tabellen) 9 9 — 9 9 auch rekursive Tabellen! Beispiel: Funktionsabgeleitete bzw. mittels Unterabfragen abgeleitete Tabellen SELECT * FROM TABLE(AnzahlAuftraege()) a; SELECT * FROM (SELECT Kunde FROM Auftrag) k; Korrelationsvariable muss in beiden Fällen angegeben werden! Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-34 SFW-Block (3) z WHERE: Welche Prädikate sind erlaubt? – – – z Prädikate über Attribute 9 Prädikate mit Methoden-/Funktionsaufrufen 9 Prädikate mit Unterabfragen 9 Beispiel: SELECT * FROM Kunde k WHERE Name LIKE 'C%' AND AnzahlAuftraege(Name) > 5 AND EXISTS(SELECT * FROM Lieferant l WHERE k.Name = l.Name); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-35 Objektrelationale Erweiterungen in Oracle9i z Neue Basisdatentypen z Referenztypkonstruktor z Benutzerdefinierte Typen – – Kollektionstypen Tabellentyp Variabler Arraytyp Objekttypen (mit Subtypenbildung) z Objekttabellen z Objektsichten (mit Subsichtenbildung) z Hierarchische Anfragen (als beschränkte Rekursion) Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-36 Neue Basisdatentypen z Large Objects – – – – – z BLOB ("Internes" Binary Large Object) CLOB ("Internes" Character Large Object) BFILE ("Externes" Large Object) Operationen EMPTY_BLOB, EMPTY_CLOB, BFILENAME IS [NOT] NULL Nicht erlaubt BLOB/CLOB-Attribute als Teil eines Schlüssels oder in booleschen bzw. arithmetischen Ausdrücken GROUP BY, ORDER BY Kein BOOLEAN Datentyp unterstützt Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-37 Basisdatentypen Basisdatentyp Bedeutung NUMBER(p,q) Zahl mit p ≤ 38 und -84≤ q ≤ 127 [1.0*10-130, 9.9…9*10125] SMALLINT NUMBER(38) INTEGER NUMBER(38) DECIMAL(p,q) NUMERIC(p,q) NUMBER(p,q) FLOAT(p) REAL DOUBLE PRECISION NUMBER mit Genauigkeit p (≤ 126) CHAR(q) Alphanumerische Zeichenkette mit fester Länge q (≤ 2000) VARCHAR(q) Alphanumerische Zeichenkette mit variabler Länge q (≤ 4000) CLOB Alphanumerische Zeichenkette mit variabler Länge bis 4GB BLOB Binäre Zeichenkette mit variabler Länge bis 4GB BFILE Lokator auf externe Datei der Grösse bis 4GB LONG RAW Binäre Zeichenkette mit variabler Länge bis 2GB RAW Binäre Zeichenkette mit variabler Länge bis 32KB DATE Datum TIMESTAMP Zeitstempel INTERVAL Zeitinterval Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-38 Verwendung neuer Basisdatentypen Definition einer Tabelle mit LOB-Attributen: CREATE TABLE MitarbeiterTupelTabelle ( Name VARCHAR(30), Bild BLOB, BildDatei BFILE, Bewerbung CLOB, BewerbungDatei BFILE ); Definition von Alias-Ordnern, in denen externe LOBs zu finden sind: CREATE DIRECTORY MITARBEITER_BILDER AS 'D:\ImgSamp\'; CREATE DIRECTORY MITARBEITER_BEWERBUNGEN AS 'D:\RsmSamp\'; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-39 Erzeugen von LOBs Erzeugen von LOB-Attributen: INSERT INTO MitarbeiterTupelTabelle VALUES ('Billy', EMPTY_BLOB(), BFILENAME('MITARBEITER_BILDER', 'billy.gif'), EMPTY_CLOB(), BFILENAME('MITARBEITER_BEWERBUNGEN', 'billy.rsm') ); EMPTY_BLOB() bzw. EMPTY_CLOB() initialisieren LOB-Lokatoren (notwendig für spätere Zuweisung) Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-40 Prozedur zum Belegung eines LOBs CREATE PROCEDURE SetBewerbung (InputName IN VARCHAR2) IS textdaten CLOB; datei BFILE; BEGIN SELECT Bewerbung, BewerbungDatei INTO textdaten, datei FROM MitarbeiterTupelTabelle WHERE Name = InputName; DBMS_LOB.FILEOPEN(datei, DBMS_LOB.FILE_READONLY); DBMS_LOB.LOADFROMFILE(textdaten, datei, DBMS_LOB.GETLENGTH(datei)); DBMS_LOB.FILECLOSE(datei); UPDATE MitarbeiterTupelTabelle SET Bewerbung = textdaten WHERE Name = InputName; END; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-41 Prozedur zum Anzeigen eines LOBs CREATE PROCEDURE ShowBewerbung (InputName IN VARCHAR2) IS puffer VARCHAR(60); textdaten CLOB; textlaenge DECIMAL; position DECIMAL; BEGIN textlaenge := 60; position := 1; SELECT Bewerbung INTO textdaten FROM MitarbeiterTupelTabelle WHERE Name = InputName; DBMS_LOB.READ(textdaten, textlaenge, position, puffer); DBMS_OUTPUT.PUT_LINE(puffer); END; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-42 Referenztyp z REF: Referenz auf eine Instanz eines Objekttyps – z Wert eines Referenzattributs ist eine OID Beispiel: Ein Teil referenziert ein anderes Teil CREATE TYPE TeilTyp AS OBJECT ( Nr NUMBER(10), Bezeichnung VARCHAR(25), Farbe VARCHAR(15), IstTeilVon REF TeilTyp ); z Vorwärtsdeklaration ermöglicht zyklische Typdefinitionen CREATE TYPE LieferantTyp; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-43 Benutzerdefinierte Datentypen – Tabellentyp z TABLE: Geordnete Multimenge mit indiziertem Zugriff – – – – – Ohne Grössenbeschränkung Alle Elemente besitzen denselben Typ Elementindex als Iterator Anfragen auf geschachtelte Tabelle anwendbar Daten der geschachtelte Tabelle sind auch indizierbar z Syntax: CREATE TYPE Tabellentypname AS TABLE OF Elementtyp z Beispiel: CREATE TYPE HobbiesTabellenTyp AS TABLE OF VARCHAR(20); ALTER TABLE MitarbeiterTupelTabelle ADD Hobbies HobbiesTabellenTyp NESTED TABLE Hobbies STORE AS Kundenhobbies; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-44 Benutzerdefinierte Datentypen – Variabler Arraytyp z VARRAY: Geordnete Multimenge mit indiziertem Zugriff – – – – Grösse wird bei der Instanzierung festgelegt Alle Elemente besitzen denselben Typ Elementindex als Iterator Achtung: VARRAY-Werte nicht direkt in SQL, sondern nur in PL/SQL nutzbar z Syntax: CREATE TYPE Arraytypname AS VARRAY(Arraygrösse) OF Elementtyp z Beispiel: CREATE TYPE TelefonArrayTyp AS VARRAY(30) OF VARCHAR(20); ALTER TABLE MitarbeiterTupelTabelle ADD Telefone TelefonArrayTyp; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-45 Verwendung von Konstruktoren Erzeugen von Instanzen eines Array- bzw. Tabellentyps: INSERT INTO MitarbeiterTupelTabelle (Name, Hobbies, Telefone) VALUES ('Johnny', HobbiesTabellenTyp('Reisen', 'Sport', 'Kino'), TelefonArrayTyp('0041-1-6327248', '0041-1-7337947')); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-46 Kollektionen und Nullwerte Werte für ein kollektionswertiges Attribut (hier Telefone): TelefonArraytyp('0041-1-223456', NULL, '0041-1-3458122') TelefonArraytyp('0090-313-2445561', NULL) TelefonArraytyp('0049-6124-13297') TelefonArraytyp(NULL) TelefonArraytyp() NULL Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) Kardinalität: 3 2 1 1 0 NULL 4-47 Selektion von array-und tabellenwertigen Attributen z Zugriff auf komplette Kollektion erfolgt analog zu anderen Attributen SELECT Name, Telefone, Hobbies FROM MitarbeiterTupelTabelle; z Selektion und Belegung einzelner Arrayelemente nur innerhalb von PL/SQL-Anweisungen möglich z Selektion und Belegung einzelner Elemente einer inneren Tabelle hingegen auch in SQL-Anweisungen möglich Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-48 PL/SQL-Methoden für Kollektionen (i) liefert i-tes Element COUNT gibt Kardinalität aus EXTEND vergrössert Kollektion um ein NULL-Element FIRST bzw. LAST liefern den kleinsten bzw. grössten verwendeten Index PRIOR bzw. NEXT liefern den vorhergehenden bzw. nachfolgenden Index DELETE(i) löscht das i-te Element TRIM(i) löscht die letzten i Elemente LIMIT liefert maximal zulässige Anzahl von Elementen eines Arrays Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-49 Selektion einzelner Elemente aus Arrays/inneren Tabellen SET SERVEROUTPUT ON; DECLARE CURSOR mcursor IS SELECT * FROM MitarbeiterTupelTabelle; mitarbeiter mcursor%ROWTYPE; BEGIN FOR mitarbeiter IN mcursor LOOP DBMS_OUTPUT.PUT_LINE('Kundenname: ' || mitarbeiter.Name); FOR i IN 1..mitarbeiter.Telefone.COUNT LOOP DBMS_OUTPUT.PUT_LINE(i || '.Telefon: ' || mitarbeiter.Telefone(i)); END LOOP; FOR i IN 1..mitarbeiter.Hobbies.COUNT LOOP DBMS_OUTPUT.PUT_LINE(i || '.Hobby: ' || mitarbeiter.Hobbies(i)); END LOOP; END LOOP; END; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-50 Einfügen einzelner Elemente in Arrays CREATE PROCEDURE NeueNummer (n VARCHAR, nr VARCHAR) AS t TelefonArrayTyp; BEGIN SELECT Telefone INTO t FROM MitarbeiterTupelTabelle WHERE Name = n; IF t IS NULL THEN t := TelefonArrayTyp(nr); ELSE IF t.COUNT < t.LIMIT THEN t.EXTEND; END IF; t(t.LAST) := nr; END IF; UPDATE MitarbeiterTupelTabelle SET Telefone = t WHERE Name = n; END; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-51 Belegung kollektionswertiger Attribute mittels SFW-Query Grundmuster: INSERT INTO Tabelle (Kollektionsattribut) VALUES ([CAST(MULTISET] (SFW-Query) [AS Tabellentypkonstruktor)]) Beispiel: INSERT INTO MitarbeiterTupelTabelle (Name, Hobbies, Telefone) VALUES ('John', (CAST (MULTISET(SELECT DISTINCT VALUE(h) FROM MitarbeiterTupelTabelle, TABLE(Hobbies) h WHERE name = 'Billy' OR name = 'Can') AS HobbiesTabellenTyp)), (SELECT Telefone FROM MitarbeiterTupelTabelle WHERE Name = 'Billy')); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-52 Bearbeitung innerer Tabellen Tupel in eine innere Tabelle einfügen: INSERT INTO TABLE(SFW-Query-Liefert-Innere-Tabelle) VALUES (...); Tupel einer inneren Tabelle ändern: UPDATE TABLE(SFW-Query-Liefert-Innere-Tabelle) SET ... WHERE ...; Tupel aus einer inneren Tabelle löschen: DELETE FROM TABLE(SFW-Query-Liefert-Innere-Tabelle) WHERE ...; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-53 Bearbeitung innerer Tabellen – Beispiele INSERT INTO TABLE(SELECT Hobbies FROM MitarbeiterTupelTabelle WHERE Name = 'Billy') VALUES('Kino'); UPDATE TABLE(SELECT Hobbies FROM MitarbeiterTupelTabelle WHERE Name = 'Billy') h SET VALUE(h) = 'TV' WHERE VALUE(h) = 'Kino'; VALUE ist hier notwendig, um auf den Wert der Tupel der inneren Tabelle zuzugreifen! DELETE TABLE(SELECT Hobbies FROM MitarbeiterTupelTabelle WHERE Name = 'Billy') h WHERE VALUE(h) = 'Reisen'; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-54 Benutzerdefinierte Datentypen – Objekttyp z OBJECT: Strukturierter Typ mit Methoden und Subtypbildung – z Defaultwerte und Integritätsbedingungen werden nicht unterstützt Syntax für die Definition eines Wurzeltyps: CREATE TYPE Typname AS OBJECT ( Attributdefinitions-und-Methodendeklarationsliste [Abbildungs-bzw-Ordnungsmethode] ) [[NOT] FINAL] [[NOT] INSTANTIABLE] – Default: FINAL, INSTANTIABLE Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-55 Wurzeltypen – Beispiele (1) CREATE TYPE PositionTyp AS OBJECT ( PosNr INTEGER, Teil REF TeilTyp, Menge INTEGER, Preis INTEGER ); CREATE TYPE AuftragTabellenTyp AS TABLE OF REF AuftragTyp; CREATE TYPE VorratTyp AS OBJECT ( Anzahl DECIMAL(10), Kosten DECIMAL(12,2), RefTeil REF TeilTyp ); CREATE TYPE PositionTabellenTyp AS TABLE OF PositionTyp; CREATE TYPE AuftragTyp AS OBJECT ( ANr INTEGER, Lieferant REF LieferantTyp, Eingang DATE, Bearbeitet DATE, Positionen PositionTabellenTyp, MEMBER FUNCTION Anzahl RETURN INTEGER ); CREATE TYPE VorratTabellenTyp AS TABLE OF VorratTyp; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-56 Wurzeltypen – Beispiele (2) CREATE TYPE AdresseTyp AS OBJECT ( Strasse VARCHAR(30), Nr DECIMAL(4), PLZ DECIMAL(5), Ort VARCHAR(40), Land VARCHAR(25) ) NOT FINAL; CREATE TYPE LieferantTyp AS OBJECT ( LNr INTEGER, Name VARCHAR(25), Adresse AdresseTyp, Telefone TelefonArrayTyp, Vorrat VorratTabellenTyp ); CREATE TYPE KundeTyp AS OBJECT ( KNr INTEGER, Name VARCHAR(30), Anschrift AdresseTyp, Telefone TelefonArrayTyp, Auftraege AuftragTabellenTyp, MEMBER FUNCTION NeueNummer(t VARCHAR) RETURN TelefonArrayTyp ) NOT FINAL; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-57 Subtypbildung – Aufbau von Typhierarchien z Syntax: – – – z CREATE TYPE Subtypname UNDER Supertypname ( Attributdefinitions-und-Methodendeklarationsliste [Überschreibende-Abbildungsmethode] ) [[NOT] FINAL] [[NOT] INSTANTIABLE] Subtyp erbt alle Attribute und Methoden des Supertyps Subtyp hat nur einen direkten Supertyp (keine Mehrfachvererbung) Geerbte Methoden sind überschreibbar Beispiel: CREATE TYPE BWKundeTyp UNDER KundeTyp ( Hobbies HobbiesTabellenTyp, Kredit DECIMAL(9,2) ); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-58 Operationen auf Objekttypen z Default-Konstruktor heisst wie der Objekttyp und hat für jedes Attribut einen Parameter Objekttypname(p1, ..., pn) z Attributzugriff mittels Punktnotation o.Attributname z Objektvergleich basiert auf flacher Gleichheit o1 = o2 z Referenzvergleich ist auch möglich REF(o1) = REF(o2) z Typtest mittels IS OF o IS OF (Objekttypname) z Temporäre Typanpassung mittels TREAT TREAT (o AS Objekttypname) Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-59 Methodendeklaration z Syntax: [[NOT] OVERRIDING] [[NOT] FINAL] [[NOT] INSTANTIABLE] {MEMBER|STATIC} {FUNCTION|PROCEDURE} Methodenname [(Parameterliste)] [RETURN Rückgabetyp] OVERRIDING: überschreibende Methode FINAL: nicht-überschreibbare Methode INSTANTIABLE: abstrakte Methoden; Objekttyp bietet keine Implementierung DEFAULT: NOT OVERRIDING, NOT FINAL, INSTANTIABLE MEMBER: Instanzmethode wird auf einem Objekt aufgerufen (besitzt impliziten SELF-Parameter) STATIC: statische Methode wird auf dem Objekttyp aufgerufen PROCEDURE: hat keinen Rückgabewert FUNCTION: hat einen Rückgabewert, darf aber keine Objektattributwerte ändern Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-60 Methodenimplementierung z Methodendeklaration und -implementierung erfolgen strikt getrennt – – z Deklaration erfolgt innerhalb der Definition des Objekttyps Implementierung in einer separaten Anweisung (hier in PL/SQL) Beispiel: CREATE TYPE BODY AuftragTyp AS MEMBER FUNCTION Anzahl RETURN INTEGER AS a INTEGER; BEGIN FOR i IN 1..SELF.Positionen.COUNT LOOP a := a + SELF.Positionen(i).Menge; END LOOP; RETURN a; END; END; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-61 Methodenimplementierung – Weiteres Beispiel CREATE TYPE BODY KundeTyp AS MEMBER FUNCTION NeueNummer(nr VARCHAR) RETURN TelefonArrayTyp IS t TelefonArrayTyp := SELF.Telefone; BEGIN IF t IS NULL THEN t := TelefonArrayTyp(nr); ELSE IF t.COUNT < t.LIMIT THEN t.EXTEND; END IF; t(t.LAST) := nr; END IF; RETURN t; END; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-62 Verwendung von benutzerdefinierten Typen – Beispiel CREATE TABLE KundeTupelTabelle ( KNr INTEGER, Name VARCHAR(30), Anschrift AdresseTyp, Telefone TelefonArrayTyp, Auftraege AuftragTabellenTyp ) NESTED TABLE Auftraege STORE AS Kundenauftraege; objektwertiges Attribut arraywertiges Attribut kollektionswertiges Attribut INSERT INTO KundeTupelTabelle VALUES ( 13, 'Billy', AdresseTyp('Whitesteet', 31, 65307, 'Newtown', 'USA'), TelefonArrayTyp('0041-1-6789332', '0049-6124-91267'), AuftragTabellenTyp(NULL)); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-63 Benutzerdefinierte Gleichheit von Objekten z Systemdefinierte Gleichtheit von Instanzen von Objekttypen basiert auf paarweise Gleichheit der Attributwerte (Flache Gleichheit) z Benutzerdefinierte Gleichheit bzw. Ordnung – – z MAP: Vergleich bzw. Ordnung basiert auf dem Ergebnis einer Abbildungsfunktion, die Objektwerte auf Werte von Basisdatentypen (Zahlen, Zeichenketten, Datum) abbildet ORDER: Ordnungsfunktion ordnet jeweils zwei Instanzen Syntax: MAP MEMBER FUNCTION Funktioname RETURN Typ ORDER MEMBER FUNCTION Funktioname (o Objekttyp) RETURN INTEGER Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-64 Benutzerdefinierte Gleichheit von Objekten (Forts.) Für jeden Objekttyp darf max. eine Map- oder Order-Funktion definiert sein CREATE TYPE AdresseTyp AS OBJECT ( Attributdefinitionen, ... MAP MEMBER FUNCTION AdresseMap RETURN VARCHAR2 -- Alternativ könnte folgende ORDER-Funktion definiert werden -- ORDER MEMBER FUNCTION AdresseOrder (o AdresseTyp) RETURN INT ); Beispiel: Implementierung einer Map-Funktion CREATE TYPE BODY AdresseTyp AS MAP MEMBER FUNCTION AdresseMap RETURN VARCHAR2 AS BEGIN RETURN Land || Ort || PLZ || Strasse || Nr; END; END; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-65 Beispiel: Implementierung einer Order-Funktion CREATE TYPE BODY AdresseTyp AS ORDER MEMBER FUNCTION AdresseOrder (a AdresseTyp) RETURN INTEGER AS a1 VARCHAR2(200); a2 VARCHAR2(200); BEGIN a1 := SELF.Land || SELF.Ort || SELF.PLZ || SELF.Strasse || SELF.Nr; a2 := a.Land || a.Ort || a.PLZ || a.Strasse || a.Nr; IF (a1 = a2) THEN RETURN 0; ELSE IF (a1 < a2) THEN RETURN -1; ELSE RETURN 1; END IF; END IF; END; END; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-66 Verwendung von Map- bzw. Order-Funktionen Beispielanfragen, in denen eine Map- bzw. Order-Funktion zum Einsatz kommt: SELECT Name, Anschrift FROM KundeTupelTabelle ORDER BY Anschrift; SELECT Name, Anschrift FROM KundeTupelTabelle WHERE Anschrift < AdresseTyp('Seefeldstrasse', 31, 8008, 'Zurich', 'CH'); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-67 Objekttabelle z Basiert auf einem Objekttyp z Speichert pro Zeile eine Instanz des Objekttyps z Kann Integritätsbedingungen enthalten – Primär-/Unique-/Fremdschlüssel, Not Null, Check-Klausel, Scope-Klausel z Muss für jedes tabellenwertige Attribut je eine STORE-Klausel enthalten z Subtabellenbildung ist nicht möglich z Syntax: CREATE TABLE Tabellenname OF Objektttypname [Substitutionsklausel] [(Integritätsbedingungsdefinitionsliste)] [OID-Klausel] [STORE-Klausel] [Attributsubstitutionsklauseln] Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-68 Objekttabellen (Fort.) z OID-Klausel legt Art der Referenzgenerierung fest – Systemgeneriert oder vom Primärschlüssel abgeleitet OBJECT IDENTIFIER IS {SYSTEM GENERATED | PRIMARY KEY} z Eine Objekttabelle darf auch Instanzen eines Subtyps aufnehmen (Prinzip der Substituierbarkeit) – Substitutionsklausel schliesst Substitution der Instanzen aus NOT SUBSTITUTABLE AT ALL LEVELS z Attributsubstitutionsklausel schliesst Substitution eines objektwertigen Attributs aus COLUMN Attributname {NOT SUBSTITUTABLE AT ALL LEVELS | IS OF (ONLY Objekttypname)} Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-69 Objekttabellen – Beispiele (1) CREATE TABLE Kunde OF KundeTyp ( KNr PRIMARY KEY, Name NOT NULL, Anschrift NOT NULL, CHECK(Anschrift.PLZ IS NOT NULL) ) NESTED TABLE Auftraege STORE AS Kundenauftraege COLUMN Anschrift IS OF (ONLY AdresseTyp); CREATE TABLE Auftrag OF AuftragTyp NOT SUBSTITUTABLE AT ALL LEVELS ( ANr PRIMARY KEY ) NESTED TABLE Positionen STORE AS Positionen; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-70 Objekttabellen – Beispiele (2) Beispiel für eine Objekttabelle, die nur Instanzen eines Subtyps aufnimmt CREATE TABLE BWKunde OF BWKundeTyp NOT SUBSTITUTABLE AT ALL LEVELS ( KNr PRIMARY KEY, Name NOT NULL, Anschrift NOT NULL, CHECK(Anschrift.PLZ IS NOT NULL), CHECK(Kredit > 0), ) NESTED TABLE Auftraege STORE AS BWKundenauftraege NESTED TABLE Hobbies STORE AS BWKundenhobbies COLUMN Anschrift IS OF (ONLY AdresseTyp); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-71 Operationen auf Objekttabellen INSERT INTO Kunde VALUES ( 34, 'Johnny', AdresseTyp('Fifth Avenue', 45, 45566, 'Bigtown', 'USA'), TelefonArrayTyp('0041-1-6725655', '0049-454-364666'), AuftragTabellenTyp(NULL)); UPDATE Kunde SET Anschrift = AdresseTyp('Kreuzstrasse', 21, 8008, 'Zurich', 'CH') WHERE Name = 'Johnny'; DELETE FROM Kunde k WHERE k.Anschrift.Ort = 'Zurich'; Achtung: Korrelationsvariable k ist notwendig, um auf Objektattribute zugreifen zu können! Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-72 Substituierbarkeit Erzeugen eines Kunden mittels explizitem Konstruktor-Aufrufs: INSERT INTO Kunde VALUES (KundeTyp( 34, 'Johnny', AdresseTyp('Fifth Avenue', 45, 45566, 'Bigtown', 'USA'), TelefonArrayTyp('0041-1-6725655', '0049-454-364666'), AuftragTabellenTyp(NULL))); Erzeugen eines BWKunden mittels explizitem Konstruktor-Aufrufs: INSERT INTO Kunde VALUES (BWKundeTyp( 23, 'Jim', AdresseTyp('Fifth Avenue', 45, 45566, 'Bigtown', 'USA'), TelefonArrayTyp('0041-1-6761256'), AuftragTabellenTyp(NULL), HobbiesTabellenTyp(NULL), 10000)); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-73 Updates – Attributwertbelegungen z Belegen von arraywertigen Attributen UPDATE Tabelle SET Arraywertiges-Attribut =VArraytypkonstruktor() z Belegen von tabellenwertigen Attributen UPDATE Tabelle SET Tabellenwertiges-Attribut =([CAST(MULTISET] (SFW-Query) [AS Tabellentypkonstruktor)]) z Belegen von Referenzattributen UPDATE Tabelle SET Referenzattribut =(SELECT REF(t) FROM ReferenzierteTabelle t) z Belegen von objektwertigen Attributen UPDATE Tabelle SET objektwertiges-Attribut=Objekttypkonstruktor(...) Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-74 Objektsichten z Objektsicht = abgeleitete, virtuelle Objekttabelle – – z kann Daten aus mehreren Tabellen enthalten objekterhaltende Sicht ist nicht auf die flache Extension einer Objekttabelle beschränkt Syntax zur Definition einer Wurzelsicht: CREATE VIEW Sichtenname OF Objekttyp [WITH OBJECT IDENTIFIER (Attributliste)] AS Anfrageausdruck [WITH {CHECK OPTION |READ ONLY}] – – – objektgenerierende Sicht muss WITH-OBJECT-IDENTIFIER-Klausel enthalten CHECK OPTION = geänderte Daten dürfen nicht aus der Sicht verschwinden READ ONLY = nicht-änderbare Sicht Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-75 Wurzelsichten – Beispiele CREATE VIEW ZHKunde OF KundeTyp AS (SELECT VALUE(k) FROM Kunde k WHERE VALUE(k) IS OF (ONLY KundeTyp) AND k.Anschrift.Ort = 'Zurich'); Objektsicht basierend auf Objekttabelle → Objekterhaltung CREATE VIEW ZHKundeTupel OF KundeTyp WITH OBJECT IDENTIFIER (KNr) AS (SELECT KNr, Name, Anschrift, Telefone, Auftraege FROM KundeTupelTabelle k WHERE k.Anschrift.Ort = 'Zurich'); Objektsicht basierend auf Tupeltabelle → Objektgenerierung Eine objektgenerierende Sicht kann auch auf einer Objekttabelle definiert sein Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-76 Subsichten z Syntax zur Definition einer Subsicht: CREATE VIEW Subsichtenname OF Subtyp UNDER Supersichtenname AS Anfrageausdruck [WITH {CHECK OPTION |READ ONLY}] – – – – Typ der Subsicht muss ein direkter Subtyp des Typs der Supersicht sein Extension der Subsicht ist immer eine Untermenge der Extension der Supersicht Genauer: Subsicht erweitert die Extension der Supersicht Subsicht hat genau eine direkte Supersicht Keine (direkte) Mehrfachspezialisierung möglich Jede Objektsicht darf pro Subtyp maximal eine Subsicht haben Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-77 Subsichten – Beispiele CREATE VIEW ZHBWKunde OF BWKundeTyp UNDER ZHKunde AS (SELECT VALUE(k) FROM BWKunde k WHERE VALUE(k) IS OF (ONLY BWKundeTyp) AND k.Anschrift.Ort = 'Zurich'); Objekterhaltende Subsicht CREATE VIEW ZHBWKundeObjekt OF BWKundeTyp UNDER ZHKundeTupel AS (SELECT KNr, Name, Anschrift, Telefone, Auftraege, NULL, NULL FROM Kunde k WHERE VALUE(k) IS OF (ONLY BWKundeTyp) AND k.Anschrift.Ort = 'Zurich'); Objektgenerierende Subsicht Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-78 Oracle9i – Datenmodell SET MULTISET OBJECT ROW REF Einstiegspunkte Objekttabelle: Tupeltabelle: VARRAY TABLE SET(OBJECT(...)) MULTISET(ROW(...)) Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) Basisdatentyp Subtypbeziehung 4-79 Oracle 9i – Datenmodellüberblick UNDER Attributtypen Basistyp Tabellentyp Arraytyp Referenztyp Attributtypen OF Tupeltabelle (Menge von Tupeln eines Tupeltyps) Tupelsicht (Menge von Tupeln eines Tupeltyps) Objekttyp Objekttabelle (Menge von Objekten eines Objekttyps) Sichtberechnung basiert auf UNDER OF Objektsicht (Menge von Objekten eines Objekttyps) Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-80 Definition einer Funktion – Beispiel CREATE FUNCTION AnzahlBestellteArtikel(k INTEGER) RETURN INTEGER IS auftragsmenge AuftragTabellenTyp; postab PositionTabellenTyp; gesamt INTEGER := 0; BEGIN SELECT Auftraege INTO auftragsmenge FROM Kunde WHERE KNr = k AND Auftraege IS NOT NULL; IF auftragsmenge IS NOT NULL THEN FOR c IN 1..auftragsmenge.COUNT LOOP IF auftragsmenge(c) IS NOT NULL THEN SELECT Positionen INTO postab FROM Auftrag a WHERE REF(a) = auftragsmenge(c); FOR d IN 1..postab.COUNT LOOP gesamt := gesamt + postab(d).Menge; END LOOP; END IF; END LOOP; END IF; RETURN gesamt; END; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-81 SFW-Block (1) z SELECT: Was darf in der Projektionsliste stehen? – – – z Attribute (auch abgeleitete, berechnete) Methoden-/Funktionsaufrufe Unterabfragen 9 9 9 Beispiel: SELECT Name, AnzahlBestellteArtikel(Name), (SELECT COUNT(*) FROM TABLE(Telefone) t WHERE VALUE(t) LIKE '0041%'), (CAST(MULTISET(SELECT * FROM TABLE(Telefone) t WHERE VALUE(t) LIKE '0049%') AS TelefonarrayTyp)) FROM Kunde k; Skalare Unterabfrage, die genau einen Wert liefert Unterabfragen, die mehrere Werte liefern, müssen mit MULTISET umhüllt und in Kollektionstyp gecastet werden Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-82 SQL-Erweiterungen – Neue Ausdrücke z Zugriff auf kollektionswertiges Attribut SELECT Kollektionswertiges-Attribut FROM Tabelle z Zugriff auf Referenz (OID des referenzierten Objekts) SELECT Referenzattribut FROM Tabelle z Zugriff auf eingebettetes Objekt bzw. Objektwert SELECT Objektwertiges-Attribut FROM Tabelle z Zugriff auf Objektwert SELECT VALUE(v) FROM Objekttabelle v Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-83 SQL-Erweiterungen – Neue Ausdrücke z Zugriff auf Referenz (Objektidentifikator in interner Darstellung) SELECT REF(v) FROM Objekttabelle v z Dereferenzierung (liefert Wert des referenzierten Objekts) SELECT DEREF(Referenzattribut) FROM Tabelle – z DEREF ist nicht direkt anwendbar auf (Objekttabellen-)Variablen Methodenaufrufe erlaubt in SELECT- und WHERE-Klauseln SELECT v.Methodenname(Parameter) FROM Objekttabelle v; z Typkonvertierungen CAST(Arraywertiges-Attribut AS Tabellen-Typ) CAST(MULTISET(SFW-Query) AS Tabellen-Typ) Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-84 SQL-Erweiterungen – Beispiele für Pfadausdrücke (1) SELECT Anschrift FROM Kunde; liefert die eingebetteten Anschrift-Objekte aller Kunden SELECT k.Anschrift.Ort FROM Kunde k; liefert die Wohnorte aller Kunden SELECT Lieferant FROM Auftrag; liefert die Objektidentifikatoren aller referenzierten Lieferanten SELECT k.Lieferant.LNr FROM Auftrag k; liefert die Lieferantennummer aller referenzierten Lieferanten Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-85 SQL-Erweiterungen – Beispiele für Pfadausdrücke (2) SELECT DEREF(Lieferant) FROM Auftrag; liefert die Objektwerte der referenzierten Lieferanten Ergebnistyp=LieferantTyp(LNr, Name, ...) SELECT a.ANr FROM Auftrag WHERE a.Lieferant.Name = 'ETH bestimmt alle Aufträge ana den Lieferanten "ETH Zurich " Zurich'; Alternative Formulierung mit einem Verbund über Referenzen SELECT a.ANr FROM Auftrag a, Lieferant l WHERE a.Lieferant = REF(l) AND l.Name = 'ETH Zurich'; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-86 SQL-Erweiterungen – Beispiel für Konvertierungsfunktionen SELECT a.Eingang, CAST(MULTISET(SELECT REF(b) FROM Auftrag b WHERE a.Eingang=b.Eingang) AS AuftragTabellenTyp) FROM Auftrag a; liefert zu jedem Eingangsdatum die Menge der Aufträge z Verwendungszweck von MULTISET ist beschränkt – – Kann nicht einer Aggregatfunktion übergeben werden Kann nicht mit Mengenoperationen weiterverarbeitet werden Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-87 SFW-Block (2) z FROM: Welche Tabellenausdrücke sind erlaubt? – – – – – z Tupeltabellen Objekttabellen Kollektionsabgeleitete Tabellen Funktionsaufrufe (die Tabellen liefern) Unterabfragen (abgeleitete Tabellen) 9 9 9 — 9 Beispiel: Kollektionsabgeleitete bzw. mittels Unterabfragen abgeleitete Tabellen SELECT * FROM Kunde k, TABLE(k.Auftraege) a; SELECT * FROM (SELECT Auftraege FROM Kunde); SELECT * FROM TABLE(SELECT Auftraege FROM Kunde WHERE Name = 'Billy'); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-88 SQL-Erweiterungen – Beispiele z Unteranfrage als Wertebereich für eine Variable SELECT ANr, AVG(AnzahlKundenAuftraege) FROM (SELECT ANr, COUNT(*) AS AnzahlKundenAuftraege FROM Auftrag GROUP BY ANr) GROUP BY ANr; z Qualifikation einer inneren Tabelle als Wertebereich SELECT * FROM TABLE(SELECT Positionen FROM Auftrag WHERE ANr=1704); – Ausdruck TABLE(SFW-Query) bezeichnet einen neuen Wertebereich Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-89 SFW-Block (3) z WHERE: Welche Prädikate sind erlaubt? – – – z Prädikate über Attribute Prädikate mit Funktionsaufrufen Prädikate mit Unterabfragen 9 9 9 Beispiel: SELECT * FROM Kunde k WHERE Name LIKE 'C%' AND AnzahlBestellteArtikel(Name) > 5 AND Telefone IS NOT NULL AND EXISTS(SELECT * FROM TABLE(Telefone) t WHERE VALUE(t) LIKE '0041%'); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-90 Beispiel: Anfragen auf geschachtelten Tabellen A AN {VA} VNR VTB Abteilungen {TA} TNR TTB {LG} LN J 75 1 Forschung 121 Bibliothek 511 Programmentwicklung 1 122 Sektretariat 2 76 130 Übersetzung 5 79 140 Patente 552 Grundlagen 1 82 169 Sektretariat 2 79 678 Planung 2 76 4 82 2 Entwicklung 119 Sektretariat 650 Design 1 75 125 Übersetzung 4 77 135 Beschaffung 780 Wartung 1 75 981 Planung 2 81 3 82 4 Test NULL 952 Design 1 75 4 77 82 573 Planung 3 Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-91 Umsetzung mit Tabellen- und Objekttypen CREATE TYPE Lehrgang AS OBJECT (LN INTEGER, J INTEGER); CREATE TYPE Lehrgaenge AS TABLE OF Lehrgang; CREATE TYPE TechnischerAngestellter AS OBJECT (TNR INTEGER, TTB VARCHAR(25), LG Lehrgaenge); CREATE TYPE TechnischeAngestellte AS TABLE OF TechnischerAngestellter; CREATE TYPE VerwaltungsAngestellter AS OBJECT (VNR INTEGER, VTB VARCHAR(25)); CREATE TYPE VerwaltungsAngestellte AS TABLE OF VerwaltungsAngestellter; CREATE TYPE Abteilung AS OBJECT (A INTEGER, AN VARCHAR(20), VA VerwaltungsAngestellte, TA TechnischeAngestellte); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-92 Objekttabelle mit geschachtelten, tabellenwertigen Attributen CREATE TABLE Abteilungen OF Abteilung ( A PRIMARY KEY, AN NOT NULL ) NESTED TABLE VA STORE AS VA NESTED TABLE TA STORE AS TA (NESTED TABLE LG STORE AS LG); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-93 Einfügen geschachtelter Objekte (1) INSERT INTO Abteilungen VALUES ( 1, 'Forschung', VerwaltungsAngestellte(VerwaltungsAngestellter(121, 'Bibliothek'), VerwaltungsAngestellter(122, 'Sekretariat'), VerwaltungsAngestellter(130, 'Uebersetzung'), VerwaltungsAngestellter(140, 'Patente'), VerwaltungsAngestellter(169, 'Sekretariat')), TechnischeAngestellte(TechnischerAngestellter(511, 'Programmentwicklung', Lehrgaenge(Lehrgang(1,75), Lehrgang(2,76), Lehrgang(5,79))), TechnischerAngestellter(552, 'Grundlagen', Lehrgaenge(Lehrgang(1,82),Lehrgang(2,79))), TechnischerAngestellter(678, 'Planung', Lehrgaenge(Lehrgang(2,76), Lehrgang(4,82)))) ); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-94 Einfügen geschachtelter Objekte (2) INSERT INTO Abteilungen VALUES ( 2, 'Entwicklung', VerwaltungsAngestellte(VerwaltungsAngestellter(119, 'Sekretariat'), VerwaltungsAngestellter(125, 'Uebersetzung'), VerwaltungsAngestellter(135, 'Beschaffung')), TechnischeAngestellte (TechnischerAngestellter(650, 'Design', Lehrgaenge(Lehrgang(1,75), Lehrgang(4,77))), TechnischerAngestellter(780, 'Wartung', Lehrgaenge(Lehrgang(3,82))), TechnischerAngestellter(981, 'Planung', Lehrgaenge(Lehrgang(2,81), Lehrgang(3,82)))) ); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-95 Einfügen geschachtelter Objekte (3) INSERT INTO Abteilungen VALUES ( 4, 'Test', NULL, TechnischeAngestellte(TechnischerAngestellter(952, 'Design', Lehrgaenge(Lehrgang(1,75), Lehrgang(4,77))), TechnischerAngestellter(573, 'Planung', Lehrgaenge(Lehrgang(3,82)))) ); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-96 Geschachtelte Projektionen SELECT A, CURSOR(SELECT TNR, TTB FROM TABLE(TA)) AS TA FROM Abteilungen; A TNR 1 511 552 678 2 650 780 981 4 952 573 {TA} TTB Programmentwicklung Grundlagen Planung Design Wartung Planung Design Planung Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-97 Geschachtelte Projektionen – Variante mit Ergebistabellentyp CREATE TYPE ATYP AS OBJECT (NR INTEGER, TB VARCHAR(20)); CREATE TYPE ATAB AS TABLE OF ATYP; SELECT A, CAST(MULTISET(SELECT TNR, TTB FROM TABLE(TA)) AS ATAB) AS TA FROM Abteilungen; Darstellung (in Oracle) A TA(NR, TB) 1 ATAB(ATYP(511, Programmentwicklung), ATYP(552, Grundlagen), ATYP(678, Planung)) 2 ATAB(ATYP(650, Design), ATYP(780, Wartung), ATYP(981, Planung)) 4 ATAB(ATYP(952, Design), ATYP(573, Planung)) Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-98 Geschachtelte Selektionen SELECT * FROM Abteilungen WHERE EXISTS(SELECT * FROM TABLE(VA) WHERE VTB = 'Patente'); A AN 1 {VA} VNR VTB Forschung 121 122 130 140 169 {TA} TNR TTB {LG} LN J 75 Bibliothek 511 Programmentwicklung 1 Sektretariat 2 76 Übersetzung 5 79 Patente 552 Grundlagen 1 82 Sektretariat 2 79 678 Planung 2 76 4 82 Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-99 Geschachtelte Selektion innerhalb einer Projektion SELECT A, CURSOR(SELECT VNR FROM TABLE(VA) WHERE VTB = 'Sekretariat') AS VA FROM Abteilungen; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) A {VA} VNR 1 122 169 2 119 4 NULL 4-100 Geschachtelte Selektion innerhalb einer Projektion – Variante mit Ergebistabellentyp CREATE TYPE BTYP AS OBJECT (NR INTEGER); CREATE TYPE BTAB AS TABLE OF BTYP; SELECT A, CAST(MULTISET(SELECT VNR FROM TABLE(VA) WHERE VTB = 'Sekretariat') AS BTAB) AS VA FROM Abteilungen; Darstellung (in Oracle) A 1 2 4 VA(NR) BTAB(BTYP(122), BTYP(169)) BTAB(BTYP(119)) BTAB() Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-101 Geschachtelte Projektion innerhalb einer Selektion SELECT * FROM Abteilungen WHERE 'Design' IN (SELECT TTB FROM TABLE(TA)); A AN {VA} VNR VTB 2 Entwicklun g 119 125 135 4 Test NULL {TA} TNR TTB Sektretariat 650 Übersetzung Beschaffung 780 981 952 573 {LG} LN J Design 1 75 4 77 Wartung 1 75 Planung 2 81 3 82 Design 1 75 4 77 Planung 3 82 Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-102 "Entschachtelung" SELECT A, AN, VNR, VTB FROM Abteilungen, TABLE(VA); Entschachtelung entfernt äussere Tupel/Objekte, deren innere Tabelle NULL ist Dies kann analog zum OUTER JOIN wie folgt verhindert werden: SELECT A, AN, VNR, VTB FROM Abteilungen, TABLE(VA)(+); A 1 1 1 1 1 2 2 2 AN Forschung Forschung Forschung Forschung Forschung Entwicklung Entwicklung Entwicklung VNR 121 122 130 140 169 119 125 135 VTB Bibliothek Sektretariat Übersetzung Patente Sektretariat Sektretariat Übersetzung Beschaffung A 1 1 1 1 1 2 2 2 4 AN Forschung Forschung Forschung Forschung Forschung Entwicklung Entwicklung Entwicklung Test VNR 121 122 130 140 169 119 125 135 NULL VTB Bibliothek Sektretariat Übersetzung Patente Sektretariat Sektretariat Übersetzung Beschaffung NULL Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-103 Komplett entschachtelte Darstellung SELECT A, AN, VNR, VTB, TNR, TTB, LN, J FROM Abteilungen a, TABLE(a.VA) v, TABLE(a.TA) t, TABLE(t.LG) l WHERE a.A = 2; Achtung: SELECT * würde hier folgende 11 Spalten liefern: A, AN, VA(VNR, VTB), TA(TNR, TTB, LG(LN, J)), VNR, VTB, TNR, TTB, LG(LN, J), LN, J A 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 AN Entwicklung Entwicklung Entwicklung Entwicklung Entwicklung Entwicklung Entwicklung Entwicklung Entwicklung Entwicklung Entwicklung Entwicklung Entwicklung Entwicklung Entwicklung VNR 119 119 119 119 119 125 125 125 125 125 135 135 135 135 135 VTB Sektretariat Sektretariat Sektretariat Sektretariat Sektretariat Übersetzung Übersetzung Übersetzung Übersetzung Übersetzung Beschaffung Beschaffung Beschaffung Beschaffung Beschaffung Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) TNR 650 650 780 981 981 650 650 780 981 981 650 650 780 981 981 TTB Design Design Wartung Planung Planung Design Design Wartung Planung Planung Design Design Wartung Planung Planung LN 1 4 1 2 3 1 4 1 2 3 1 4 1 2 3 J 75 77 75 81 82 75 77 75 81 82 75 77 75 81 82 4-104 Hierarchische Anfragen (1) Oracle bietet mit dem Konstrukt START WITH ... CONNECT BY PRIOR die Möglichkeit, hierarchische Anfragen zu formulieren (eingeschränkt auf azyklische Graphen; Hierarchien; Bäume) Ermittle alle (transitiven) Flugverbindungen von Zürich ausgehend SELECT LPAD(' ', 3*(LEVEL-1)) || Abflug || ' -> ' || Ziel AS Flugverbindung FROM Flug START WITH Abflug = 'Zürich' CONNECT BY PRIOR Ziel = Abflug; Flug FlugNr LH131 BA170 AF691 UA103 SR163 TK911 BA297 Abflug Frankfurt Zürich Paris Sydney Zürich Paris London Ziel Sydney London New York New York Frankfurt Istanbul Frankfurt Preis 1009 599 1299 1549 499 799 299 Flugverbindung Zürich -> London London -> Frankfurt Frankfurt -> Sydney Sydney -> New York Zürich -> Frankfurt Frankfurt -> Sydney Sydney -> New York Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-105 Hierarchische Anfragen (2) Flug FlugNr LH131 BA170 AF691 UA103 SR163 TK911 BA297 Abflug Frankfurt Zürich Paris Sydney Zürich Paris London Ziel Sydney London New York New York Frankfurt Istanbul Frankfurt Preis 1009 599 1299 1549 499 799 299 Gebe alle Städte aus, die von Zürich aus erreichbar sind SELECT Ziel FROM Flug START WITH Abflug = 'Zürich' CONNECT BY PRIOR Ziel = Abflug; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) Ziel London Frankfurt New York Sydney 4-106 Hierarchische Anfragen (3) Finde alle Städte, die von Zürich mit maximal zweimal Umsteigen erreichbar sind Flug FlugNr LH131 BA170 AF691 UA103 SR163 TK911 BA297 SELECT DISTINCT 'Zürich' AS Abflug, LEVEL-1 AS Via FROM Flug WHERE LEVEL <= 3 START WITH Abflug = 'Zürich' CONNECT BY PRIOR Ziel = Abflug ORDER BY via; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) Abflug Frankfurt Zürich Paris Sydney Zürich Paris London Abflug Zürich Zürich Zürich Zürich Zürich Zürich Ziel Sydney London New York New York Frankfurt Istanbul Frankfurt Preis 1009 599 1299 1549 499 799 299 Ziel Via Frankfurt 0 London 0 Frankfurt 1 Sydney 1 New York 2 Sydney 2 4-107 Objektrelationale Erweiterungen in Informix z Neue Basisdatentypen z Typkonstruktoren z Benutzerdefinierte Typen – – Distinct-Typen Benannte Tupeltypen (mit Typvererbung) z Typisierte Tabellen (mit Subtabellenbildung) z Typisierte Sichten Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-108 Neue Basisdatentypen z BOOLEAN – z Werte: 'T', 't', 'F', 'f', NULL Large Objects – – – – BLOB (Binary Large Object) CLOB (Character Large Object) Operationen FILETOBLOB, FILETOCLOB, LOTOFILE, LOCOPY = (bitweise Gleichheit), IS [NOT] NULL Nicht erlaubt BLOB/CLOB-Attribute als Teil eines Schlüssels oder in booleschen bzw. arithmetischen Ausdrücken GROUP BY, ORDER BY Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-109 Basisdatentypen Basisdatentyp Bedeutung SMALLINT (16 Bit) ganze Zahl [-32768, 32767] INTEGER (32 Bit) ganze Zahl [-2147483648, 2147483647] INT8 (64 Bit) ganze Zahl [-9223372036854775808, 9223372036854775807] DECIMAL(p,q) NUMERIC(p,q) Festkommazahl mit Genauigkeit p und q Nachkommastellen (p ≤ 32) FLOAT(p) REAL DOUBLE PRECISION Fließkommazahl mit Genauigkeit p (≤ 16) CHAR(q) Alphanumerische Zeichenkette mit fester Länge q (≤ 254) VARCHAR(q) Alphanumerische Zeichenkette mit variabler Länge q (≤ 254) CLOB Alphanumerische Zeichenkette mit variabler Länge bis 4TB BLOB Binäre Zeichenkette mit variabler Länge bis 2GB DATE Datum DATETIME Zeit INTERVAL Zeitinterval Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-110 Verwendung neuer Basisdatentypen Definition einer Tabelle mit BOOLEAN- und LOB-Attributen: CREATE TABLE MitarbeiterTupelTabelle ( Name VARCHAR(30), Vollzeit BOOLEAN, Bild BLOB, Bewerbung CLOB ); Erzeugen von BOOLEAN- bzw. LOB-Attributen: INSERT INTO MitarbeiterTupelTabelle VALUES ('Billy', 'T', FILETOBLOB('D:\ImgSamp\billy.gif', 'client'), FILETOCLOB('D:\RsmSamp\billy.rsm', 'server')); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-111 Verwendung neuer Basisdatentypen (Forts.) Kopieren von LOB-Attributwerten: UPDATE MitarbeiterTupelTabelle SET Bewerbung = (SELECT LOCOPY(Lebenslauf) FROM PersonenTupelTabelle WHERE Name = 'Billy') WHERE Name = 'Billy'; Verwendung von BOOLEAN- und LOB-Attributen: SELECT LOTOFILE(Bewerbung, 'D:\RsmSamp\' || Name || '.rsm', 'server') FROM MitarbeiterTupelTabelle WHERE Vollzeit = 'T'; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-112 Typkonstruktoren z Tupeltypkonstruktor: ROW – z Kollektionstypen: SET, MULTISET, LIST – – z Enthaltenseinstest (IN) Kardinalität (CARDINALITY) Einschränkungen – – z Tupelkomponentenselektion mittels Dot-Operator Kollektionselemente müssen NOT NULL sein Für tupelwertige bzw. kollektionswertige Attribute sind abgesehen von NOT NULL keine Integritätsbedingungen erlaubt Typkonstruktoren sind orthogonal (beliebig kombinierbar) Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-113 Verwendung von Typkonstruktoren in Tabellendefinitionen CREATE TABLE PersonenTupelTabelle ( Name VARCHAR(30), Anschrift ROW( Strasse VARCHAR(30), Nr DECIMAL(4), PLZ DECIMAL(5), Ort VARCHAR(40), Land VARCHAR(25)), Telefone LIST(VARCHAR(20) NOT NULL), Hobbies SET(ROW(Hobby VARCHAR(15), Aktiv BOOLEAN) NOT NULL), Lebenslauf CLOB ); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-114 Verwendung von Typkonstruktoren in Einfügeoperationen z Einfügen eines neuen Kunden INSERT INTO PersonenTupelTabelle VALUES ('Billy', ROW('Seefeldstrasse', 31, 8008, 'Zurich', 'CH'), "LIST{'0041-1-6327248', '0041-1-7337947'}", "SET{ROW('Reisen', 'T'), ROW('Sport', 'F')}" , FILETOCLOB('D:\RsmSamp\billy.rsm', 'server')); – Ungewöhnliche Instanziierung von Kollektionstypen mit Anführungsstrichen Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-115 Selektion und Update von Tupelkomponenten z Zugriff auf Tupelkomponenten mittels Dot-Notation möglich SELECT Name, Anschrift.Ort FROM KundeTupelTabelle WHERE Anschrift.Land = 'CH'; z Tupelwertige Attribute sind nur als Ganzes änderbar – Ändern einzelner Tupelkomponenten nur innerhalb von SPL-Routinen möglich UPDATE KundeTupelTabelle SET Anschrift = ROW('Kreuzstrasse', 21, 8008, 'Zurich', 'Schweiz') WHERE Name = 'Billy'; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-116 Behandlung einzelner Tupelkomponenten z Nur innerhalb von SPL-Routinen unterstützt CREATE PROCEDURE Prozedurname(Parameterliste) ... END PROCEDURE; z Deklaration einer Tupelvariablen DEFINE a ROW(Strasse VARCHAR(30), Nr DECIMAL(4), PLZ DECIMAL(5), Ort VARCHAR(40), Land VARCHAR(25)); z Zuweisung eines Werts an eine Tupelkomponente LET a.Ort = 'Wiesbaden'; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-117 Prozedur zum Ändern des Wohnortes einer Anschrift CREATE PROCEDURE NeuerOrt(kname VARCHAR(30), kort VARCHAR(40)) DEFINE a ROW(Strasse VARCHAR(30), Nr DECIMAL(4), PLZ DECIMAL(5), Ort VARCHAR(40), Land VARCHAR(25)); SELECT Anschrift INTO a FROM KundeTupelTabelle WHERE Name = kname; LET a.Ort = kort; UPDATE KundeTupelTabelle SET Anschrift = a WHERE Name = kname; END PROCEDURE; Änderung durch Prozeduraufruf: CALL PROCEDURE NeuerOrt('kname', 'kort'); Wünschenwert wäre dennoch eine direkte Manipulutation der Form: UPDATE KundeTupelTabelle SET Anschrift.Ort = 'kort'; WHERE Name = 'kname'; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-118 Selektion und Update von Kollektionen z Zugriff auf ganze Kollektion SELECT Name, Telefone FROM KundeTupelTabelle WHERE Anschrift.Land = 'CH'; z Kollektionswertige Attribute sind nur als Ganzes änderbar – Einfügen, Ändern oder Löschen einzelner Kollektionselemente nur innerhalb von SPL-Routinen möglich UPDATE KundeTupelTabelle SET Telefone = "LIST{'0041-1-6327248', '0041-1-7337947', '0049-6151-295479'}" WHERE Name = 'Billy'; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-119 Operationen auf Kollektionen z Enthaltenseinstest (Nicht-Enthaltensein NOT IN) SELECT Name FROM KundeTupelTabelle WHERE '0041-1-9439470' IN Telefone; liefert den Namen der Kunden mit der Telefonnummer '0041-1-9439470' z Kardinalität SELECT Name, CARDINALITY(Telefone) FROM KundeTupelTabelle; liefert für jeden Kunden die zugehörige Anzahl von Telefonnummern Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-120 Operationen auf Kollektionen (Forts.) z Kollektion in Tabelle umwandeln (Doppelklammerung bei SFW-Ausdrücken nötig) SELECT * FROM TABLE((SELECT Auftraege FROM KundeTupelTabelle WHERE Name='Billy')) a WHERE a.Anzahl > 10; liefert alle Aufträge vom Kunden 'Billy', die eine bestimmte Anzahl überschreiten SELECT Name, (SELECT a.Anzahl FROM TABLE(KundeTupelTabelle.Auftraege) a WHERE a.ProduktNr = '435-663-AB') FROM KundeTupelTabelle; liefert die Kunden und die Anzahl ihrer bestellten Produkte mit der Nummer 17 Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-121 Behandlung einzelner Kollektionselemente (1) z Nur innerhalb von SPL-Routinen unterstützt CREATE PROCEDURE Prozedurname(Parameterliste) ... END PROCEDURE; z Deklaration einer Kollektionsvariablen sowie einer Elementvariablen DEFINE telefonnummern LIST(VARCHAR(20) NOT NULL); DEFINE telefonnummer VARCHAR(20); z Belegen einer Kollektionsvariablen LET telefonnummern = "LIST{'0041-1-9876543'}"; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-122 Behandlung einzelner Kollektionselemente (2) z Belegen einer Kollektionsvariable mittels SFW-Klausel SELECT Telefone INTO telefonnummern FROM KundeTupelTabelle WHERE Name = 'Billy'; z Einfügen eines Elements in eine Liste auf der Position 1 INSERT AT 1 INTO TABLE(telefonnummern) VALUES('0041-1-1872321'); z Änderungen von Kollektionsvariablen haben keine Wirkung auf der DB – Änderungen müssen explizit mittels UPDATE in die DB eingebracht werden UPDATE KundeTupelTabelle SET Telefone = telefonnummern WHERE Name = 'Billy'; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-123 Behandlung einzelner Kollektionselemente (3) z Cursor für Kollektionsvariablen FOREACH c FOR SELECT Telefone INTO telefonnummern FROM KundeTupelTabelle FOREACH d FOR SELECT * INTO telefonnummer FROM TABLE(telefonnummern) IF telefonnummer[1,4] = '0049' THEN DELETE FROM TABLE(telefonnummern) WHERE CURRENT OF d; END IF; END FOREACH; UPDATE KundeTupelTabelle SET Telefone = telefonnummern WHERE CURRENT OF c; END FOREACH; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-124 Prozedur zum Einfügen einer neuen Telefonnummer CREATE PROCEDURE NeueNummer(kname VARCHAR(30), tnr VARCHAR(20)) DEFINE telefonnummern LIST(VARCHAR(20) NOT NULL); DEFINE telefonnummer VARCHAR(20); SELECT Telefone INTO telefonnummern FROM KundeTupelTabelle WHERE Name = kname; INSERT AT 1 INTO TABLE(telefonnummern) VALUES(tnr); UPDATE KundeTupelTabelle SET Telefone = telefonnummern WHERE Name = kname; END PROCEDURE; Einfügen durch Prozeduraufruf: CALL PROCEDURE NeueNummer('kname', 'tnr'); Wünschenwert wäre dennoch eine direkte Manipulutation der Form: INSERT AT 1 INTO TABLE(SELECT Telefone FROM KundeTupelTabelle WHERE Name = 'kname') VALUES('tnr'); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-125 Prozedur zum Entfernen einer bestimmten Telefonnummer CREATE PROCEDURE EntferneTelefonnummer(tnr VARCHAR(20)) DEFINE nummern LIST(VARCHAR(20) NOT NULL); DEFINE nummer VARCHAR(20); FOREACH c FOR SELECT Telefone INTO nummern FROM KundeTupelTabelle WHERE tnr IN Telefone FOREACH d FOR SELECT * INTO nummer FROM TABLE(nummern) IF nummer = tnr THEN DELETE FROM TABLE(nummern) WHERE CURRENT OF d; END IF; END FOREACH; UPDATE KundeTupelTabelle SET Telefone = nummern WHERE CURRENT OF c; END FOREACH; END PROCEDURE; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-126 Distinct-Typen z Kopie eines bereits existierendes Typs – – – z Distinct-Typen dürfen auch auf benutzerdefinierten Typen basieren Explizite Cast-Funktionen zur Konversion zwischen Distinct-Typ und Quelltyp und umgekehrt automatisch bereitgestellt Definition impliziter Cast-Funktionen erfordert vorheriges Löschen obiger Funktionen Syntax: CREATE DISTINCT TYPE Distinct-Typname AS Quelltyp Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-127 Beispieldefinition und Verwendung von Distinct-Typen Definition von Distinct-Typen: CREATE DISTINCT TYPE Franken AS DECIMAL(12,2); CREATE DISTINCT TYPE Euro AS DECIMAL(12,2); Verwendung von Distinct-Typen in Tabellendefinitionen: CREATE TABLE CHBank(Nr INTEGER, Stand Franken); CREATE TABLE EuroBank(Nr INTEGER, Stand Euro); Anfrage basierend auf Distinct-Typen: SELECT c.Nr, c.Stand FROM CHBank c, EuroBank e WHERE c.Stand > e.Stand; Ungültige Anfrage: Schweizer Franken und Euro nicht vergleichbar → Konvertierung ist notwendig! Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-128 Verwendung von Cast-Funktionen z Alternative, äquivalente Formulierungen SELECT c.Nr, c.Stand FROM CHBank c, EuroBank e WHERE c.Stand::DECIMAL > e.Stand::DECIMAL; ... WHERE CAST(c.Stand AS DECIMAL) < CAST(e.Stand AS DECIMAL); ... WHERE c.Stand::DECIMAL < CAST(e.Stand AS DECIMAL); ... WHERE CAST(e.Stand AS DECIMAL) < e.Stand::DECIMAL; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-129 Benutzerdefinierte Cast-Funktionen z Konversion zwischen unterschiedlichen Datentypen z Syntax: – – – – CREATE [EXPLICIT|IMPLICIT] CAST (Quelltyp AS Zieltyp WITH Konvertierungsfunktion) Konvertierungsfunktion hat genau einen Parameter vom Typ Quelltyp sowie Zieltyp als Rückgabetyp Quelltyp und Zieltyp dürfen nicht vom Typ LIST, SET, MULTISET, ROW, BLOB oder CLOB sein IMPLICIT: Implizite Cast-Funktion (wird automatisch aufgerufen) Defaulteinstellung: EXPLICIT Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-130 Explizite benutzerdefinierte Cast-Funktionen - Beispiel Definition einer Konvertierungsfunktion: CREATE FUNCTION EuroToFranken(e Euro) RETURNS Franken RETURN CAST((e::DECIMAL * 1.5) AS Franken); END FUNCTION; Definition einer expliziten Cast-Funktion: CREATE CAST (Euro AS Franken WITH EuroToFranken); Vorherige Anfrage nun mit direkter Konvertierung von Euro nach Franken: SELECT c.Nr, c.Stand FROM CHBank c, EuroBank e WHERE c.Stand > CAST(e.Stand AS Franken); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-131 Implizite benutzerdefinierte Cast-Funktionen - Beispiel Definition einer Konvertierungsfunktion: CREATE FUNCTION FrankenToEuro(f Franken) RETURNS Euro RETURN CAST((CAST(f AS DECIMAL) * 0.65) AS Euro); END FUNCTION; Definition einer impliziten Cast-Funktion: CREATE IMPLICIT CAST (Franken AS Euro WITH FrankenToEuro); Vorherige Anfrage nun mit impliziter Konvertierung von Franken nach Euro: SELECT c.Nr, c.Stand FROM CHBank c, EuroBank e WHERE c.Stand > e.Stand; Achtung: Falls implizite Cast-Funktionen in beiden Richtungen vorhanden sind, wird automatisch nur der rechte Ausdruck des Vergleichsprädikats konvertiert! Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-132 Benannte Tupeltypen (Named Row Types) z Wiederverwendbare Tupeltypen – – – Typ eines Attributes kann auch ein Tupeltyp (ROW; benannt oder unbenannt) oder Kollektionstyp (SET, MULTISET, LIST) sein Typvererbung (Subtyp erbt alle Attribute des Supertyp) und Substituierbarkeit Nicht unterstützt werden Referenztypen und Objektidentifikatoren Kapselung und Methoden Defaultwerte und Integritätsbedingungen (abgesehen von NOT NULL) z Syntax für Wurzeltypdefinition: z Attributdefinition: CREATE ROW TYPE Typname (Attributdefinitionsliste) Attributname Typ [NOT NULL] Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-133 Benannte Tupeltypen – Beispiele CREATE ROW TYPE AdresseTyp ( Strasse VARCHAR(30), Nr DECIMAL(4), PLZ DECIMAL(5), Ort VARCHAR(40), Land VARCHAR(25) ); CREATE ROW TYPE AuftragTyp ( ANr INTEGER, Lieferant VARCHAR(20), Positionen LIST(ROW(ArtikelNr INTEGER, Anzahl INTEGER) NOT NULL) ); CREATE ROW TYPE KundeTyp ( KNr INTEGER NOT NULL, Name ROW(Vorname VARCHAR(25), Nachname VARCHAR(35)) NOT NULL, Anschrift AdresseTyp, Telefone LIST(VARCHAR(20) NOT NULL), Auftraege SET(AuftragTyp NOT NULL) ); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-134 Attributtypen für Tupeltabellen z Mögliche Attributtypen: – – – Basisdatentypen Mittels der Typkonstruktoren konstruierte (unbenannte) Typen Benannte Tupeltypen CREATE TABLE KundeTupelTabelle ( KNr INTEGER NOT NULL, Name ROW(Vorname VARCHAR(25), Nachname VARCHAR(35)) NOT NULL, Anschrift AdresseTyp, Telefone LIST(VARCHAR(20) NOT NULL), Auftraege SET(AuftragTyp NOT NULL) ); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-135 Typ-Instanziierung in Einfügeoperationen z Einfügen eines neuen Kunden INSERT INTO KundeTupelTabelle VALUES (17, ROW('Billy', 'Schwarz'), ROW('Seefeldstrasse', 31, 8008, 'Zurich', 'Schweiz')::AdresseTyp, "LIST{'0041-1-6327248', '0041-1-7337947'}", "SET{ROW(13, 'ETHWorld', LIST{ROW(453, 10)}), ROW(70, 'XYZ', LIST{ROW(959, 50), ROW(911, 100)})}"); – – Tupeltypkonstruktoraufruf mit explizitem Casting (Doppel-Doppelpunkt) notwendig, um eine Instanz eines benannten Tupeltyps zu erzeugen Achtung: Innerhalb von Schachtelungen fallen sowohl das Casting bei benannten Tupeltypen als auch die doppelten Anführungsstriche bei Kollektionstypen weg Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-136 Subtypbildung – Aufbau von Typhierarchien z Syntax: – – – z CREATE ROW TYPE Typname (Attributdefinitionsliste) UNDER Supertypname Subtyp erbt alle Attribute des Supertyps Supertyp muss ein selbst ein benannter Tupeltyp sein Subtyp darf nur maximal einen direkten Supertyp haben Keine (direkte) Mehrfachvererbung möglich Beispiel: CREATE ROW TYPE BWKundeTyp ( Interessen LIST(VARCHAR(20) NOT NULL) ) UNDER KundeTyp; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-137 Überladen von Routinen und Substituierbarkeit z Routinen (Prozeduren und Funktionen) sind überladbar – z Instanz eines Subtyps kann in jedem Kontext benutzt werden, wo eine Instanz eines Supertyps nutzbar ist – – z Routinen mit demselben Namen, aber unterschiedlicher Signatur sind erlaubt Eingabeargumente für Routinen, deren formale Parameter auf dem Supertyp definiert sind Rückgabewert einer Routine, für die der Supertyp als Typ definiert wurde Informix spricht hier von "Vererbung von Routinen" und sagt, dass "geerbte" Routinen überladen, aber nicht überschrieben werden dürfen Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-138 Definition von typisierten Tabellen z Typisierte Tabelle basiert auf einem benannten Tupeltyp – – – Speichert Instanz dieses Typs als Zeile der Tabelle Besitzt kein OID-Attribut Konzept der Objektidentifikatoren und Referenzen wird nicht unterstützt Kann Integritätsbedingungen enthalten Primär-/Unique-/Fremdschlüssel, Check-Klausel z Syntax: CREATE TABLE Tabellenname OF TYPE BenannterTupeltyp [(Integritätsbedingungsliste)] z Beispiel: CREATE TABLE Kunde OF TYPE KundeTyp ( PRIMARY KEY(KNr) ); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-139 Operationen auf typisierten Tabellen INSERT INTO Kunde VALUES (17, ROW('Billy', 'Schwarz'), ROW('Seefeldstrasse', 31, 8008, 'Zurich', 'CH')::AdresseTyp, "LIST{'0041-1-6327248', '0041-1-7337947'}", "SET{ROW(13, 'ETHWorld', LIST{ROW(453, 10)}), ROW(70, 'XYZ', LIST{ROW(959, 50), ROW(911, 100)})}"); UPDATE Kunde SET Anschrift= ROW('Kreuzstrasse', 21, 8008, 'Zurich', 'CH')::AdresseTyp WHERE Name.Vorname = 'Billy'; DELETE FROM Kunde WHERE Anschrift.Ort = 'Zurich'; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-140 Subtabellenbildung – Aufbau von Tabellenhierarchien z Syntax: – – – – z CREATE TABLE Tabellenname OF TYPE BenannterTupeltyp [(Integritätsbedingungsliste)] UNDER Supertabelle Typ der Subtabelle muss ein direkter Subtyp des Typs der Supertabelle sein (Tiefe) Extension der Subtabelle muss immer eine Untermenge der (tiefen) Extension der Supertabelle sein Instanzen der Subtabelle sind auch Mitglieder der zugehörigen Supertabellen Subtabelle darf nur maximal eine direkte Supertabelle haben Keine (direkte) Mehrfachspezialisierung möglich Subtabelle kann neue Integritätsbedingungen hinzudefinieren Beispiel: CREATE TABLE BWKunde OF TYPE BWKundeTyp (CHECK(Telefone IS NOT NULL)) UNDER Kunde; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-141 Anfragen an Tabellenhierarchien SELECT * FROM Kunde; liefert alle Attributwerte der Kunden SELECT * FROM BWKunde; Zugriff auf tiefe Extension einer Supertabelle Zugriff auf tiefe Extension einer Subtabelle liefert alle Attributwerte der "Besonders Wichtigen" Kunden SELECT * FROM ONLY(Kunde); liefert alle Attributwerte der "Nicht Besonders Wichtigen" Kunden Zugriff auf flache Extension einer Supertabelle Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-142 Typisierte Sichten z Analog zu typsierten Tabellen sind typisierte Sichten definierbar – Subsichten nicht unterstützt z Syntax: CREATE VIEW Sichtenname OF TYPE BenannterTupeltyp AS Anfrageausdruck [WITH CHECK OPTION] z Beispiel: CREATE VIEW GuterKunde OF TYPE KundeTyp AS (SELECT * FROM Kunde WHERE CARDINALITY(Auftraege) > 10); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-143 Informix – Datenmodell SET MULTISET ROW ROW SET Einstiegspunkte Typisierte Tabelle: Untypisierte Tabelle: MULTISET LIST Basisdatentyp Subtypbeziehung MULTISET(ROW(...)) MULTISET(ROW(...)) Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) Untermengenbeziehung 4-144 Informix – Datenmodellüberblick Basistyp Mengentyp Multimengentyp Listentyp Tupeltyp Attributtypen Attributtypen UNDER Distincttyp Benannter Tupeltyp UNDER Tupeltabelle (Multimenge von Tupeln eines Tupeltyps) OF Typisierte Tabelle (Multimenge von Tupeln eines benannten Tupeltyps) Sichtberechnung basiert auf Tupelsicht (Multimenge von Tupeln eines Tupeltyps) OF Typisierte Sicht (Multimenge von Tupeln eines benannten Tupeltyps) Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-145 Definition einer Funktion – Beispiel CREATE FUNCTION AnzahlBestellteArtikel(k VARCHAR(20)) RETURNS INTEGER; DEFINE auftragsmenge SET(AuftragTyp NOT NULL); DEFINE auftrag AuftragTyp; DEFINE gesamt INTEGER; DEFINE i INTEGER; LET gesamt = 0; SELECT (CASE WHEN Auftraege IS NULL THEN 1 ELSE 0 END) INTO i FROM Kunde WHERE Name.Vorname = k; IF i <> 1 THEN SELECT Auftraege INTO auftragsmenge FROM Kunde WHERE Name.Vorname = k; FOREACH c FOR SELECT (SELECT SUM(Anzahl) FROM TABLE(a.Positionen)) INTO i FROM TABLE(auftragsmenge) a WHERE a.Positionen IS NOT NULL LET gesamt = gesamt + i; END FOREACH; END IF; RETURN gesamt; END FUNCTION; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-146 SFW-Block (1) z SELECT: Was darf in der Projektionsliste stehen? – – – z Attribute (auch abgeleitete, berechnete) Funktionsaufrufe Unterabfragen 9 9 9 Skalare Unterabfrage, die genau einen Wert liefert Beispiel: SELECT Name.Vorname, AnzahlBestellteArtikel(k), (SELECT COUNT(*) FROM TABLE(Telefone) (nummer) WHERE nummer LIKE '0041%'), (MULTISET(SELECT Anr FROM TABLE(Auftraege)) FROM Kunde k; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) Unterabfragen, die mehrere Werte liefern, müssen mit MULTISET umhüllt werden 4-147 SFW-Block (2) z FROM: Welche Tabellenausdrücke sind erlaubt? – – – – – z (Untypisierte) Tabellen Typisierte Tabellen (auch flache Extensionen) Kollektionsabgeleitete Tabellen Funktionsaufrufe (die Tabellen liefern) Unterabfragen (abgeleitete Tabellen) 9 9 9 — 9 Beispiel: Kollektionsabgeleitete bzw. mittels Unterabfragen abgeleitete Tabellen SELECT * FROM TABLE((SELECT Auftraege FROM Kunde WHERE Name.Vorname = 'Billy')); SELECT * FROM TABLE(MULTISET(SELECT Auftraege FROM Kunde)); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-148 SFW-Block (3) z WHERE: Welche Prädikate sind erlaubt? – – – z Prädikate über Attribute Prädikate mit Funktionsaufrufen Prädikate mit Unterabfragen 9 9 9 Beispiel: SELECT * FROM Kunde WHERE Name.Vorname LIKE 'C%' AND AnzahlBestellteArtikel(Name.Vorname) > 5 AND Telefone IS NOT NULL AND EXISTS(SELECT * FROM TABLE(Telefone) (nummer) WHERE nummer LIKE '0041%'); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-149 Objektrelationale Erweiterungen in Postgres z Neue Basisdatentypen z Domänen z Arraytypkonstruktor z Benannte Tupeltypen z Subtabellenbildung Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-150 Neue Basisdatentypen z BOOLEAN – z Large Objects – – – – z Werte: 'true', 't', '1', 'yes', 'y', 'false', 'f', '0', 'no', 'n', NULL TYPEA (Binary Large Object) TEXT (Character Large Object) Operationen FILETOBLOB, FILETOCLOB, LOTOFILE, LOCOPY = (bitweise Gleichheit), IS [NOT] NULL Nicht erlaubt BLOB/CLOB-Attribute als Teil eines Schlüssels oder in booleschen bzw. arithmetischen Ausdrücken GROUP BY, ORDER BY Geometrische Datentypen – POINT, PATH, BOX, CIRCLE, POLYGON Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-151 Basisdatentypen Basisdatentyp Bedeutung SMALLINT (16 Bit) ganze Zahl [-32768, 32767] INTEGER (32 Bit) ganze Zahl [-2147483648, 2147483647] BIGINT (64 Bit) ganze Zahl [-9223372036854775808, 9223372036854775807] DECIMAL(p,q) NUMERIC(p,q) Festkommazahl mit Genauigkeit p und q Nachkommastellen (p ≤ 32) REAL DOUBLE PRECISION Fließkommazahl mit Genauigkeit p (≤ 16) CHAR(q) Alphanumerische Zeichenkette mit fester Länge q (≤ 254) VARCHAR(q) Alphanumerische Zeichenkette mit variabler Länge q (≤ 254) TEXT Alphanumerische Zeichenkette mit variabler Länge bis 1GB BIT(q) Bitfolge mit fester Länge q BIT VARYING(q) Bitfolge mit variabler Länge bis zur Maximallänge q BYTEA Binäre Zeichenkette mit variabler Länge bis 2GB OID externer LOB-Datentyp DATE Datum DATETIME Zeit TIMESTAMP Zeitstempel INTERVAL Zeitinterval Postgres bietet ausserdem diverse geometrische Datentypen wie Box, Circle, …. Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-152 Domänen z Syntax: CREATE DOMAIN Name [AS] Datentyp [DEFAULT Wert] [[CONSTRAINT Name] [NOT] NULL] z Unterschied zum Standard: – nur NOT NULL möglich Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-153 Arraytypkonstruktor z Definition eines (multidimensionalen) Arraytyps: <Elementtyp> [<Max-Kardinalität>] ... [<Max-Kardinalität>] z Beispiel: CREATE TABLE MitarbeiterTupeltabelle ( Name VARCHAR(30), Gehalt DECIMAL(12,2), Telefone VARCHAR(20) [3], Hobbies VARCHAR(15) [] ); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-154 Operationen auf Arraytypen (1) Erzeugen eines Arrays mit dem Arraykonstruktor (heisst genauso wie der Arraytypkonstruktor): '{'Deutsch', 'Englisch'}' Direkter Zugriff auf das i-te Arrayfeld mittels [i]: SELECT Sprachkenntnisse[2] FROM MitarbeiterTupeltabelle; Direkter Zugriff auf ein Subarray mittels [i:j]: SELECT Sprachkenntnisse[2:3] FROM MitarbeiterTupeltabelle; Elementiterator: SELECT Name FROM MitarbeiterTupeltabelle WHERE Sprachkenntnisse *= 'Deutsch'; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-155 Operationen auf Arraytypen (2) Änderung eines einzelnen Arrayelements: UPDATE MitarbeiterTupeltabelle SET Sprachkenntnisse[1] = 'Türkisch'; Änderung des kompletten Arraywerts: UPDATE MitarbeiterTupeltabelle SET Sprachkenntnisse = '{'Türkisch'}'; Kardinalität liefert Anzahl der Arrayelemente: ARRAY_DIMS('{'Deutsch', Türkisch'}) -- liefert den Wert 2 Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-156 Benannte Tupeltypen z Wiederverwendbare Tupeltypen – – ähnlich zu Informix aktuell nur beschränkt nutzbar (als Rückgabetyp einer tabellenwertigen Funktion) z Syntax: z Attributdefinition: Attributname Typ [NOT NULL] z Beispiel: CREATE TYPE NameGehaltTyp AS ( CREATE TYPE Typname (Attributdefinitionsliste) Name VARCHAR(30), Gehalt DECIMAL(12,2) ); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-157 Benutzerdefinierte Cast-Funktionen z Konversion zwischen unterschiedlichen Datentypen z Syntax: – – – CREATE CAST (Quelltyp AS Zieltyp) WITH FUNCTION Funktionsname (Quelltyp) [AS ASSIGNMENT | AS IMPLICIT] Konvertierungsfunktion hat genau einen Parameter vom Typ Quelltyp sowie Zieltyp als Rückgabetyp AS ASSIGNMENT: Cast-Funktion, die implizit bei Zuweisungen aufgerufen wird AS IMPLICIT: Cast-Funktion, die implizit aufgerufen wird Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-158 Explizite benutzerdefinierte Cast-Funktionen - Beispiel Definition einer Konvertierungsfunktion: CREATE FUNCTION EuroToFranken(e Euro) RETURNS Franken RETURN CAST((e::DECIMAL * 1.5) AS Franken); END FUNCTION; Definition einer expliziten Cast-Funktion: CREATE CAST (Euro AS Franken WITH EuroToFranken); Vorherige Anfrage nun mit direkter Konvertierung von Euro nach Franken: SELECT c.Nr, c.Stand FROM CHBank c, EuroBank e WHERE c.Stand > CAST(e.Stand AS Franken); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-159 Implizite benutzerdefinierte Cast-Funktionen - Beispiel Definition einer Konvertierungsfunktion: CREATE FUNCTION FrankenToEuro(f Franken) RETURNS Euro RETURN CAST((CAST(f AS DECIMAL) * 0.65) AS Euro); END FUNCTION; Definition einer impliziten Cast-Funktion: CREATE IMPLICIT CAST (Franken AS Euro WITH FrankenToEuro); Vorherige Anfrage nun mit impliziter Konvertierung von Franken nach Euro: SELECT c.Nr, c.Stand FROM CHBank c, EuroBank e WHERE c.Stand > e.Stand; Achtung: Falls implizite Cast-Funktionen in beiden Richtungen vorhanden sind, wird automatisch nur der rechte Ausdruck des Vergleichsprädikats konvertiert! Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-160 Subtabellenbildung – Aufbau von Tabellenhierarchien z Syntax: – – z CREATE TABLE Tabellenname ( Tabellenelementdefinitionsliste) INHERITS Supertabellennamensliste Hierarchie basiert auf Tupeltabellen keine Trennung zwischen Typ- und Tabellenhierarchie Mehrfachspezialisierung: Subtabelle kann mehrere Supertabellen haben Subtabelle erbt Elemente (Spalten und Integritätsbedingungen) von den Supertabellen nicht erlaubt bei Namenskonflikten, d.h., wenn zwei geerbte Attribute denselben Namen tragen Subtabelle kann neue Integritätsbedingungen hinzudefinieren Beispiel: CREATE TABLE ManagerTupeltabelle ( Bonus DECIMAL(12,2) ) INHERITS MitarbeiterTupeltabelle; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-161 Anfragen an Tabellenhierarchien SELECT * FROM MitarbeiterTupeltabelle; liefert alle Attributwerte der Mitarbeiter SELECT * FROM ManagerTupeltabelle; liefert alle Attributwerte der Manager SELECT * FROM ONLY MitarbeiterTupeltabelle; liefert alle Attributwerte der Mitarbeiter, die keine Manager sind Zugriff auf tiefe Extension einer Supertabelle Zugriff auf tiefe Extension einer Subtabelle Zugriff auf flache Extension einer Supertabelle Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-162 Definition einer Funktion Beispiel: $1 dient als Platzhalter für den ersten Parameter der Funktion: CREATE FUNCTION Muttersprache (INTEGER) RETURNS VARCHAR; AS 'SELECT Sprachkenntnisse[1] FROM Mitarbeiter WHERE Nr = $1' LANGUAGE SQL; Beispiel für eine tabellenwertige Funktion: CREATE FUNCTION ReicheMitarbeiter (DECIMAL) RETURNS SETOF NameGehaltTyp AS 'SELECT Name, Gehalt FROM Mitarbeiter WHERE Gehalt = $1' LANGUAGE SQL; Der benannte Tupeltyp muss dem Zeilentyp der zurückgelieferten Tabelle entsprechen! Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-163 Definition von Triggern CREATE TRIGGER Name {BEFORE | AFTER} {INSERT | DELETE | UPDATE [OR {INSERT | DELETE | UPDATE ...}] ON Tabellenname FOR EACH ROW EXECUTE PROCEDURE Funktionsname(Parameterliste) Unterschied zum SQL-Standard z Trigger durch verschiedene Ereignisse aktivierbar z Nur Zeilentrigger z keine Transitionsvariablen und -tabellen z Triggerrumpf ist ein Prozeduraufruf Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-164 Postgres – Datenmodell MULTISET ROW ARRAY Einstiegspunkt Untypisierte Tabelle: Basisdatentyp Untermengenbeziehung MULTISET(ROW(...)) Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-165 Postgres – Datenmodellüberblick Basistyp UNDER Arraytyp Attributtypen Tupeltabelle (Multimenge von Tupeln eines Tupeltyps) Tupelsicht (Multimenge von Tupeln eines Tupeltyps) Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-166 Postgres – SFW-Block z SELECT: Was darf in der Projektionsliste stehen? – – – z 9 9 9 Skalare Unterabfrage, die genau einen Wert liefert FROM: Welche Tabellenausdrücke sind erlaubt? – – – – – z Attribute (auch abgeleitete, berechnete) Funktionsaufrufe Unterabfragen (Untypisierte) Tabellen Flache Extensionen Kollektionsabgeleitete Tabellen Funktionsaufrufe (die Tabellen liefern) Unterabfragen (abgeleitete Tabellen) 9 9 — — 9 WHERE: Welche Prädikate sind erlaubt? – – – Prädikate über Attribute Prädikate mit Funktionsaufrufen Prädikate mit Unterabfragen 9 9 9 Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-167 Vergleich der objektrelationalen Modelle und Resümee z Neue Basistypen z Typkonstruktoren z Benutzerdefinierte Typen z Objekttabellen z Objektsichten z SQL-Spracherweiterungen Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-168 Vergleich – Neue Basisdatentypen Typ SQL:1999 Oracle DB2 Informix Postgres BOOLEAN 9 — — 9 9 CLOB 9 9 9 9 9 BLOB 9 9 9 9 9 Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-169 Vergleich – Typkonstruktoren Typen Benannte SQL:1999 Oracle DB2 Informix Postgres DISTINCT 9 — 9 9 — OBJECT (strukturiert) 9 9 9 — — ROW — — — 9 9 VARRAY — 9 — — — TABLE — 9 — — — OPAQUE — — — 9 9 9 — — 9 — — — — 9 — SQL:2003 — — 9 — LIST — — — 9 — ARRAY 9 — — — 9 REF 9 9 9 — — Unbenannte ROW SET MULTISET Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-170 Vergleich – Typ- und Tabellenhierarchien SQL:1999 Oracle DB2 Informix Postgres Benannte Tupeltypen — — — 9 9 Benannte Objekttypen 9 9 9 — — Typhierarchien 9 9 9 9 — Typisierte Tupeltabellen — — — 9 — Typisierte Objekttabellen 9 9 9 — — Tabellenhierarchien 9 — 9 9 9 Typisierte Tupelsichten — — — 9 — Typisierte Objektsichten 9 9 9 — — Sichtenhierarchien 9 9 9 — — Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-171 Vergleich – Allgemeine und weitere Konzepte SQL:1999 Oracle DB2 Informix Postgres Objektkonzept mit OIDs & Methoden 9 9 9 — — Benutzerdefinierte Objektgleichheit (Abbildungs-/Ordnungsfunktionen) 9 9 — — — Benutzerdefinierte Cast-Funktionen (Explizit/Implizit) 9 — — 9 9 Benutzerdefinierte Prozeduren & Funktionen 9 9 9 9 9 Rekursion 9 9 9 — — Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-172 Vergleich – Projektionsliste - SELECT SQL:1999 Oracle DB2 Informix Postgres Attribute (Attributausdrücke) 9 9 9 9 9 Methoden-/Funktionsaufrufe 9 9 9 9 9 Einwertige Unterabfragen 9 9 9 9 9 Mehrwertige Unterabfragen — 9 — 9 — Oracle & Informix: Unteranfragen, die mehr als einen (Tupel-)Wert liefern, müssen explizit mit MULTISET umhüllt werden Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-173 Vergleich – Tabellenausdrücke - FROM SQL:1999 Oracle DB2 Informix Postgres Tupeltabellen (tiefe Extension) 9 9 9 9 9 Tupeltabellen (flache Extension) — — — — 9 Typisierte Tabellen (tiefe Extension) 9 9 9 9 — Typisierte Tabellen (flache Extension) 9 — 9 9 — Kollektionsabgeleitete Tabellen 9 9 — 9 — Funktionsaufrufe (die Tabellen liefern) — — 9 — — Unterabfragen (abgeleitete Tabellen) 9 9 9 9 9 Umwandlung einer Kollektion in eine Tabelle SQL:1999: UNNEST vs. ORACLE & Informix: TABLE Rekursive Tabellenausdrücke in SQL:1999 & DB2 unterstützt! Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-174 Vergleich – Prädikate - WHERE SQL:1999 Oracle DB2 Informix Postgres Prädikate über Attribute 9 9 9 9 9 Prädikate mit Funktionsaufrufen 9 9 9 9 9 Prädikate mit Methodensaufrufen 9 9 9 — — Prädikate mit Unterabfragen 9 9 9 9 9 Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-175 Vergleich – Deklarative Integritätsbedingungen SQL:1999 Oracle DB2 Informix Postgres NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY FOREIGN KEY MATCH SIMPLE PARTIAL FULL ON DELETE NO ACTION RESTRICT CASCADE SET NULL SET DEFAULT ON UPDATE NO ACTION RESTRICT CASCADE SET NULL SET DEFAULT CHECK Attribut-/Tupel/Objektebene Tabellen-/Datenbankebene DOMAIN ASSERTION 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 (9) (9) 9 (9) 9 (9) 9 9 9 9 (9) (9) 9 9 (9) 9 9 9 9 9 Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 9 9 (9) 9 9 9 9 9 9 9 9 9 9 9 9 9 4-176 Vergleich – NOT NULL und OR-Erweiterungen NOT NULL auf z Oracle DB2 Informix Postgres objektwertigen Attributen 9 9 (9) • Referenzattributen Referenzattributen 9 9 • • kollektionswertigen Attributen — • (9) 9 Beispiel CREATE TYPE NameTyp (Vorname VARCHAR(20), Nachname VARCHAR(25)); CREATE TABLE Person (Name NameTyp NOT NULL, ...); INSERT INTO Person(Name) VALUES (NULL); INSERT INTO Person(Name) VALUES (NameTyp(NULL, NULL)); CHECK((Name.Vorname IS NOT NULL) AND (Name.Nachname IS NOT NULL)); Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-177 Vergleich – Semantik von Eindeutigkeitsbedingungen DB2 & Informix: Schlüsselattributwerte müssen eindeutig sein Oracle: Schlüsselattributwerte müssen eindeutig sein (wenn sie nicht komplett aus Nullwerten bestehen) Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-178 Vergleich – Eindeutigkeitsbedingungen z Was passiert, wenn mehrere Eindeutigkeitsbedingungen auf gleichen Attributen definiert werden? – – z DB2 weist die Definition einer Eindeutigkeitsbedingung zurück, wenn auf derselben Tabelle bereits eine andere Eindeutigkeitsbedingung mit denselben Attributen existiert Oracle & Informix weist die Definition einer Eindeutigkeitsbedingung nur dann zurück, wenn zusätzlich die Reihenfolge der Attribute übereinstimmt Was geben die Systeme aus, wenn mehrere Eindeutigkeitsbedingungen gleichzeitig verletzt sind? – – Oracle gibt den Namen der ältesten Eindeutigkeitsbedingung aus DB2 & Informix sagen nur, dass eine Eindeutigkeitsbedingung verletzt ist Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-179 Vergleich – Eindeutigkeitsbedingungen und ORErweiterungen UNIQUE auf Oracle DB2 Informix Postgres objektwertigen Attributen (9) — • • Referenzattributen — 9 • • kollektionswertigen kollektionswertigen Attributen — • — — z Oracle unterstützt Eindeutigkeitsbedingungen auf Komponenten eines objektwertigen Attributs, wenn der Typ der Komponente ein Basistyp ist z Vererbung von Eindeutigkeitsbedingungen (Primärschlüsselbedingungen) – – DB2 verbietet explizite Eindeutigkeitsbedingungen für Subtabellen Informix: Jede Tabelle darf maximal eine explizite Primärschlüsselbedingung Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-180 Vergleich – Fremdschlüssel & Referenzattribute z DB2: Wenn eine Tabelle mehrere Fremdschlüssel enthält, müssen alle Fremdschlüssel die gleiche DELETE-Regel befolgen – – z In diesem die DELETE-Regel des ersten Fremdschlüssels Überraschenderweise sind mehrere Fremdschlüssel nicht erlaubt, wenn die erste DELETE-Regel SET NULL ist Integritätsbedingungen auf Referenzattributen Attributbasiert: Tabellenbasiert: – ref_column REF ref_type SCOPE IS typed_table SCOPE FOR ref_column IS typed_table Oracle unterstützt beide Formen, DB2 nur attributbasiert Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-181 Vergleich – Trigger z Syntax und Semantik kommerzieller Trigger sind sehr unterschiedlich – Grund: Trigger wurden erst mit SQL:1999 standardisiert, obwohl Trigger seit über zehn Jahren von kommerziellen Systemen angeboten werden SQL:1999 Oracle DB2 Informix Postgres #Ereignisse pro Trigger 1 * 1 1 * #Trigger pro Ereignis * * * 1 1 Granularität (ROW/STATEMENT) R/S R/S R/S R/S R/S Aktivierungszeit (BEFORE/AFTER) B/A B/A B/A B/A B/A 9 9 9 9 — Aktivierungsbedingung Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-182 Vergleich – Evolution von IB ADD ENABLE VALIDATE VALIDATE + EXC NOVALIDATE DISABLE DROP RESTRICT CASCADE ENABLE VALIDATE VALIDATE + EXCEPTION NOVALIDATE DISABLE RESTRICT CASCADE SET INITIALLY IMMEDIATE DEFERRED DEFERRABLE NOT DEFERRABLE SQL:1999 Oracle DB2 Informix Postgres (9) 9 (9) 9 (9) 9 9 9 9 9 9 9 (9) (9) 9 9 (9) 9 9 (9) 9 9 9 9 (9) (9) 9 9 9 (9) (9) 9 9 9 9 9 9 (9) (9) 9 9 9 9 Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-183 Vergleich – Hinzufügen neuer IB z ADD+ENABLE+VALIDATE+EXCEPTION Oracle: Informix: z ADD+DISABLE Oracle: Informix: z ALTER TABLE t ADD cons-spec EXCEPTIONS INTO e; ALTER TABLE t ADD cons-spec FILTERING; ALTER TABLE t ADD cons-spec DISABLE; ALTER TABLE t ADD cons-spec DISABLED; ADD+ENABLE+NOVALIDATE Oracle: ALTER TABLE t ADD cons-spec NOVALIDATE; Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-184 Vergleich – Aktivierung & Deaktivierung von IB z ENABLE+VALIDATE Oracle: Informix: z ENABLE+NOVALIDATE Oracle: z ALTER TABLE t ENABLE NOVALIDATE cons; DISABLE Oracle: Informix: z ALTER TABLE t ENABLE cons; SET CONSTRAINTS cons-name ENABLED; ALTER TABLE t DISABLE cons; SET CONSTRAINTS cons-name DISABLED; SQL:1999 & DB2 bieten hier keine Unterstützung Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-185 Vergleich – Metasichten für IB & Trigger z z Enthalten Informationen über definierte IB & Trigger SQL:1999 Oracle DB2 Informix table_constraints check_constraint referential_constraints key_columns_usage triggers xxx_constraints xxx_constraints xxx_constraints xxx_cons_columns xxx_triggers syscat.tabconst syscat.checks syscat.references syscat.keycoluse syscat.triggers sysconstraints syschecks sysreferences syscoldepend systriggers Oracle & DB2: – z Namen müssen in Anfragen in grossen Buchstaben geschrieben sein (auch wenn bei der Definition kleine Buchstaben verwendet wurden) Informix: Namen immer in Kleinbuchstaben Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-186 Resümee z Objektrelationale Modellerweiterungen können sowohl Schemadefinition als auch Anfrageformulierung erleichtern (aber auch erschweren) – – z Syntax und Semantik der in kommerziellen DBMS implementierten objektrelationalen Konzepte variieren teilweise – z Intuitivere Anfrageformulierung Effizientere Anfrageauswertung (Pfadausdrücke vs. Joins) Datenmodellheterogenität erschwert Verständlichkeit und Portabilität Unterschiede besonders sichtbar bei – – – – Typkonstruktoren und benutzerdefinierten Datentypen OIDs und Referenzen Mengenwertigen Attributen und geschachtelten Tabellen Typ- und Tabellenhierarchien Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-187 Resümee (Fortsetzung) z Weder SQL:1999 noch kommerzielle DBMS definieren ein "sauberes" objektrelationales Datenmodell bzw. eine "saubere" Datenbanksprache – – – – – z Fehlende Orthogonalität der Typkonstruktoren Implizite Typumwandlungen Unterschiedliche Anwendung einiger Typkonstruktoren innerhalb von geschachtelten Anfragen (Informix) Benutzergenerierte Referenzen - OIDs (DB2) Objektrelationale Spracherweiterungen von Standard-SQL sowie kommerzieller SQL-Dialekte sind derzeit zum Teil wenig intuitiv, das u.a. durch die fehlende Orthogonalität der Sprachkonstrukte begründet wird Forderung nach Aufwärtskompatibilität steht einem durchgängigen, sauberen Sprachentwurf entgegen Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2003/2004 (Dr. C. Türker) 4-188