12. S S 12.1 Datentypen in SQL:1999 Objektrelationale Aspekte in SQL:1999 π Allgemein: Erweiterung der klassischen RDBMS-Funktionalität P Trigger P Rekursive Anfragen P Änderungen über Sichten (UNION, JOIN) π Neue vordefinierte Datentypen: BOOLEAN CLOB (s. Abschnitt 12.1.8) BLOB (s. Abschnitt 12.1.8) Benutzerdefinierte Typen Objektrelationale Erweiterungen P Datentypen P Einfache Vererbung P P basieren auf vordefinierten Typen Strukturierte Typen Attribute (alle Typen) Methoden Routinen Kapselung Imperative Sprachkonstrukte ν Objektidentität Einfache Vererbung Substituierbarkeit Tabellenhierarchien ν View-Hierarchien („Object Views“) S Schemaevolution S Anbindung an Wirtssprachen S Distinct-Typen Einbindung externer Daten 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 π 12-1 Konstruierte Typen Referenztypen Tupeltypen Arraytypen 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-2 π 12.1.1 Distinct-Typen π μ π π CREATE TYPE SchuhGrTyp AS INTEGER FINAL Distinct-Typ übernimmt physische Repräsentation des Quelltyps CREATE TABLE Personen ( PersID INTEGER, Alter AlterTyp, SchuhGr SchuhGrTyp ) Distinct-Typ ist nicht mit dem Quelltyp „kompatibel“: ν keine Substituierbarkeit (z. B. für Funktionsparameter) ν keine Vergleichbarkeit (explizite Typumwandlung erforderlich) Die folgenden Anfragen sind z. B. nicht zulässig: SELECT * FROM Personen WHERE SchuhGr > Alter Können zur Definition von Tabellenspalten und Attributen eines strukturierten Typs (s. u.) verwendet werden UPDATE Personen SET Alter = Alter + 10 WHERE PersID = 1234 Verwendungszweck: μ μ π CREATE TYPE AlterTyp AS INTEGER FINAL Basieren auf einem vordefinierten Typ (Quelltyp) μ Beispiel 12-2: Es sind explizite Typumwandlungen erforderlich: Vermeidung unsinniger Operationen (z. B. Addition von Alter und Schuhgröße einer Person) SELECT * FROM Personen WHERE SchuhGr > CAST(Alter AS SchuhGrTyp) Erzeugung von Typen mit spezifischem Verhalten (durch Definition spezieller Routinen für den Distinct-Typ) UPDATE Personen SET Alter = Alter + CAST(10 AS AlterTyp) Beispiel 12-1: Definition eines Distinct-Typs GeldTyp als 10-stellige Dezimalzahl mit 2 Nachkommastellen π Auf einem Distinct-Typ lassen sich Routinen definieren, die nur auf Instanzen dieses Typs anwendbar sind. π Beispiel 12-3: CREATE TYPE GeldTyp AS DECIMAL(10,2) FINAL Die Klausel FINAL ist obligatorisch: Ein Distinct-Typ kann keine Subtypen (s. u.) besitzen. π CREATE TYPE AudioTyp AS BLOB FINAL Instanzen von Distinct-Typen, die auf demselben Quelltyp basieren, können nicht „gemischt“ in Ausdrücken (z. B. Vergleichen) verwendet werden. 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 CREATE TYPE BildTyp AS BLOB FINAL CREATE FUNCTION InvertFarbe(b BildTyp) RETURNS BildTyp ... CREATE PROCEDURE Abspielen(a AudioTyp) ... 12-3 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-4 π 12.1.2 Strukturierte Typen π Aggregation vorhandener Typen zu einem neuen Typ Strukturierte Typen sind gekapselt μ Zugriff auf einzelne Attribute des Typs nur über spezielle Methoden μ Automatische Generierung zweier Methoden für jedes Attribut eines strukturierten Typs durch das System: Beispiel 12-4: CREATE TYPE AdressTyp AS ( Strasse VARCHAR(30), HausNr INTEGER, PLZ INTEGER, Stadt VARCHAR(20) DEFAULT 'Mannheim') NOT FINAL ν Anmerkung: Die Klausel NOT FINAL ist obligatorisch: Ein strukturierter Typ kann stets Subtypen (s. u.) besitzen. π ν Attribute eines strukturierten Typs können beliebige Typen haben: μ vordefinierte Typen μ benutzerdefinierte Typen μ μ ν Distinct-Typen ν andere strukturierte Typen (beliebige Verschachtelung möglich) „Observer“-Methode zum Lesen eines Attributwerts λ hat denselben Namen wie das zugeordnete Typattribut λ liefert bei Anwendung auf eine Instanz des strukturierten Typs den entsprechenden Attributwert zurück „Mutator“-Methode zum Ändern eines Attributwerts λ hat denselben Namen wie das zugeordnete Typattribut (Überladung!) λ setzt das entsprechende Attribut einer Instanz des strukturierten Typs auf den der Methode übergebenen Wert Durch Vergabe von Ausführungsrechten für Observer- und Mutator-Methoden kann präzise festgelegt werden, wer auf einzelne Typattribute zugreifen darf. konstruierte Typen 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-5 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-6 π 12.1.2.1 Strukturierte Typen als Spaltentypen Beispiel 12-5: Jeder soll das Attribut PLZ einer Instanz des Typs AdressTyp lesen können. Dazu notwendig: Vergabe des Ausführungsrechts für die Observer-Methode von PLZ. GRANT EXECUTE ON METHOD PLZ() FOR AdressTyp TO PUBLIC Jeder soll das Attribut HausNr einer Instanz des Typs AdressTyp lesen und ändern können. Dazu notwendig: Vergabe der Ausführungsrechte für die Observer- und Mutator-Methode von HausNr. π Beispiel 12-6: CREATE TABLE Angestellte ( PersNr INTEGER, Name VARCHAR(40), Adresse AdressTyp, Gehalt GeldTyp ) Abfrage der kompletten Adresse eines Angestellten: SELECT Adresse FROM Angestellte WHERE PersNr = 3333 GRANT EXECUTE ON METHOD HausNr() FOR AdressTyp TO PUBLIC Abfrage der PLZ eines Angestellten mit Hilfe der Observer-Methode von PLZ: GRANT EXECUTE ON METHOD HausNr(INTEGER) FOR AdressTyp TO PUBLIC SELECT Adresse.PLZ() FROM Angestellte WHERE PersNr = 3333 Anwendung von Observer- und Mutator-Funktionen: s. u. Die leere Klammer kann auch weggelassen werden: π SELECT Adresse.PLZ FROM Angestellte WHERE PersNr = 3333 Nutzung eines strukturierten Typs auf zwei verschiedene Arten: μ als Typ einer Tabellenspalte Ändern der Hausnummer eines Angestellten mit Hilfe der Mutator-Methode von HausNr: Tabellentupel enthalten selbst wieder ein Tupel als Attribut („tupelwertige“ Attribute; sub-strukturierte Attribute) μ UPDATE Angestellte SET Adresse = Adresse.HausNr(77) WHERE PersNr = 3333 als Typ einer Tabelle (typisierte Tabelle) Dafür lässt sich kürzer schreiben: strukturierter Typ legt das Schema der Tabelle fest UPDATE Angestellte SET Adresse.HausNr = 77 WHERE PersNr = 3333 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-7 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-8 π Erzeugen neuer Instanzen eines strukturierten Typs mit Hilfe der Konstruktor-Funktion des Typs μ wird automatisch vom System generiert μ hat denselben Namen wie der strukturierte Typ μ π erzeugt beim Aufruf eine Instanz des Typs, die für jedes Attribut den Default-Wert enthält (falls kein Default-Wert für ein Attribut definiert: NULL) Beispiel 12-7: INSERT INTO Angestellte VALUES ( 3333, 'Hans Klein', AdressTyp(), CAST(6850 AS GeldTyp) ) 12.1.2.2 Typisierte Tabellen π Tabellen, deren Schema durch einen strukturierten Typ festgelegt wird π Jedes Attribut des strukturierten Typs entspricht einer Spalte der typisierten Tabelle π Tupel der typisierten Tabelle sind Instanzen des zugrundeliegenden Typs (Tupelobjekte) π Beispiel 12-8: CREATE TYPE AngestTyp AS ( PersNr INTEGER, Name VARCHAR(40), Adresse AdressTyp, Gehalt GeldTyp) NOT FINAL Das Attribut Adresse des neuen Angestelltentupels hat nun den Wert (NULL, NULL, NULL, 'Mannheim'). Auf das Ergebnis des Konstruktors können direkt Mutator-Methoden angewendet werden1: CREATE TABLE Angestellte2 OF AngestTyp (REF IS OidSpalte SYSTEM GENERATED) INSERT INTO Angestellte VALUES ( 4444, 'Franz Groß', AdressTyp().Strasse('Weitweg').HausNr(23).PLZ(68165), CAST(8650 AS GeldTyp)) Angestellte2 enthält damit Instanzen des Typs AngestTyp. Jedem Tupelobjekt der typisierten Tabelle Angestellte2 wird vom System eine OID (object identifier) zugewiesen, die in der zusätzlichen Spalte OidSpalte gespeichert wird. Das Attribut Adresse dieses Angestelltentupels hat den Wert ('Weitweg', 23, 68165, 'Mannheim'). 1 Bei der Anwendung von Observer- und Mutator-Methoden wird im folgenden stets angenommen, dass die entsprechenden Ausführungsrechte vorhanden sind. 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-9 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-10 π Vorteile typisierter Tabellen (gegenüber normalen): 12.1.3 Objektidentität und Referenztypen μ π Jedem Tupelobjekt einer typisierten Tabelle wird beim Einfügen in die Tabelle eine eindeutige, unveränderliche Object-ID (OID) zugeordnet Definition mehrer Tabellen mit demselben Schema CREATE TABLE Angestellte3 OF AngestTyp (REF IS OidSpalte SYSTEM GENERATED) π π μ Speicherung von Tupelobjekten mit Objektidentität (s. u.) π Speicherung der OID in einer zusätzlichen Spalte μ Definition von Tabellenhierarchien (s. u.) π OID erlaubt die Referenzierung des Tupelobjekts von anderer Stelle (z. B. anderen Tupeln bzw. Tupelobjekten) aus Zugriff auf typisierte Tabellen wie auf normale Tabellen Beispiel 12-9: μ Zuweisung eines Referenztyps an eine Tabellenspalte bzw. ein Attribut eines strukturierten Typs μ Referenztyp legt den strukturierten Typ fest, dessen Instanzen durch Referenzen dieses Typs referenziert werden können μ „Wert“ einer Referenz = OID des referenzierten Objekts INSERT INTO Angestellte2 (PersNr, Name, Adresse, Gehalt) VALUES (4444, 'Franz Groß', AdressTyp().Strasse('Weitweg').HausNr(23).PLZ(68165), CAST(8650 AS GeldTyp)) π SELECT Name FROM Angestellte2 WHERE PersNr = 4444 Anmerkung: In Tabellenspalten gespeicherte Instanzen strukturierter Typen besitzen keine OID und können nicht referenziert werden π 3 Arten der OID-Generierung μ systemgeneriert System generiert beim Einfügen eines Tupelobjekts in eine typisierte Tabelle automatisch eine eindeutige OID μ benutzergeneriert Benutzer gibt beim Einfügen eines Tupelobjekts selbst eine OID an μ 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-11 abgeleitet 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-12 OID-Wert des neuen Tupelobjekts basiert auf einem anderen Attribut (bzw. Attributkombination) des Objekts (Attribut(kombination) muss Schlüsseleigenschaft bzgl. der typisierten Tabelle haben) π π Referenzen, die dereferenziert werden sollen, müssen einen Scope besitzen μ legt die typisierte Tabelle fest, in der sich die referenzierten Tupelobjekte befinden müssen μ ermöglicht eine effiziente Auswertung von Dereferenzierungen in Anfragen (referenzierte Zieltabelle schon zur Übersetzungszeit der Anfrage bekannt!) μ ermöglicht statische Auswertung von Benutzerrechten (ist Zugriff auf die Tabelle gestattet?) Beispiel 12-10: CREATE TYPE AbtTyp AS ( AbtNr INTEGER, AbtName VARCHAR(20), Budget GeldTyp) NOT FINAL REF IS SYSTEM GENERATED Die OID-Werte von Tupelobjekten des Typs AbtTyp werden vom System generiert (Default). CREATE TYPE AngestTyp AS ( PersNr INTEGER, PersName VARCHAR(40), Gehalt GeldTyp, AbtRef REF(AbtTyp)) NOT FINAL REF USING INTEGER Beispiel 12-11: Definition von typisierten Tabellen basierend auf den oben definierten Typen CREATE TABLE Abteilungen OF AbtTyp (REF IS AbtOID SYSTEM GENERATED) Die OID-Werte der Tupelobjekte in Abteilungen werden vom System generiert. CREATE TABLE Angestellte OF AngestTyp ( REF IS AngOID USER GENERATED, AbtRef WITH OPTIONS SCOPE Abteilungen) Die OID-Werte von Tupelobjekten des Typs AngestTyp werden vom Benutzer angegeben (Datentyp: INTEGER). Anmerkung: Von PersNr abgeleitete OID-Werte könnten durch die Klausel REF FROM (PersNr) erreicht werden. Tupelobjekte des Typs AngestTyp enthalten eine Referenz auf ein Tupelobjekt des Typs AbtTyp. Die OID-Werte der Tupelobjekte in Angestellte werden vom Benutzer angegeben. Anmerkung: Wäre AngestTyp oben mit REF FROM (PersNr) definiert worden (d. h. abgeleitete OIDs), müsste eine darauf basierende Tabelle etwa wie folgt definiert werden: CREATE TABLE Angestellte2 OF AngestTyp ( REF IS AngOID DERIVED, PersNr WITH OPTIONS UNIQUE NOT NULL, AbtRef WITH OPTIONS SCOPE Abteilungen) 1:n-Beziehung zwischen Abteilungen und Angestellten. 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 π 12-13 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-14 Das AbtRef-Attribut eines in Angestellte gespeicherten Tupelobjekts darf nur Abteilungsobjekte referenzieren, die in der Tabelle Abteilungen gespeichert sind. SELECT abt.AbtName FROM Angestellte ang, Abteilungen abt WHERE ang.AbtRef = abt.AbtOID AND ang.PersNr = 1111 12.1.3.1 Umgang mit Referenzen in Anfragen π Funktion DEREF zur Dereferenzierung einer Referenz π Beispiel 12-12: SELECT DEREF(AbtRef) FROM Angestellte WHERE PersNr = 1111 Es wird ein komplettes Abteilungsobjekt zurückgeliefert. π Zugriff auf einzelne Attribute eines referenzierten Objekts mit Hilfe des Dereferenzierungsoperators '→' π Beispiel 12-13: SELECT AbtRef→AbtName FROM Angestellte WHERE PersNr = 1111 Dasselbe Ergebnis liefert: SELECT abt.AbtName FROM Abteilungen abt WHERE 1111 = ( SELECT ang.PersNr FROM Angestellte ang WHERE ang.AbtRef = abt.AbtOID ) Ebenso: 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-15 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-16 Ändern der Abteilungszuordnung eines Angestellten: Dereferenzierung innerhalb der WHERE-Klausel: SELECT PersName FROM Angestellte WHERE AbtRef→AbtNr = 123 UPDATE Angestellte SET AbtRef = ( SELECT AbtOID FROM Abteilungen WHERE AbtNr = 123 ) WHERE PersNr = 1112 Dasselbe Ergebnis liefert: SELECT PersName FROM Angestellte ang, Abteilungen abt WHERE ang.AbtRef = abt.AbtOID AND abt.AbtNr = 123 Löschen aller Angestellten einer Abteilung: DELETE FROM Angestellte WHERE AbtRef→AbtNr = 123 Einfügen einer neuen Abteilung in die Tabelle Abteilungen: INSERT INTO Abteilungen (AbtNr, AbtName, Budget) VALUES (124, 'Forschung', CAST(5000000 AS GeldTyp)) π Die Angabe referentieller Integritätsbedingungen für Referenzen ist möglich π Beispiel 12-14: Das System generiert automatisch eine OID für das neue Abteilungsobjekt. Einfügen eines neuen Angestellten (der Abteilung 124) in Tab. Angestellte: INSERT INTO Angestellte (AngOID, PersNr, PersName, Gehalt, AbtRef) VALUES ( CAST(314159 AS REF(AngestTyp)), 1112, 'Willy Wurm', CAST(8300 AS GeldTyp), (SELECT AbtOID FROM Abteilungen WHERE AbtNr = 124)) CREATE TABLE Projekte ( ProjNr INTEGER, ProjName VARCHAR(30), ProjLeiter REF(AngestTyp) SCOPE Angestellte REFERENCES ARE CHECKED ON DELETE RESTRICT Die Löschung eines referenzierten Angestelltenobjekts wird damit vom System zurückgewiesen (Alternativen z. B.: SET NULL; NO ACTION) Der Benutzer muss selbst einen OID-Wert für das neue Angestelltenobjekt angeben (hier: INTEGER-Wert 314159). 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-17 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-18 12.1.4 Vererbung in Typ- und Tabellenhierarchien π Vererbung von Eigenschaften 12.1.4.1 Typhierarchien μ π Ableitung von Subtypen aus bestehendem strukturiertem Typ π Subtypen erben Repräsentation (Attribute) und Verhalten (Operationen) des Supertyps π Beispiel 12-15: zwischen (strukturierten) Typen: Subtypen erben von Supertypen μ zwischen (typisierten) Tabellen Subtabellen erben von Supertabellen π CREATE TYPE PersonTyp AS ( PersNr INTEGER, Name VARCHAR(40), Adresse AdressTyp) INSTANTIABLE NOT FINAL nur einfache Vererbung! CREATE TYPE AngestTyp UNDER PersonTyp AS ( Gehalt GeldTyp, Abteilung VARCHAR(30)) INSTANTIABLE NOT FINAL PersonTyp AngestTyp ManagerTyp CREATE TYPE ManagerTyp UNDER AngestTyp AS ( HandyNr VARCHAR(15)) INSTANTIABLE NOT FINAL AngestTyp erbt die Attribute PersNr, Name und Adresse von PersonTyp und definiert zwei neue: Gehalt und Abteilung. ManagerTyp erbt diese fünf Attribute von AngestTyp und definiert ein neues: HandyNr. ManagerTyp hat damit sechs Attribute AngestTyp erbt außerdem alle auf PersonTyp definierten Operationen, und ManagerTyp erbt alle Operationen von AngestTyp und PersonTyp. 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-19 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-20 Von allen drei Typen können Instanzen gebildet werden (INSTANTIABLE). π π 12.1.4.2 Tabellenhierarchien Definition abstrakter Typen mit Hilfe der Klausel NOT INSTANTIABLE π Ableitung von Subtabellen aus bestehender typisierter Tabelle μ keine Instanzen möglich π Subtabellen erben Eigenschaften der Supertabelle, z. B.: μ dienen nur als „Vorlage“ für abgeleitete Typen Prinzip der Ersetzbarkeit (Substitutionsprinzip) Eine Instanz eines Subtyps kann in jedem Kontext benutzt werden, wo eine Instanz des Supertyps erwartet wird. μ μ Spalten (insbesondere die OID-Spalte) μ Constraints (NOT NULL, PRIMARY KEY, CHECK usw.) μ Scopes μ Default-Werte für Spalten π Supertabelle beinhaltet (logisch) alle Tupelobjekte ihrer Subtabellen π Enge Kopplung von Typ- und Tabellenhierarchie: Als Parameter von Operationen: Auf dem Supertyp definierte Operationen lassen sich auf Instanzen des Subtyps anwenden. μ Ist B eine direkte Subtabelle von A, so muss der Typ von B auch direkter Subtyp des Typs von A sein In Tabellenspalten: Eine auf dem Supertyp basierende Tabellenspalte muss auch Instanzen des Subtyps aufnehmen können. π Beispiel 12-16: Auf der oben definierten Typhierarchie basierende Tabellenhierarchie: CREATE TABLE Personen OF PersonTyp ( REF IS PersOID SYSTEM GENERATED, PersNr WITH OPTIONS PRIMARY KEY) CREATE TABLE Angestellte OF AngestTyp UNDER Personen ( Gehalt WITH OPTIONS CHECK (Gehalt > CAST(2000 AS GeldTyp))) CREATE TABLE Manager OF ManagerTyp UNDER Angestellte 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-21 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-22 PersonTyp Tabelle Manager: Personen ν Subtabelle von Angestellte is-a is-a ν basiert auf dem Typ ManagerTyp AngestTyp Angestellte AngestTyp ν is-a is-a besitzt die Spalten PersOID, PersNr, Name, Adresse, Gehalt, Abteilung und HandyNr ν erbt Systemgenerierung für OIDs, Primärschlüsseleigenschaft für PersNr und CHECK-Constraint auf Gehalt ManagerTyp Manager Typhierarchie Tabellenhierarchie Die drei Tabellen dürfen nicht als unabhängige Tupelmengen betrachtet werden: Abb. 12-1: Tabellenhierarchie mit korrespondierender Typhierarchie Tabelle Personen: ν Wurzeltabelle der Tabellenhierarchie ν basiert auf dem Typ PersonTyp ν besitzt die Spalten PersOID, PersNr, Name und Adresse ν legt PersOID als Spalte für systemgenerierte OIDs fest ν legt PersNr als Primärschlüssel fest ν Jedes Tupel in Manager ist gleichzeitig auch Tupel von Angestellte bzw. Personen. ν Der in Personen definierte Primärschlüssel muss über die gesamte Tabellenhierarchie hinweg eindeutig sein. ν Das heißt, es kann keine Tupel mit gleicher PersNr in verschiedenen Tabellen der Tabellenhierarchie geben. ν Allgemein: Primärschlüsseldefinition nur in der Wurzeltabelle einer Tabellenhierarchie erlaubt. Tabelle Angestellte: ν Subtabelle von Personen ν basiert auf dem Typ AngestTyp ν besitzt die Spalten PersOID, PersNr, Name, Adresse, Gehalt und Abteilung ν erbt Systemgenerierung für OIDs ν erbt Primärschlüsseleigenschaft für PersNr ν definiert einen CHECK-Constraint auf der Spalte Gehalt 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-23 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-24 12.1.4.3 Anfragen über Tabellenhierarchien π Anfragen an eine Supertabelle beziehen sich im Allgemeinen auch auf alle Subtabellen dieser Tabelle π Beispiel 12-17: π Ein INSERT-Befehl bezieht sich stets nur auf die im Befehl genannte Tabelle. π Beispiel 12-19: INSERT INTO Angestellte (PersNr, Name, Adresse, Gehalt, Abteilung) VALUES ( 3333, 'Hans Klein', AdressTyp().Strasse(''Weitweg').HausNr(23).PLZ(68165), CAST(8650 AS GeldTyp), 'Forschung') fügt ein Tupel in die Tabelle Angestellte ein. SELECT * FROM Personen π ν liefert alle Tupel der drei Tabellen Personen, Angestellte und Manager zurück ν projiziert diese Tupel auf diejenigen Spalten, die in der Tabelle Personen existieren (PersNr, Name, Adresse) ν d. h. Angestellte und Manager werden als „normale“ Personen betrachtet (ohne die zusätzlichen Attribute) ν Dem Ergebnis ist nicht anzusehen, welche Tupel aus welchen Tabellen stammen. π UPDATE- und DELETE-Befehle wirken sich dagegen auch auf Subtabellen aus. π Beispiel 12-20: UPDATE Angestellte SET Gehalt = Gehalt * 1.1 WHERE Abteilung = 'Forschung' DELETE WHERE Zum Ausschluss von Subtabellen in Anfragen: Schlüsselwort ONLY FROM Angestellte Gehalt < CAST(2000 AS GeldTyp) Beide Befehle wirken sich auf alle Tupel in Angestellte und Manager aus (zur Beschränkung auf eine Tabelle: wieder ONLY) DELETE FROM ONLY(Angestellte) ... π Beispiel 12-18: SELECT * FROM ONLY(Personen) liefert alle Personen, die nicht gleichzeitig auch Angestellte oder Manager sind 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-25 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-26 12.1.5 Typisierte Views CREATE TABLE Personen OF PersonTyp (REF IS PersOID USER GENERATED) π Erweiterung des relationalen View-Mechanismus CREATE TABLE Angestellte OF AngestTyp UNDER Personen π Basieren wie typisierte Tabellen auf einem strukturierten Typ π Hierarchien von typisierten Views möglich π Beispiel 12-21: CREATE TABLE Professoren OF ProfTyp UNDER Angestellte CREATE TABLE Abteilungen OF AbtTyp ( REF IS AbtOID USER GENERATED Manager WITH OPTIONS SCOPE Angestellte) ALTER TABLE Angestellte ALTER COLUMN Abteilung ADD SCOPE Abteilungen Gegeben seien folgende Typ- und Tabellenhierarchien: CREATE TYPE PersonTyp AS ( PersNr INTEGER, Name VARCHAR(40), Adresse AdressTyp) NOT FINAL REF USING INTEGER Nun: Erstellen einer Object-View-Hierarchie, die CREATE TYPE AngestTyp UNDER PersonTyp AS ( Gehalt GeldTyp) NOT FINAL CREATE TYPE ProfTyp UNDER AngestTyp AS ( HandyNr VARCHAR(15)) NOT FINAL CREATE TYPE AbtTyp AS ( Name VARCHAR(20), Budget GeldTyp, Manager REF(AngestTyp)) NOT FINAL REF USING INTEGER PersonTyp Manager AbtTyp AngestTyp Abteilung ProfTyp ALTER TYPE AngestTyp ADD ATTRIBUTE Abteilung REF(AbtTyp) Professoren ausblendet μ Abteilungen mit kleinem Budget (<= 1.000.000 ausblendet) μ nur auf den Namen von Personen und Abteilungen zugreifen lässt μ die Referenzen zwischen Abteilungen und Angestellte beibehält CREATE TYPE ViewAbtTyp AS ( Name VARCHAR(20)) NOT FINAL REF USING INTEGER PersonTyp Manager AbtTyp AngestTyp Abteilung CREATE TYPE ViewPersonTyp AS ( Name VARCHAR(40)) NOT FINAL REF USING INTEGER CREATE TYPE ViewAngestTyp UNDER ViewPersonTyp AS ( Abteilung REF(ViewAbtTyp)) NOT FINAL Das Referenz-Attribut Abteilung muss nachträglich zu AngestTyp hinzugefügt werden, da der referenzierte Typ AbtTyp zum Zeitpunkt der Definition von AngestTyp noch nicht existierte. 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 μ 12-27 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-28 ALTER TYPE ViewAbtTyp ADD ATTRIBUTE Manager REF(ViewAngestTyp) View-Hierarchie: CREATE VIEW ViewAbteilungen OF ViewAbtTyp (REF IS oid USER GENERATED) AS SELECT ViewAbtTyp(INTEGER(AbtOID)), Name, ViewAngestTyp(INTEGER(Manager)) FROM Abteilungen WHERE Budget > 1000000 CREATE VIEW ViewPersonen OF ViewPersTyp (REF IS oid USER GENERATED) AS SELECT ViewPersTyp(INTEGER(PersOID)), Name FROM ONLY(Person) CREATE VIEW ViewAngestellte ViewAngestTyp UNDER ViewPersonen (Abteilung WITH OPTIONS SCOPE ViewAbteilungen) AS SELECT ViewAngestTyp(INTEGER(PersOID)), Name, ViewAbtTyp(INTEGER(Abteilungen)) FROM ONLY(Angestellte) ALTER VIEW ViewAbteilungen ALTER COLUMN Manager ADD SCOPE ViewAngestellte 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-29 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-30 12.1.6 Tupeltypen Beachte: ν ν Explizite Umwandlung von benutzergenerierten OIDs und Referenzen in die richtigen Typen erforderlich Automatische Generierung von zwei Umwandlungsfunktionen für jeden strukturierten Typ: λ λ ν π Bezug: Tabellen bzw. Typen mit tupelwertigem Attribut gestatten Typumwandlungen zwischen einer Referenz auf diesen Typ und dem dieser Referenz zugrundeliegenden Typ (festgelegt durch die REF-USING-Klausel) λ π Funktionsnamen stimmen mit den Namen des strukturierten bzw. zugrundeliegenden Typs überein. μ Implizite Deklaration Beispiel 12-22: CREATE TABLE Angestellte ( PersNr INTEGER, Name VARCHAR(40), Adresse ROW( Strasse VARCHAR(30), HausNr INTEGER, PLZ INTEGER, Stadt VARCHAR(20) ), Gehalt GeldTyp) zunächst Umwandlung der Abteilungs-OID (Typ: REF(AbtTyp)) in einen INTEGER-Wert (zugrundeliegender Typ) dann Umwandlung dieses INTEGER-Werts in eine OID vom Typ REF(ViewAbtTyp) Explizite Deklaration (⇒ Deklaration strukturierter Typ) Verwendung eines Tupelkonstruktors ROW() ViewAbtTyp(INTEGER(oid)) in der ersten View-Definition bedeutet also: λ μ π Zugriff auf Komponenten des Tupeltyps über Punktnotation π Beispiel 12-23: SELECT ang.Adresse.PLZ FROM Angestellte ang π Mittels ROW() lassen sich auch Tupel-Instanzen erzeugen: π Beispiel 12-24: UPDATE Angestellte SET Adresse = ROW('Weitweg', 23, 12345, 'Kleinheim') WHERE PersNr = 3333 π Anmerkung: Die Struktur einer typisierten Tabelle kann nicht mit Hilfe von ROW festgelegt werden (strukturierter Typ erforderlich) 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-31 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-32 12.1.7 Arrays π π Definition von Array-Typen zur Verwendung für Tabellenspalten oder Typattribute π Lesen und Schreiben von Array-Elementen durch direkte Indizierung π Beispiel 12-27: SELECT BuchListe[10] FROM Entleihungen WHERE CARDINALITY(BuchListe) >= 10 Beispiel 12-25: Definition einer Tabelle Entleihungen, die zu einem Entleiher eine Liste (Array) von entliehenen Buchtiteln speichert UPDATE Entleihungen SET BuchListe[4] = 'Schlank in 7 Tagen' WHERE Entleiher = 'Fritz Klein' CREATE TABLE Entleihungen ( Entleiher VARCHAR(40) PRIMARY KEY, BuchListe VARCHAR(50) ARRAY[20]) π Umwandlung eines Arrays in eine einspaltige Tabelle mit UNNEST π Beispiel 12-28: In der Spalte BuchListe können damit maximal 20 Buchtitel für jeden Entleiher gespeichert werden. π π Erzeugen von Array-Werten mit Hilfe des Konstruktors ARRAY Ermittlung aller Entleiher, die 'Das Boot' ausgeliehen haben: SELECT e.Entleiher FROM Entleihungen e, UNNEST(e.BuchListe) Buch(Titel) WHERE Buch.Titel = 'Das Boot' Beispiel 12-26: Erklärung: INSERT INTO Entleihungen VALUES ('Fritz Klein', ARRAY['Der Schakal', 'Die Reblaus', 'Nur Du allein']) UPDATE Entleihungen SET BuchListe = BuchListe || ARRAY['Dick und Doof', 'Das Boot'] WHERE Entleiher = 'Fritz Klein' 1. Umwandlung der BuchListe eines Entleihungstupels e in eine einspaltige Tabelle 2. Binden dieser Hilfstabelle an eine Relationsvariable Buch mit Spaltenname Titel 3. Zugriff auf die Titel-Spalte in der WHERE-Klausel Anmerkung: Es gibt auch die Möglichkeit, sich die Positionsnummern der Array-Elemente mit ausgeben zu lassen (WITH ORDINALITY) 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-33 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-34 π 12.1.8 Große Objekte (LOBs) Operationen auf LOBs μ π Zwei neue Datentypen: μ BLOB (Binary Large Object) μ CLOB (Character Large Object) π LOBs werden direkt in der Datenbank verwaltet π LOB-Größe wird bei der Spaltendefinition festgelegt π Beispiel 12-29: μ CREATE TABLE Buecher (BuchID INTEGER, Titel VARCHAR(200), Zusammenfassung CLOB(32K), BuchText CLOB(20M), FilmZumBuch BLOB(2G)) π π π LOBs werden bei SELECTs, INSERTs und UPDATEs wie die anderen Datentypen behandelt μ Zur Speicherung der LOBs müssen ausreichend große Puffer in der Anwendung angelegt werden μ Kann bei sehr großen LOBs zu Problemen führen (s. u.) π Beispiel 12-30: EXEC SQL SELECT Zusammenfassung, BuchText, FilmZumBuch INTO Puffer, GroßerPuffer, RiesigerPuffer FROM Buecher WHERE Titel = ‚Moby Dick‘; 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-35 nicht erlaubt für LOBs: ν Vergleichsoperatoren (<, >) ν Primär- und Fremdschlüssel-Constraints ν GROUP BY, ORDER BY ν Mengenoperationen (UNION, INTERSECT, EXCEPT) ν Joins (LOB als Join-Spalte) erlaubt: ν LIKE-Prädikat ν Konkatenation (Aneinanderhängen) ν Zeichenkettenfunktionen wie SUBSTRING, POSITION, LENGTH ν Benutzerdefinierte Funktionen auf LOB-Typen Problem: Große LOBs in Anwendungsprogrammen schwer zu verwalten μ Anlegen riesiger Puffer notwendig μ Programme wollen evtl. nur auf Teile eines LOBs zugreifen Lösung: LOB-Lokatoren μ Lokator = Referenz (Größe: 4 Byte) auf einen LOB-Wert μ Anwendung deklariert eine Lokator-Variable zur Speicherung solcher Referenzen 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-36 μ π Lokatoren können überall benutzt werden, wo auch ein LOBWert auftauchen kann Beispiel 12-31: 12.2 Benutzerdefinierte Routinen π EXEC SQL BEGIN DECLARE SECTION; SQL TYPE IS BLOB_LOCATOR FilmLok; EXEC SQL END DECLARE SECTION; EXEC SQL SELECT FilmZumBuch INTO :FilmLok FROM Buecher WHERE Titel = ‚Moby Dick‘ π π π LOB-Lokatoren können nicht nur komplette LOBs, sondern auch Teile davon referenzieren (i. Allg.: beliebige LOBAusdrücke) μ Beschreibung des Verhaltens von Objekten μ Konsistenter Umgang mit den Objekten Daher: μ Datenbank sollte nicht nur als Ablageort passiver Datensätze fungieren μ sondern auch die Speicherung und Ausführung von Operationen erlauben Beispiel 12-32: π SELECT SUBSTRING(BuchText, POSITION(‚Kapitel 1‘ IN BuchText), POSITION(‚Kapitel 2‘ IN BuchText) POSITION(‚Kapitel 1‘ IN BuchText)) FROM Buecher INTO :Kap1Lok WHERE Titel = ‚Moby Dick‘; π Neue Datentypen benötigen entsprechende Operationen Anmerkung: Vorteil gegenüber der Codierung in Anwendungsprogrammen: μ Von der Datenbank verwaltetet Programmcode kann von allen Anwendungsprogrammen verwendet werden (sogar von interaktiven Benutzern) μ Ändert sich das Verhalten von bestimmten Daten, müssen nur die in der Datenbank gespeicherten Operationen angepasst werden. Lokatoren sind auch für Arrays verfügbar 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-37 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-38 π 3 Arten von benutzerdefinierten Routinen in SQL:1999 μ μ ν Prozeduren ν liefern keinen Rückgabewert ν können nicht innerhalb von SQL-Anfragen aufgerufen werden ν Aufruf durch speziellen CALL-Befehl ν greifen auf Daten in der Datenbank zu und nehmen i. d. R. auch Änderungen vor ν überladbar, Auswahl der richtigen Version auf Grund der bestpassenden statischen Parametertypen ν Zweck weniger die Bereitstellung von Operationen für Datentypen, sondern die Vermeidung von Netzwerktransfers in C/S-Umgebungen durch Zusammenfassung von SQL-Befehlen λ Client-Anwendung übergibt Kontrolle an Datenbank-Prozedur λ Prozedur führt gewünschte Operationen auf dem Datenbankserver aus λ Übergabe der Kontrolle zurück an die Anwendung μ 12-39 liefern einen Rückgabewert ν können überall in Anfragen aufgerufen werden, wo ein Ausdruck erwartet wird, dessen Typ mit dem Typ des Rückgabewerts übereinstimmt ν ermöglichen damit die Anpassung der Anfragesprache an den gewünschten Anwendungsbereich ν effizienter Umgang mit benutzerdefinierten Datentypen in der Anfragesprache durch Anwendung typspezifischer Funktionen ν greifen i. d. R. nicht auf Daten in der Datenbank zu ν π 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 Funktionen λ SQL garantiert keine bestimmte Ausführungsreihenfolge für Prädikate λ Prädikate werden in manchen Fällen überhaupt nicht ausgeführt (z. B. Disjunktion von Prädikaten) λ Damit ist unklar, ob bzw. wann eine innerhalb eines Prädikats aufgerufene Funktion ausgeführt wird (und deshalb sollten in Funktionen keine Änderungen in der DB vorgenommen werden) überladbar, Auswahl der richtigen Version auf Grund der bestpassenden statischen Paramtertypen Methoden ν sind spezielle Funktionen ν sind einem benutzerdefinierten (strukturierten) Typ zugeordnet ν besitzen ein (in der Parameterliste unsichtbares) Argument SELF des benutzerdefinierten Datentyps ν überladbar und überschreibbar, aktueller Typ von SELF bestimmt zur Laufzeit die konkrete Methode ν Aufruf über Punktnotation (Objekt.Methode(...)) Implementierung von Routinen durch SQL oder Wirtssprache 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-40 DETERMINISTIC: Funktion liefert bei einem Aufruf mit denselben Argumenten auch dasselbe Ergebnis (Ergebnis muss daher ggf. nicht nochmals berechnet werden) 12.1.1 SQL-Routinen π Ausbau von SQL zur Programmiersprache 2 π Einbettung herkömmlicher SQL-Befehle in Kontrollstrukturen wie Verzweigungen oder Schleifen π direkte Zuweisung von in der Datenbank gespeicherten Werten (auch NULL-Werten) an entsprechend definierte SQL-Variable 12.2.1.1 π Definition von SQL-Routinen Beispiel 12-33: Funktion zur Berechung der Fakultät (n! = 1*2*...*n) einer (positiven) Ganzzahl n CREATE FUNCTION Fakultaet(n INTEGER) RETURNS INTEGER LANGUATE SQL DETERMINISTIC BEGIN DECLARE fak INTEGER DEFAULT 1; DECLARE i INTEGER; SET i = n; REPEAT SET fak = fak * i; SET i = i - 1; UNTIL i = 1 END REPEAT; RETURN fak; END 2 Definiert im SQL-Teilstandard SQL/PSM (Persistent Stored Modules) 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-41 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-42 π Beispiel 12-34: Prozedur zur Erhöhung des niedrigeren Gehalts zweier Angestellter (gegeben: Personalnummer) in der Datenbank um 10 Prozent CREATE PROCEDURE ErhNiedGeh (PNr1 INTEGER, PNr2 INTEGER) LANGUAGE SQL BEGIN IF ( SELECT Gehalt FROM Angestellte WHERE PersNr = PNr1) > ( SELECT Gehalt FROM Angestellte WHERE PersNr = PNr2) THEN UPDATE Angestellte SET Gehalt = Gehalt*1.1 WHERE PersNr = PNr2; ELSE UPDATE Angestellte SET Gehalt = Gehalt*1.1 WHERE PersNr = Pnr1; END IF; END 12.2.1.2 Aufruf von SQL-Routinen π SQL-Funktionen können überall in einem SQL-Befehl aufgerufen werden, wo Ausdrücke (des Typs des Rückgabewerts der Funktion) erlaubt sind. π Beispiel 12-35: SELECT Fakultaet(IntSpalte) FROM Tabelle π SQL-Prozeduren werden über einen speziellen CALL-Befehl aufgerufen (aus einer SQL-Routine oder einem Anwendungsprogramm heraus) π Beispiel 12-36: Innerhalb einer SQL-Routine: DECLARE PersNr1, PersNr2 INTEGER; SET PersNr1 = 1111; SET PersNr2 = 2222; CALL ErhNiedGeh(PersNr1, PersNr2) Innerhalb eines Anwendungsprogramms: EXEC SQL CALL ErhNiedGeh(:PNr1, :PNr2); PNr1 und PNr2 seien dabei zwei entsprechend definierte IntegerHostvariablen. 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-43 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-44 π Beispiel 12-38: Methode für einen strukturierten Typ Methodensignatur muss zusammen mit dem Typ definiert werden: 12.1.1.1 π π Behandlung benutzerdefinierter Datentypen Prozedurales SQL ideal zum Umgang mit in der Datenbank definierten Datentypen geeignet μ direktes Einlesen von Instanzen dieser Typen in SQLVariablen μ Verwendung als Parameter und Rückgabewerte von SQLRoutinen METHOD Gehaltserhoehung() RETURNS Geldtyp LANGUAGE SQL DETERMINISTIC Definition eines Subtyps mit überschreibender Methode: CREATE TYPE ManagerTyp UNDER AngestTyp AS ( HandyNr VARCHAR(15) NOT FINAL Beispiel 12-37: Variablen für strukturierte Typen Gegeben sei der oben definierte strukturierte Typ AdressTyp und die Tabelle Angestellte DECLARE MeineAdresse AdressTyp OVERRIDING METHOD Gehaltserhoehung() RETURNS Geldtyp Implementierung der beiden Methoden: CREATE METHOD Gehaltserhoehung() RETURNS GeldTyp FOR AngestTyp BEGIN RETURN SELF.Gehalt * CAST(0.1 AS GeldTyp) END SELECT Adresse INTO MeineAdresse FROM Angestellte WHERE PersNr = 3333 Auf die Komponenten einer Variablen strukturierten Typs wird über Punktnotation zugegriffen: CREATE METHOD Gehaltserhoehung() RETURNS GeldTyp FOR ManagerTyp BEGIN RETURN SELF.Gehalt * CAST(0.2 AS GeldTyp) END SET MeineAdresse.PLZ = 12345 UPDATE Angestellte SET Adresse = MeineAdresse WHERE PersNr =3333 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 CREATE TYPE AngestTyp AS ( PersNr INTEGER, Name VARCHAR(40), Gehalt GeldTyp) NOT FINAL 12-45 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-46 12.2.2 Externe Routinen 12.2.2.1 Allgemeines π Implementierung von Datenbank-Routinen in einer Wirtssprache (z. B. C) π Vorteile gegenüber SQL-Routinen: π μ Wiederverwendbarkeit bestehenden 3GL-Codes μ höhere Funktionalität der Wirtssprache μ evtl. höhere Performanz bei der Ausführung 12.2.2.2 Registrierung externer Routinen π Externe Routinen sollen wie SQL-Routinen von SQL aus aufrufbar sein. π D. h., beim Aufruf einer externen Routine werden SQL-Typen als Parameter übergeben π Auch eventuelle Rückgabewerte sollen einen SQL-Typ besitzen π Problem: Externe Routine kann mit SQL-Typen nichts anfangen. Nachteile μ Impedance Mismatch (keine exakte Korrespondenz zwischen Datentypen der Programmiersprache und der Datenbank) π Daher: Abbildung zwischen SQL-Typen und Typen der Programmiersprache notwendig. μ evtl. Sicherheitsprobleme (wenn externe Routine im selben Adressraum wie der Datenbankserver ausgeführt wird) π Für vordefinierte Typen: Standardabbildungen auf verschiedene Wirtssprachen. π z. B. für Wirtssprache C: 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-47 μ Abbildung SQL-Typ INTEGER auf C-Typ long μ Abbildung SQL-Typ REAL auf C-Typ float μ usw. 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-48 π Damit: Registrierung von externen Routinen in der Datenbank möglich, die mit vordefinierten Datenbanktypen umgehen können π Beispiel 12-39: Gegeben sei eine C-Funktion mit der folgenden Signatur: float Func(long Par); Diese kann wie folgt in der Datenbank registriert werden: CREATE FUNCTION SqlFunc (x INTEGER) RETURNS REAL LANGUAGE C DETERMINISTIC NO SQL RETURNS NULL ON NULL INPUT EXTERNAL NAME 'usr/lib/mathlib!Func' Danach kann die externe Funktion wie eine SQL-Funktion in Anfragen verwendet werden 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-49 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-50 12.3 Anbindung von SQL an Wirtssprachen π Eingebettetes statisches SQL π Dynamisches SQL π π π CLI: genormte Call-Schnittstelle π Neue Notwendigkeit: Kommunikation auf Objektebene π Umwandlung von Datentypen bei Transfer zwischen DBMS und Wirtssprache μ Definition von sog. Transformationsfunktionen für benutzerdefinierte Datentypen μ 2 Arten: ν ν μ μ μ beschreibt (bisher nur) in Java eingebettetes SQL (SQLJ) μ benutzerfreundliche Integration der SQL-Befehle ins JavaProgramm Beispiel 12-40: Ausgabe des mengenwertigen Ergebnisses einer SQL-Anfrage in Java (mit Hilfe eines Iterators) from-sql: bildet den Wert eines benutzerdefinierten Typs auf einen Wert eines vordefinierten SQL-Typs ab #sql iterator PatientenIter(String Name, float Gewicht); PatientenIter Patient; #sql Patient = { SELECT PatName AS „Name“, PatGewicht AS „Gewicht“ FROM PatientenTabelle WHERE PatAlter BETWEEN :MinAlter AND :MaxAlter ORDER BY PatGewicht DESCENDING}; while (Patient.next()) { System.out.println(Patient.Name() + „ wiegt “ + Patient.Gewicht()); } π Direkte Abbildung von benutzerdefinierten SQL-Typen auf Java-Klassen und umgekehrt π Beispiel 12-41: to-sql: bildet den Wert eines vordefinierten SQL-Typs auf einen Wert eines benutzerdefinierten Typs ab Umwandlung zwischen vordefinierten SQL-Typen und Typen der Wirtssprache dann nach festem Schema (vgl. Abschnitt 12.2.2.2) Problem: Strukturierte Typen in SQL werden einfach auf Zeichenfolgen in der Wirtssprache abgebildet (innere Struktur geht verloren) 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 Neuer Teilstandard: SQL/OLB (Object Language Binding) 12-51 SQL: Java: CREATE TYPE Adresse ( Strasse VARCHAR(100), HausNr INTEGER, Stadt VARCHAR(50)) public class Adresse { public String Strasse; public int HausNr; public String Stadt;} 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-52 12.4 Abschließende Bemerkungen π SQL:1999 verbessert das Zusammenspiel mit objektorientierten Programmiersprachen – insbesondere durch die speziellen Language Bindings – in erheblichem Maße. ... allerdings weniger „nahtlos“ als ooDBMS π SQL:1999 „klebt“ immer noch stark am „flachen“ Relationenmodell π Komplex strukturierte Attributwerte werden als „special animals“ behandelt und sind nur relativ schwach in die Sprache integriert. π „Complex objects“, wie z. B. der Roboter sind damit nicht adäquat handhabbar ... sehr viel DBMS-Funktionalität müsste „von Hand“ in Form von Functionen nachimplementiert werden. π DBMS-Ansatz von SQL:1999 i. W. immer noch rein serverbasiert. ... die Probleme (Client/Server) für technisch/wissenschaftliche Anwendungen bleiben damit weitgehend bestehen. 1 © G. Specht Datenbanksysteme 12. Objektrelationale Aspekte in SQL:1999 12-53