1 Datenbank-Seminar V 1.7 20.05.1997 Autoren: Reiner Götz Karl Laderer Cristobal Pino Andreas Rau H.J. Schmidt Jörg Schliepkorte Rainer Brosi Norbert Rösch Matin Walser Gunnar Krauß Martin Buchthal Dirk Kaller ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 2 INHALTSVERZEICHNIS 1 ENTITY-RELATIONSHIP MODELL.............................................................................................................5 1.1 BEZIEHUNGEN ZWISCHEN ENTITÄTEN ............................................................................................................5 1.2 MODELLERSTELLUNG ....................................................................................................................................9 1.3 BESONDERHEITEN BEI ERM ..........................................................................................................................9 1.3.1 Reflexive Beziehungen/Vergabe von Rollen ..........................................................................................9 1.3.2 Vererbungsbeziehung ..........................................................................................................................10 1.4 UMWANDLUNG IN EIN RELATIONALES MODELL ...........................................................................................11 1.5 ZUSAMMENFASSUNG ...................................................................................................................................12 2 METHODEN FÜR DEN SYSTEMENTWURF - DATENBANKENTWURF............................................13 2.1 NACHTEILE VON DATEIEN UND VORTEILE VON DATENBANKEN ..................................................................13 2.2 ZUGRIFFSSCHNITTSTELLEN ZU DATENBANKEN ............................................................................................14 2.3 RELATIONALES DATEN-MODELL .................................................................................................................15 2.3.1 Der Begriff der Relation......................................................................................................................16 2.3.2 Ein einfaches Beispiel .........................................................................................................................17 2.3.3 Schlüssel einer Relation ......................................................................................................................18 2.3.4 Relationale Integritätsregeln...............................................................................................................19 2.4 ABBILDUNG VON ENTITÄTSTYPEN UND BEZIEHUNGEN ZWISCHEN ENTITÄTSTYPEN AUF RELATIONEN ........20 2.4.1 Datenbankentwurf für 1 zu 1 -Beziehungen des ERM.........................................................................20 2.4.2 Datenbankentwurf für 1 zu n -Beziehungen des ERM.........................................................................21 2.4.3 Datenbankentwurf für m zu n -Beziehungen des ERM ........................................................................24 2.5 NORMALISIERUNG........................................................................................................................................26 2.5.1 Beispiel 1.............................................................................................................................................26 2.5.1.1 Unnormalisierte Relationen .......................................................................................................................... 27 2.5.1.2 Erste Normalform ......................................................................................................................................... 27 2.5.1.3 Zweite Normalform ...................................................................................................................................... 28 2.5.1.4 Dritte Normalform ........................................................................................................................................ 29 2.5.2 Beispiel 2.............................................................................................................................................31 2.5.2.1 Erste Normalform ......................................................................................................................................... 31 2.5.2.2 Zweite Normalform ...................................................................................................................................... 32 2.5.2.3 Dritte Normalform: ....................................................................................................................................... 32 2.5.2.4 Redunzanzfreiheit......................................................................................................................................... 33 2.5.3 Modellierung .......................................................................................................................................34 2.5.3.1 Vergleich der Methoden ............................................................................................................................... 36 2.5.3.2 Modellierung impliziert Normalisierung ...................................................................................................... 36 2.5.4 Zusammenfassung ...............................................................................................................................37 3 SQL ....................................................................................................................................................................39 3.1 ALLGEMEINES ZUR SPRACHE SQL................................................................................................................39 3.2 OBJEKTE EINER RELATIONALEN DATENBANK ..............................................................................................40 3.3 ETWAS RELATIONALE ALGEBRA ..................................................................................................................40 3.3.1 Restriction ...........................................................................................................................................41 3.3.2 Projection............................................................................................................................................41 3.3.3 Product................................................................................................................................................41 3.3.4 Union...................................................................................................................................................42 3.3.5 Intersection..........................................................................................................................................42 3.3.6 Difference............................................................................................................................................42 3.3.7 Join......................................................................................................................................................43 3.4 SPRACHBEREICHE ........................................................................................................................................45 3.5 DML............................................................................................................................................................45 3.5.1 Abfragen (Queries) mit der SELECT Anweisung ................................................................................45 3.5.1.1 SELECT Klausel .......................................................................................................................................... 46 3.5.1.2 Funktionen.................................................................................................................................................... 46 3.5.1.3 FROM Klausel.............................................................................................................................................. 47 3.5.1.4 WHERE Klausel - Zeilenfilter...................................................................................................................... 47 3.5.1.5 Gruppenfunktionen, GROUP BY Klausel .................................................................................................... 49 3.5.1.6 HAVING Klausel - Gruppenfilter................................................................................................................. 50 3.5.1.7 ORDER BY Klausel ..................................................................................................................................... 50 ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 3 3.5.1.8 Subselects ..................................................................................................................................................... 51 3.5.1.9 Mengenoperatoren ........................................................................................................................................ 52 3.5.1.10 JOIN - Verknüpfung von Tabellen ............................................................................................................. 52 3.5.2 Umsetzung der SELECT Anweisung in relationale Operatoren .........................................................54 3.5.3 INSERT................................................................................................................................................55 3.5.4 UPDATE .............................................................................................................................................55 3.5.5 DELETE ..............................................................................................................................................56 3.6 DDL ............................................................................................................................................................56 3.6.1 CREATE ..............................................................................................................................................56 3.6.1.1 CREATE TABLE ......................................................................................................................................... 56 3.6.1.2 CREATE VIEW ........................................................................................................................................... 56 3.6.1.3 CREATE INDEX ......................................................................................................................................... 57 3.6.2 ALTER .................................................................................................................................................57 3.6.3 DROP ..................................................................................................................................................57 3.7 DCL.............................................................................................................................................................57 3.7.1 Transaktionsverarbeitung ...................................................................................................................57 3.7.2 Objektprivilegien.................................................................................................................................58 3.7.2.1 GRANT ........................................................................................................................................................ 59 3.7.2.2 REVOKE...................................................................................................................................................... 59 3.8 ERWEITERUNGEN DURCH WEITERFÜHRENDE SQL STANDARDS ...................................................................59 3.8.1 Check-Option ......................................................................................................................................59 3.8.2 Default-Option ....................................................................................................................................59 3.8.3 Unique-Option.....................................................................................................................................59 3.8.4 Foreign Key.........................................................................................................................................59 3.8.5 Definition von Domänen .....................................................................................................................60 3.8.6 Zustände von Tabellen ........................................................................................................................60 3.8.7 Transaktionen......................................................................................................................................60 3.8.8 dynamisches SQL ................................................................................................................................60 3.8.9 Funktionen ..........................................................................................................................................60 4 EINFÜHRUNG IN SQL*PLUS.......................................................................................................................61 4.1 BEGRIFFE ZU SQL*PLUS ..............................................................................................................................61 4.2 SQL*PLUS BEFEHLE ....................................................................................................................................61 4.2.1 Eingabe von SQL*Plus Befehlen.........................................................................................................61 4.2.2 START .................................................................................................................................................61 4.2.3 DESCRIBE ..........................................................................................................................................62 4.2.4 Tabelle TABS.......................................................................................................................................62 5 PL/SQL - EINE PROZEDURALE ERWEITERUNG VON SQL FÜR ORACLE.....................................63 5.1 ALLGEMEINES ..............................................................................................................................................63 5.2 AUFBAU EINES PL/SQL BLOCKES ...............................................................................................................63 5.3 ABLAUFSTEUERUNG.....................................................................................................................................63 5.4 DAS SELECT-STATEMENT ..........................................................................................................................65 5.5 INSERT-, UPDATE- UND DELETE-STATEMENT ......................................................................................65 5.6 ELEMENTARE DATENTYPEN.........................................................................................................................66 5.7 STRUKTURIERTE DATENTYPEN ....................................................................................................................67 5.8 CURSOR-MANAGEMENT ..............................................................................................................................68 5.9 PROZEDUREN UND FUNKTIONEN ..................................................................................................................71 5.10 FEHLERBEHANDLUNG ................................................................................................................................73 6 EMBEDDED SQL MIT PRO*C .....................................................................................................................74 6.1 ALLGEMEINES ..............................................................................................................................................74 6.2 TEILE EINES PRO*C-PROGRAMMS ...............................................................................................................74 6.3 VORGEHENSWEISE BEI DER ERSTELLUNG EINES PRO*C-PROGRAMMS ........................................................75 6.3.1 Grundstruktur eines ESQL-Programms ..............................................................................................75 6.4 DER APPLICATION PROLOGUE......................................................................................................................76 6.4.1 DECLARE - SECTION........................................................................................................................76 6.4.2 Zulässige Datentypen:.........................................................................................................................77 6.4.3 Strings variabler Länge.......................................................................................................................77 6.5 DIE VEREINBARUNG DER SQLCA ZUR FEHLERBEHANDLUNG .....................................................................78 6.6 DIE CONNECT - ANWEISUNG ....................................................................................................................79 ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 4 6.7 DER APPLICATION BODY .............................................................................................................................80 6.7.1 Kennzeichnung von Kommentaren......................................................................................................80 6.8 EINBETTEN VON QUERIES ............................................................................................................................80 6.8.1 Single Row Select ................................................................................................................................81 6.8.2 Multiple Row Select.............................................................................................................................81 6.8.3 Die INSERT-Anweisung ......................................................................................................................83 6.8.4 Die DELETE-Anweisung.....................................................................................................................83 6.8.5 Die UPDATE-Anweisung ....................................................................................................................83 6.9 ARBEITEN MIT VARCHAR..........................................................................................................................83 6.10 FEHLERANALYSE UND -BEHANDLUNG ........................................................................................................86 6.11 ZUSAMMENFASSUNG .................................................................................................................................87 7 AUFGABEN ZUM DATENBANK-SEMINAR .............................................................................................88 7.1 AUFGABEN ZUM ERM .................................................................................................................................88 7.2 AUFGABEN ZUM RELATIONALEN MODELL ..................................................................................................88 7.3 AUFGABE ZUR NORMALISIERUNG ................................................................................................................89 7.4 AUFGABEN ZU SQL*PLUS..........................................................................................................................89 7.5 AUFGABEN ZU EMBEDDED SQL ..................................................................................................................90 8 LÖSUNGEN ......................................................................................................................................................91 8.1 LÖSUNG ZUM ERM......................................................................................................................................91 8.2 LÖSUNG ZUM RELATIONALEN MODELL .......................................................................................................91 8.3 LÖSUNG ZUR NORMALISIERUNG ..................................................................................................................92 8.4 LÖSUNGEN ZU SQL*PLUS ..........................................................................................................................94 8.5 LÖSUNGEN EMBEDDED SQL........................................................................................................................95 9 LITERATURHINWEISE ..............................................................................................................................101 ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 5 1 Entity-Relationship Modell Das Entity-Relationship Modell (ERM) stellt das älteste und allgemeinste Modell zur strukturierten Modellierung von Daten dar. Es wurde 1970-76 von Chen definiert und später vielfach weiterentwickelt. Viele neue Ansätze, wie das relationale Datenmodell oder die Objektorientierte Datenmodellierung haben immer noch viel mit dem ursprünglichen ERM gemeinsam. Wegen ihrer Bedeutung für die Modellierung von Daten wurde die Entity-Relationship Modellierung nachträglich in die Strukturierte Analyse aufgenommen. Der zentrale Begriff in diesem Modell ist die Entität (entity). Damit sind eindeutig identifizierbare1 Objekte der realen Welt gemeint. Dies können sowohl konkrete Objekte wie Gegenstände, Gebäude oder Personen als auch abstrakte Konzepte wie Verträge, Gesetze oder Ideen sein. Alle diese Entitäten haben Eigenschaften. Diese werden als Attribute (attribute) bezeichnet. Jedem der Attribute ist eine Domäne (domain) zugeordnet. Diese enthält alle Werte, die das Attribut annehmen kann. Ein solcher Wert heißt dann Ausprägung des Attributs. Damit repräsentiert die Domäne den Wertebereich des Attributs. 1.1 Beziehungen zwischen Entitäten Zwischen Entitäten bestehen Beziehungen (relations). Sie werden nach ihrer Komplexität unterschieden. Je nachdem, wieviele Entitäten an der Beziehung beteiligt sind, unterscheidet man 3 Fälle: • 1 zu 1, einfache Beziehung Ein Ehemann hat - in unserer Kultur - genau eine Ehefrau und umgekehrt. Bedeutung des Pfeils: genau 1 Frau Mann Frau hat Bedeutung des Pfeils: genau 1 Mann Alternative Notation: 1,1 Mann Bedeutung von 1,1: genau 1 Mann 1,1 hat Frau Bedeutung von 1,1: genau 1 Frau 1 Sie müssen eindeutig identifizierbar sein, damit man überhaupt mit ihnen arbeiten bzw auf sie zugreifen kann. Mit dieser Voraussetzung werden wir uns in Kapitel 11 im Zusammenhang mit Schlüsseln (keys) noch näher beschäftigen. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 6 • 1 zu n, konditionelle Beziehung Ein Paar kann mehrere Kinder haben, ein Kind jedoch nur einen Vater und eine Mutter. Bedeutung des Pfeils: genau 1 Paar Kind Paar hat Bedeutung des Pfeils: 1-n Kinder Alternative Notation: 1,n Kind 1,1 Paar hat Bedeutung von 1,1: genau 1 Paar Bedeutung von 1,n: 1-n Kinder • n zu m, komplexe Beziehung Eine Person kann mehrere Telefonnummern haben, unter einer Telefonnummer können mehrere Personen erreichbar sein. Bedeutung des Pfeils: genau 1-m Personen Telefon-Nr. Person hat Bedeutung des Pfeils: 1-n Telefon_Nr. Alternative Notation: Telefon-Nr. 1,n 1,m hat Person Bedeutung von 1,m: 1-m Personen Bedeutung von 1,n: 1-n Telefon-Nr. Beachten Sie, daß in der Notation mit Pfeilen ein Doppelpfeil von Paar auf Kind zeigt, wenn ein Paar 1-n Kinder hat. Streng genommen müßte man noch solche Beziehungen unterscheiden, bei denen ein Partner nicht zwingend vorhanden ist (Ein Mann kann verheiratet sein, er muß es nicht sein, dasselbe gilt natürlich auch für eine Frau). Diese "kann"-Beziehungen werden jedoch im allgemeinen als Sonderfälle der obigen Fälle ("muß"-Beziehungen) betrachtet; aus „1 zu“ wird dann „0 oder 1 zu“ aus „genau 1“ wird „höchstens 1“. Bild 1-1 Frau hat Mann Kind hat Paar Spezialfälle: 1 Mann hat 0 oder 1 Frau, 1 Frau hat 0 oder 1 Mann Zu einem Kind gehört 1 Paar, zu einem Paar gehören 0 bis n Kinder. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 7 Auch Beziehungen können Eigenschaften besitzen. Diese werden dann LinkAttribute genannt. Ein Beispiel hierfür wäre das Datum und der Gegenstand eines Kaufs, der über die Beziehung „kauft“ zwischen Kunde und Verkäufer modelliert wird. Auch wenn es bei einfacher (1-zu-1) und konditioneller Beziehung (1-zu-n) noch möglich wäre, die Link-Attribute einer der einfach an der Beziehung beteiligten Entitäten zuzuordnen (z.B. dem Kunden, wenn der Verkäufer mehrere Kunden hat, der Kunde aber nur einmal und bei einem Verkäufer einkauft), macht doch meist die separate Modellierung über die Beziehung im Hinblick auf Verständlichkeit des Modells und zukünftige Erweiterungen (1-zu-n auf m-zu-n, ein Kunde darf verschiedene Dinge bei mehreren Verkäufern einkaufen) mehr Sinn. Gleichartige Entitäten und Beziehungen kann man unter übergeordneten Entitätstypen bzw. Beziehungstypen zusammenfassen. Beispiel: Der Entitätstyp „Kunde“ statt „Herr Müller“, „Frau Meier“, etc. Begriff Entität Bedeutung Ein eindeutig identifizierbares Objekt der realen Welt (Datensatz, Objekt, Zeile einer Tabelle) Entitätstyp Bezeichnung und Charakterisierung einer Gruppe gleichartiger Entitäten (Klasse) Beziehung Zusammenhang zwischen Entitäten Beziehungstyp Bezeichnung und Charakterisierung gleichartiger Beziehungen Attribut charakterisierende Eigenschaft einer Entität (Datenfeld) Domäne Wertebereich für Attribute Link-Attribut Attribut, das nicht zu einer Entität, sondern zu einer Beziehung gehört Tabelle 1-1 Übersicht der wichtigsten Begriffe im ERM Bei der praktischen Modellierung arbeitet man natürlich nicht direkt textuell mit diesen Begriffen, sondern - wie bei vielen anderen Verfahren auch - grafisch. Dies kommt der Übersicht und dem schnellen Verständnis sehr entgegen. Die dabei verwendeten Symbole finden Sie im folgenden dargestellt. Wie Sie sehen, werden für Entitäten und Beziehungen dieselben Symbole wie für die zugehörigen Typen verwendet. Dies rührt daher, daß man im Modell weniger mit konkreten Entitäten als vielmehr stellvertretend für ihre Gesamtheit mit den Typen modelliert. Das Modell gestattet jedoch auch die Darstellung von Einzelfällen. Entität(styp) Attribut Beziehung(styp) Bild 1-2 Symbole in ER-Diagrammen Ein jedes dieser Rechtecke der Grafik, d.h. ein jeder Entitätstyp (ein jeder Objekttyp), entspricht einem Datenspeicher in einem DFD. Wenn es im Entity-Relationship Diagramm den Objekttyp „Kunde“ gibt, so ist im Datenflußdiagramm der Datenspeicher „Kunde“ enthalten. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 8 Nun zu den Regeln zum Aufbau eines ER-Diagramms: • Jede Entität wird durch ein oder mehrere Datenelemente - Attribute genannt beschrieben. Entitäten werden mit ihren Attributen durch ungerichtete Kanten verbunden. • Die Symbole für Beziehungen stehen zwischen den Entitäten, die sie verbinden, und sind mit beiden Entitäten durch gerichtete Kanten verbunden. • Die Komplexität von Beziehungen kann durch die Anzahl der Pfeilspitzen, die stets an der Beziehung ansetzen, ausgedrückt werden. Eine Pfeilspitze bedeutet „1“, zwei Pfeilspitzen bedeuten „n“ bzw. „m“ bezüglich derjenigen Entität am anderen Ende der Beziehung. Um auszudrücken, daß auch die Null mit eingeschlossen ist, können die Pfeilspitzen um eine „0“ ergänzt werden. Um beispielsweise zu modellieren, daß ein Paar mehrere Kinder haben oder auch kinderlos sein kann, verbindet man die Entität „Paar“ über eine Linie mit 2 Pfeilspitzen mit der Beziehung „hat“. Hinter der zweiten Pfeilspitze wird eine „0“ eingefügt. Von der anderen Seite verbindet man dann die Entität „Kind“ über einen einfachen Pfeil mit der Beziehung. Will man außerdem noch die Möglichkeit von Waisenkindern berücksichtigen, kann man auch hier die Pfeilspitze durch eine „0“ ergänzen (vgl. Beispiele oben). Eine alternative Notation mit Komplexitätsangaben „1,n“ wurde bereits beschrieben. In der Literatur existieren weitere alternative Notationen. 0,1 1,1 1,n 0,n Bild 1-3 Vergleich der Pfeil-und der „1,n“-Notation • Alle Elemente werden entweder direkt im Diagramm beschriftet oder mit einer Nummer versehen und extern erklärt (letzteres Verfahren wird häufig für Beziehungen angewandt). Dabei gilt die Empfehlung, Beziehungen so zu beschriften, daß sie von oben nach unten oder von links nach rechts gelesen werden können. Ist dies nicht möglich und ist die Leserichtung nicht aufgrund der Namensgebung offensichtlich, so ist die Leserichtung durch kleine Richtungspfeile neben dem Beziehungssymbol zu kennzeichnen. Alle Namen sollen kurz, prägnant und vielsagend sein. Für Entitäten und Attribute sind Substantive (Person, Adresse, Alter, Name), für Beziehungen Verben (hat, ist, wohnt) zu bevorzugen. Name Vorname Person Stand Typ 1 Konto 1: "hat" Bild 1-4 Einfaches Beispiel ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 9 Vorname Vorwahl Name Person hat Nummer Tel.Nummer Straße Miete mietet Wohnung Ort Bild 1-5 ER-Diagramm mit Link-Attribut. Mehrere Personen (Familie oder Wohngemeinschaft) mieten eine Wohnung. Zum Mietvorgang gehört die Miete. Miete ist also ein Linkattribut. 1.2 Modellerstellung Wie geht man nun bei der Modellerstellung vor? Oftmals wird man als Vorlage eine textuelle Beschreibung einer Aufgabe oder eines Vorgangs haben. Um aus ihr ein erstes Modell zu extrahieren, müssen zunächst Entitäten, Attribute und Beziehungen identifiziert werden. Dabei sind Substantive Kandidaten für Entitäten, Adjektive Kandidaten für Attribute und Verben Kandidaten für Beziehungen. Es ist jedoch Sorgfalt angebracht, denn auch Attribute können durch Substantive bezeichnet sein. Entitäten, die aus einer solchen Betrachtung entstehen, müssen verifiziert werden. Besitzen sie keine Eigenschaften oder gehen sie keine Beziehungen ein, sind sie vermutlich überflüssig. Umgekehrt ist es oft sinnvoll, eine Gruppe zusammengehöriger Attribute als eigenen Entitätstyp zu realisieren, wenn dieser für sich einen Sinn macht, Beziehungen eingehen kann und somit an mehreren Stellen benutzt werden kann (Zum Beispiel haben Personen und Firmen eine Adresse mit PLZ, Ort, Straße und Hausnummer. Diese wird als eigener Entitätstyp realisiert). Für die Attribute müssen die Domänen definiert werden (z.B. Entität Datum, Attribut Monat: 1..12). An dieser Stelle werden auch Überlegungen zu Integritätskriterien angestellt. Ein Wert kleiner 1 oder größer 12 beim Monat ist offensichtlich ungültig. Schwieriger ist da schon die Entdeckung von Fehlern wie "31.2." . Hier muß der Wertebereich des Tages (1..31) abhängig vom Monat eingeschränkt werden. Schließlich ist noch zu prüfen, ob das Modell alle Anfragen, die sich aus der Aufgabenstellung ableiten lassen, befriedigen kann (einfache Beziehungen können in beiden Richtungen eindeutig durchlaufen werden, konditionale nur in einer und komplexe gar nicht). Vor der Implementierung des Modells kann es dann noch nötig sein, das Datenmodell zu normalisieren. Damit wollen wir uns in Kapitel 2 beschäftigen. 1.3 Besonderheiten bei ERM 1.3.1 Reflexive Beziehungen/Vergabe von Rollen ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 10 Reflexive Beziehungen bestehen nicht zwischen Entitäten verschiedener Entitätstypen, sondern zwischen Entitäten desselben Typs. Ein Beispiel hierfür ist die Beziehung „ist Vater von“ zwischen Entitäten des Typs Person. Im Diagramm sind demzufolge beide Seiten der Beziehung mit dem selben Entitätstyp verbunden. Die Entitäten treten jedoch in verschiedenen Rollen auf. In unserem Beispiel als Vater und Kind. Diesem Umstand trägt man durch Beschriftung der beiden Seiten der Beziehung mit dem Rollennamen Rechnung. Man beachte, wie mit Hilfe der Beziehungen ausgedrückt werden kann, daß zwar ein Kind nur einen Vater, ein Vater jedoch durchaus mehrere Kinder haben kann. Vater ist Person Kind Bild 1-6 Reflexive Beziehungen mit Rollen 1.3.2 Vererbungsbeziehung Vererbung wird verwendet, um auszudrücken, daß Gemeinsamkeiten (d.h. gemeinsame Attribute) von Entitätstypen in einem separaten, übergeordneten Entitätstyp untergebracht sind, mit dem die ursprünglichen Entitätstypen eine besondere Beziehung eingehen. Dadurch wird die redundante Modellierung in beiden Entitätstypen vermieden und gleichzeitig ihre Gemeinsamkeit explizit im Modell deutlich gemacht. Name Vorname Geb.Dat Person Gehalt Angestellter hat Straße Adresse Std. Lohn Arbeiter arbeitet für Ort arbeitet für Firma Bild 1-7 Beispiel mit Vererbungsbeziehung Das obige Beispiel drückt aus, daß sowohl Angestellte als auch Arbeiter Personen mit Name, Vorname und Geburtsdatum sind. Jeder Arbeiter/Angestellte ist mit einer Entität des Typs Person verbunden, welche die gemeinsamen Attribute aufnimmt. Zusätzlich ist es mit diesem Mechanismus möglich, daß eine Person ein ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 11 Arbeitsverhältnis als Angestellter und gleichzeitig eines als Arbeiter hat (auch bei verschiedenen Firmen), ohne daß seine Stammdaten doppelt gespeichert werden: Der Arbeiter und der Angestellte referenzieren einfach dieselbe Person. Eine Vererbungsbeziehung ist also (von unten nach oben) entweder 1-zu-1 oder n-zu-1. Mehrfachvererbung kann durch mehrere Vererbungsbeziehungen ausgedrückt werden. Die Vererbungsbeziehung drückt die is-a (ist) Beziehung aus (z.B. Ein Angestellter ist eine Person). Sie ist zu unterscheiden von der has-a (hat) Beziehung (z.B. eine Person hat eine Adresse). Die has-a Beziehung ist eine Beziehung zu einem anderen Entitätstyp, der quasi ein indirektes Attribut des Ursprungstyps darstellt. Die besondere Darstellungsform der is-a Beziehung ist eine Erweiterung des ERM nach Chen. Die ursprüngliche Darstellung macht nochmals deutlich, daß es sich bei is-a lediglich um eine spezielle Beziehung handelt. Name Person Vorname is-a Arbeiter Bild 1-8 Geb.Dat Std. Lohn Alte Darstellung der is-a Beziehung Mit Hilfe der Vererbungsbeziehung können auch mehrstufige Hierarchien aufgebaut werden. Es ist jedoch zu beachten, daß eine Entität der untersten Hierarchiestufe zum Zugriff auf Attribute die es von ganz oben „geerbt“ hat sämtliche Beziehungen durchlaufen muß. Dies kann bei der Implementierung u.U. lange dauern. Demnach sollte man den Gebrauch der Vererbung auf ein vernünftiges Maß beschränken. 1.4 Umwandlung in ein relationales Modell Das ERM ist ein allgemeines Modell zur Modellierung von Daten, mit der Implementierung (z.B. von Beziehungen) und den Beschränkungen, die dabei möglicherweise beachtet werden müssen, befaßt es sich nicht. Dieser Unterschied besteht generell zwischen Modellen und Implementierungen. Modelle sind allgemein und gehen von einer „idealen Welt“ aus, die Implementierung ist jedoch immer gewissen Beschränkungen unterworfen. Standard zur Implementierung von Datenbanken sind heute Relationale DBMS. Sie beruhen auf dem relationalen Datenmodell, welches uns in Kapitel 2 beschäftigen wird. Zur Implementierung eines ERM mit Hilfe einer solchen Datenbank muß dieses zunächst in ein Relationales Modell konvertiert werden. Obwohl diese Konvertierung über weite Strecken keine Änderung des eigentlichen Modells notwendig macht, sondern eher einem simplen Wechsel der Notation gleichkommt gibt es hier und da Dinge, die man beachten muß. So kennt zum Beispiel das relationale Modell keine ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 12 m-zu-n Beziehungen. Wir werden unüberwindliches Hindernis darstellt. jedoch sehen, daß auch dies kein 1.5 Zusammenfassung Das Entity-Relationship Model zur Modellierung von Daten und ihrer Beziehungen wurde nachträglich in die Strukturierte Analyse aufgenommen. Beziehungen zwischen Entitäten (Objekten der realen Welt, abstrakt oder konkret) bzw. zwischen Entitätstypen können einfach oder komplex sein. Komplexe Beziehungen können als 1 zu n oder n zu m-Beziehungen auftreten (Kap. 1.1). Zur Darstellung dieser Beziehungen gibt es verschiedene grafische Notationen. Liegt eine verbale Aufgabenstellung vor, so muß man, wenn man die Daten modellieren möchte (Kap. 1.2), Kandidaten für Entitäten, Attribute und Beziehungen finden und hierfür das ERM-Diagramm in graphischer Form aufstellen. Durch Vergleich mit der verbalen Aufgabenstellung muß anschließend überprüft werden, ob die Entitäten und ihre Beziehungen die Anforderungen der Aufgabenstellung erfüllen können. Kap. 1.3 behandelt spezielle Beziehungen wie reflexive Beziehungen, bei denen Entitäten desselben Typs in verschiedenen Rollen auftreten, und Vererbungsbeziehungen. Kap. 1.4 gibt einen Ausblick auf Kap. 2, in welchem die Abbildung der logischen Datenmodellierung des Entity-Relationship Modells auf das Relationale Modell, welches bei Relationalen Datenbanken implementiert ist, durchgeführt wird. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 13 2 Methoden für den Systementwurf - Datenbankentwurf Dieses Kapitel befaßt sich mit dem Datenbankentwurf für Relationale Datenbanken. Ausgangspunkt des Datenbank-Entwurfs ist das Logische Datenmodell, welches mit Hilfe der Entity-Relationship-Modellierung (siehe Kap. 1) erstellt wurde. Dieses Logische Datenmodell ist nun umzusetzen auf Relationen, die in einem Relationalen Datenbankmanagementsystem (RDBMS) gespeichert werden. Bei der Abbildung auf Relationen sind Regeln zu berücksichtigen (Normalisierungsregeln), die unter anderem dafür sorgen sollen, daß eine redundante Datenspeicherung vermieden wird. Ehe wir auf den Datenbankentwurf für relationale Datenbanken eingehen, betrachten wir in Kap. 2.1 die Vorteile von Datenbanken und in Kap. 2.2 Zugriffsmöglichkeiten auf die Daten bei verschiedenen Datenbank-Architekturen. 2.1 Nachteile von Dateien und Vorteile von Datenbanken Hält ein Programm sich diejenigen Daten in Dateien, die es braucht, so führt dies in der Praxis oftmals dazu, daß • Daten redundant gespeichert werden. Dadurch wird eine Aktualisierung der Daten sehr aufwendig. Außerdem muß jedes Programm gleiche Funktionen für das Lesen, Schreiben, Aktualisieren, Suchen und vor allem für die Behandlung von Fehlerfällen beinhalten. Jeder einzelne Programmierer bestimmt hierbei das Ausmaß der Integritätskontrollen und der Vorsorgemaßnahmen im Fehlerfall. Integrität bedeutet z.B., daß wenn ein Mitarbeiter aus dem Datenbestand "Mitarbeiter" verschwindet, daß er dann auch aus dem Datenbestand "Firmenkreditkarte" verschwinden muß. Ein weiterer Nachteil ist, daß ein jedes Programm genau wissen muß, wie die Daten physikalisch gespeichert sind. Ändert man die Datenstrukturen der Dateien, so muß man auch die Programme abändern. Isolierte Anwendungen mit Hilfe des Dateikonzeptes beruhen auf der Annahme, daß stets alles gut geht und alles stabil bleibt. Was man aber haben will, ist daß die Programme unabhängig von der physikalischen Speicherung der Daten sind, ja - wenn es geht - sogar unabhängig von der logischen Speicherung der Daten. Das Datenbankkonzept beinhaltet die Datenbank als die Menge der zentral gespeicherten Daten und das Datenbankverwaltungssystem (DBMS = Data Base Management System) als Zusammenfassung aller Funktionen zu ihrer Handhabung. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 14 Das Datenbankkonzept zielt darauf ab: • alle Daten nur einmal zu halten und zwar zentral • alle Funktionen zum Lesen, Schreiben, Aktualisieren, Suchen nur einmal zentral zu haben • alle erforderlichen Funktionen zur Integritätskontrolle und Fehlerbehandlung in der erforderlichen Qualität zentral zu halten • die Programme von den Daten zu entkoppeln (Erhöhung der Datenunabhängigkeit der Programme) • Sprachen zur leichteren und flexiblen Handhabung der Daten bereitzustellen Es gibt verschiedene Grade der Datenunabhängigkeit. Hier sei die Einteilung sehr grob gemacht: Relationale Datenbanken weisen keine physische Datenabhängigkeit mehr auf. Hier ist die physikalische Speicherung dem Anwendungsprogramm verborgen. Der Benutzer kennt nur noch die logische Beschreibung der Daten. 2.2 Zugriffsschnittstellen zu Datenbanken Generell gibt es beim Zugriff auf Datenbanken verschiedene Möglichkeiten der Zugriffsschnittstelle: • interne Satzschnittstelle • logische Satzschnittstelle • mengenorientierte Schnittstelle Das relationale Modell arbeitet mit einer mengenorientierten Schnittstelle. In diesem Modell werden die Daten ausschließlich über inhaltliche Angaben aufeinander bezogen. Es muß nur spezifiziert werden, was gefunden werden soll, nicht aber, wie der Suchprozeß ablaufen soll. Es erfolgt eine Anforderung an die Datenbank (1 Datenbank-Anweisung). Gefunden wird eine Menge von Sätzen, die den Suchkriterien entsprechen. Bei der satzorientierten Schnittstelle muß man eine oder mehrere DatenbankAnweisungen pro gesuchtem Satz angeben. Geliefert wird immer nur ein einzelner Satz. Die satzorientierte Schnittstelle verbirgt die physikalische Speicherung. Es gibt aber einen logischen Zugriffspfad zu den Daten. Es muß angegeben werden, in welcher Reihenfolge die Daten durchsucht werden (Navigation). Bei der internen Satzschnittstelle sind physikalische Speicherungsstrukturen wie interne Sätze und Zugriffsindizes wie B*-Bäume oder Hash-Strukturen sichtbar, weitere Implementierungsdetails sind aber verborgen. Beim Zugriff ist die (physikalische) Zugriffsmethode sichtbar. Pro gefundenem Satz müssen ein oder mehrere Datenbank-Anweisungen angegeben werden. Es ist vollkommen klar, daß die mengenorientierte Schnittstelle, die beim relationalen Datenmodell implementiert ist, die komfortabelste Schnittstelle darstellt, da sie Details vor dem Nutzer verbirgt, und der Nutzer daher weniger wissen muß, um auf ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 15 Daten zugreifen zu können. Natürlich ist mit diesem Komfort eine PerformanceVerschlechterung verbunden. Das folgende Schichtenmodell zeigt den Unterschied im Abstraktionsgrad und der Architektur zwischen relationalen Datenbanksystemen (besitzen eine mengenorientierte Schnittstelle), hierarchischen und netzwerkartigen Datenbanksystemen (haben eine satzorientierte Schnittstelle) und Datenbanksystemen mit zugriffsmethodenorientierter Programmierschnittstelle mengenorientierte DB-Schnittstelle satzorientierte DB-Schnittstelle Interne Satzschnittstelle Systempuffer-Schnittstelle Zugriffspfadunabhängiges Datenmodell Zugriffspfadbezogenes Datenmodell Zugriffspfadbezogenes Datenmodell Satz-/Zugriffspfadverwaltung Satz/Zugriffspfadverwaltung Satz-/ Zugriffspfadverwaltung Systempufferverwaltung Systempufferverwaltung Systempufferverwaltung Externspeicherverwaltung Externspeicherverwaltung Externspeicherverwaltung Datei-Schnittstelle Geräteschnittstelle Architektur relationaler Datenbanksysteme Bild 2-1 Architektur hierachischer und netzwerkartiger Datenbanksysteme Architektur von Datenbanksystemen mit zugriffsmethodenorientierter Schnittstelle Schichtenmodelle für Schnittstellen zu Datenbanken [9] 2.3 Relationales Daten-Modell Das Relationale Daten-Modell, kurz Relationen-Modell genannt, wurde 1970 von E.F. Codd entwickelt. Das Relationen-Modell besteht aus 3 Teilen: • Objekten: Die folgenden Objekte müssen definiert werden: − Relationen (oder Tabellen). Sie entsprechen den Entitätstypen des EntityRelationship Modells − Tuple (oder Datensatz oder Record). Ein Tuple entspricht einer konkreten Entität des Entity-Relationship Modells − Attribut (Spalte). Ein Attribut eines Entitätstyps entspricht einem Attribut einer Relation und stellt eine Spalte einer Tabelle dar − Domain (Wertebereich). Der Wertebereich eines Atttributs muß festgelegt werden, damit bei Änderungen der Attributwerte Syntaxprüfungen durchgeführt werden können − Schlüssel. Schlüssel erlauben den Zugriff auf Tuples. Von Bedeutung sind Candidate-Keys (eindeutige Schlüssel), Primary Keys (Primärschlüssel, Hauptschlüssel), Alternate Keys (Sekundärschlüssel, Zweit-Schlüssel), Foreign-Keys (Fremdschlüssel). Die Bedeutung der einzelnen Schlüssel wird im folgenden noch erläutert werden ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 16 • Operationen: Abfrage- und Update-Operationen auf den Relationen, sowie zum Anlegen und Löschen von Relationen • Regeln: Diese dienen zur Gewährleistung der Konsistenz der Daten. Hierbei geht es um die Entity-Integrität und Referentielle Integrität. Beide Integritätsregeln müssen im folgenden noch erklärt werden 2.3.1 Der Begriff der Relation In diesem Kapitel sollen die grundlegenden Begriffe, die im Zusammenhang mit Relationalen Daten-Modellen gebraucht werden, erläutert werden. Da die Basis des Relationalen Daten-Modells das 1970 von Codd entwickelte Relationen-Modell (Codd 70) darstellt, soll dieses nun kurz charakterisiert werden. Als Relation (dt. Beziehung) bezeichnet man eine logisch zusammenhängende Einheit von Informationen. Eine Relation entspricht einem Entitätstyp. Eine Relation stellt eine zweidimensionale Tabelle mit einer festen Anzahl von Spalten (Attributen) und einer variablen Anzahl von Tupeln (Zeilen) dar. Eine Relation ist durch ihren Namen und die Namen der Attribute eindeutig beschrieben. Die Anzahl der Attribute einer Relation heißt Degree (Ausdehnungsgrad). Die Anzahl der Zeilen einer Relation - diese Anzahl kann sich dynamisch ändern und kann auch Null werden - heißt Kardinalität der Relation. Eine Relation hat die folgenden Eigenschaften: Es gibt keine zwei Tupel, die in ihren Attributwerten übereinstimmen. Die Reihenfolge, in der die Tupel einer Relation gespeichert werden, ist nicht definiert, d.h. es gibt keine Reihenfolge der Tupel. Genausowenig ist die Reihenfolge, in der die Attribute einer Relation gespeichert werden, definiert. Macht man den Übergang von dem Entity-Relationship Modell zum Relationalen Datenbank-Entwurf, so werden - wie wir in Kap. 2.4 noch sehen - Beziehungs-Typen zwischen zwischen Entitätstypen (Relationen) im Relationalen Modell abgebildet auf Relationen oder auf Attribute einer Relation. Die Entitäten als konkrete Objekte werden als Tupel (Datensatz) bezeichnet. Sie bilden die Zeilen einer Tabelle. Die Struktur einer Relation wird auch als Relationen-Schema bezeichnet. Das Relationen-Schema beschreibt den Aufbau der Tupel einer Relation, nicht aber die einzelnen Tupel-Ausprägungen (Werte). Jedes Tupel einer Relation setzt sich aus den gleichen Relations-Attributen zusammen. Die Attribute der Relation bilden die Spaltenüberschriften einer Tabelle. In einer Spalte stehen verschiedene oder gleiche Attributwerte, die alle einer Domäne angehören. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 17 Atomare Werte der Attribute Die Attribute bestehen nur aus einem Wert pro Tupel, nicht aus mehreren Werten. Sie sind „atomar“. Personal-Nr. Name Bild 2-2 Vorname Projekt Datenstruktur mit einer Periodengruppe (Projekt) Im Beispiel von Bild 2-2 kann ein Firmen-Mitarbeiter in mehreren Projekten mitarbeiten. Dies kann durch eine Periodengruppe ausgedrückt werden. Das Feld Projekt kann dabei mehrere Werte annehmen. Solche Periodengruppen sind aber nicht „atomar“, da mehrere Werte für ein Attribut existieren. Sie sind also im Rahmen der Relationen nicht zulässig. 2.3.2 Ein einfaches Beispiel Ein Relationen-Modell beschreibt Objekte der realen Welt durch eine Menge von Attributen, die die gemeinsamen Eigenschaften der Objekte repräsentieren. Bild 2-3 zeigt ein Beispiel für eine Relation. Relation Angestellter • Relation: ANGESTELLTER (persNr, name, vorname, geburtsdatum, abtlgNr) • Primärschlüssel: personalnummer persNr name vorname geburtsdatum abtlgNr 3213654616 9684646366 6546321856 1354585544 ... Maier Müller Kunz Hinz ... Hans Heinz Thomas Herman ... Bild 2-3 Relation 15.03.1956 24.09.1945 29.07.1967 10.10.1937 ... 13 24 13 12 ... Angestellter Das folgende Beispiel (siehe Bild 2-4 Domänen ) verdeutlicht noch einmal den Begriff der Domäne. In dem gezeigten Beispiel gibt es 3 Domänen: • Domäne 1 ist eine Folge von ganzen Zahlen (Datentyp INTEGER). ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 18 • Domäne 2 ist eine Folge von Buchstaben (Datentyp CHAR), die Namen von Teilen darstellen. • Domäne 3 ist ebenfalls eine Folge von Buchstaben (vom selben Typ wie Domäne 2), die eine Farbe darstellen. Das Beispiel hat 5 Tupel. Jedes Tupel setzt sich aus 3 Attributen zusammen, von denen jeder Attributwert einer anderen Domäne entstammt. Die Reihenfolge der Attribute in den Tupeln muß eingehalten werden. Mit anderen Worten, Attribute müssen immer unter den dazugehörigen Attributnamen stehen. Eine andere Geschichte ist, daß die Reihenfolge, in der die Attribute einer Relation gespeichert werden, nicht definiert ist. Domäne 1 10 10 10 10 10 Domäne 3 Domäne 2 Bolzen schwarz Rohr Mutter grau rot Stift grün Schraub 101 Bolzen schwarz 102 Mutter rot 103 Schraube grün 104 Stift grau 105 Rohr weiß weiß Tupel Bild 2-4 Domänen 2.3.3 Schlüssel einer Relation Eine Zusammenstellung von Attributwerten heißt Candidate-Key (SchlüsselKandidat), wenn die Werte, die diese Attribute annehmen, stets ein Tupel eindeutig identifizieren. Ein Candidate-Key kann aus einem oder mehreren Atttributnamen bestehen. Eine Relation kann einen oder mehrere Candidate-Keys besitzen. Da in einer Relation keine zwei identischen Tupel existieren, muß es immer mindestens einen Candidate Key - nämlich die Zusammenstellung aller Attributnamen - geben. Ein Candidate-Key darf keine überflüssigen Attributnamen enthalten. Diese müssen entfernt werden, jedoch darf keines der Schlüssel-Attribute vernachlässigt werden, damit die eindeutige Identifizierbarkeit nicht verloren geht. Mit anderen Worten, ein Candidate-Key umfaßt soviel Attributnamen wie nötig und sowenig wie möglich. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 19 Ein Primary-Key ist ein Candidate-Key, der zum Primary-Key erklärt wird oder der als neues Attribut (z.B. Personal-Nummer) speziell zu diesem Zweck eingeführt wird. Eine Relation besitzt genau einen Primärschlüssel. Um auf ein Tupel zugreifen zu können oder ein neues Tupel einzufügen zu können, ist die Angabe des jeweiligen Primärschlüssels erforderlich. Fremdschlüssel dienen dazu, um Relationen zu verknüpfen und um die referentielle Integrität der Datenbank (siehe später) zu gewährleisten. Ein Fremdschlüssel einer Relation muß dabei immer Primärschlüssel einer anderen Relation sein. Der Fremdschlüssel referenziert auf ein Tupel der Relation, in der er Primärschlüssel ist. Wie wir in Kapitel 2.4 noch sehen werden, sind das Tupel der Relation mit dem Fremdschlüssel und das Tupel der Relation mit dem entsprechenden Primärschlüssel miteinander durch eine 1 zu n Beziehung verknüpft. Dies wird als Primärschlüssel-Fremdschlüssel-Prinzip bezeichnet. Um Fremdschlüssel zu kennzeichnen, wird ihnen ein # Zeichen nachgestellt. 2.3.4 Relationale Integritätsregeln Mit der Entity-Integrität wird sichergestellt, daß jedes Tupel (Entity) in einer Relation einen eindeutigen Schlüssel besitzt. Da NULL-Werte nicht eindeutig sind, darf der Primary-Key keinen NULL-Wert enthalten. Durch die referentielle Integrität wird sichergestellt, daß jedem Wert eines ForeignKeys in einer Relation R2 gleich ist einem Wert des Primary-Keys in einer Relation R1 oder daß der Wert des Foreign-Keys ein NULL-Wert ist. Referentielle Integrität bedeutet z.B. daß wenn ein Mitarbeiter aus dem Datenbestand "Mitarbeiter" verschwindet, daß er dann auch aus dem Datenbestand "Firmenkreditkarte" verschwinden muß. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 20 2.4 Abbildung von Entitätstypen und Beziehungen zwischen Entitätstypen auf Relationen Nachdem in Kapitel 2.3 die Grundlagen des Relationalen Daten-Modells erörtert wurden, soll nun in diesem Kapitel der Datenbankentwurf im Vordergrund stehen. Auszugehen ist vom logischen Datenmodell, welches mit Hilfe der EntityRelationship-Modellierung erstellt wurde. Die Fragestellung ist nun, wie die Entitätstypen und ihre Beziehungen umzusetzen sind in Datenbank-Tabellen. Beginnen wir zunächst mit dem einfachsten, der Abbildung von 1 zu 1-Beziehungen (Kap. 2.4.1). Es folgt dann die Umsetzung von 1 zu n-Beziehungen (in Kap. 2.4.2) und last not least die Abbildung von n zu m-Beziehungen auf Tabellen (Kap. 2.4.3). 2.4.1 Datenbankentwurf für 1 zu 1 -Beziehungen des ERM Anhand eines Beispiels wird die Modellierung einer 1 zu 1-Beziehung gezeigt. Es werden zwei Möglichkeiten des Entwurfs vorgestellt. Bei der ersten Möglichkeit werden 2 Relationen entworfen, bei der anderen nur eine einzige Relation. Den Ausgangspunkt für den Entwurf stellt das folgende Entity-RelationshipDiagramm dar. ERM: leitet 1, 1 Mitarbeiter 0,1 Abteilung Bild 2-5 ERM Es gibt die Entitätstypen "Mitarbeiter" und "Abteilung", sowie die Beziehung "leitet". Jede Abteilung wird von einem Mitarbeiter geleitet. Jeder Mitarbeiter kann keine oder maximal 1 Abteilung leiten. Möglichkeit 1: Entwurf von 2 Relationen Jeder Entitätstyp wird durch eine eigene Relation dargestellt. Die Beziehung zwischen beiden Relationen wird hergestellt durch einen Fremdschlüssel in einer der beiden oder in beiden Relationen. Der Fremdschlüssel entspricht dann dem Primärschlüssel der verbundenen Relation. Eventuell vorhandene Link-Attribute (hier keine vorhanden) werden als Attribute in einer der beiden Relationen abgebildet. In unserem Beispiel leitet ein Mitarbeiter entweder eine oder keine Abteilung (0,1). Würde man den Fremdschlüssel bei der Relation Mitarbeiter modellieren, hätte man folgendes Problem: Alle Mitarbeiter, die keine Abteilung leiten, müßten NULL als Attributwert bei dem Fremdschlüssel (abtlgNr#) haben. Deshalb wird hier ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 21 entschieden in der Relation ABTEILUNG mit dem Fremdschlüssel PersNr# den Bezug zwischen beiden Tabellen herzustellen. Der Datenbankentwurf sieht dann folgendermaßen aus: Relation (Entitätstyp) Relation (Entitätstyp) (persNr, name, vorname) (abtlgNr, name, persNr# ... ) MITARBEITER ABTEILUNG Relationales Modell: 1, 1 leitet Mitarbeiter Bild 2-6 0, 1 Abteilung Relationales Modell Möglichkeit 2: Entwurf von 1 Relation. Abbildung der Entitätstypen auf Attribute dieser Relation Bei jeder 1 zu 1 Beziehung können die Attribute beider Entitätstypen in einer Relation zusammengefaßt werden, hier in der Relation ABTEILUNG. Dies ist allerdings nur sinnvoll, wenn der Entitätstyp ANGESTELLTER keine weiteren Beziehungen eingeht und deshalb nicht eigenständig modelliert wird. Ein Fremdschlüssel ist hier natürlich nicht notwendig. Der Datenbankentwurf sieht dann folgendermaßen aus: Relation (Entitätstyp) ABTEILUNG Relationales Modell: Bild 2-7 (persNr, name, vorname, abtlgNr, name, leiternr... ) Abteilung Relationales Modell 2.4.2 Datenbankentwurf für 1 zu n -Beziehungen des ERM Anhand eines Beispiels soll die Abbildung auf Relationen für 1 zu n-Beziehungen erläutert werden. In diesem Beispiel arbeiten in einer Abteilung mehrere Mitarbeiter, mindestens jedoch 1 Mitarbeiter. Jeder Mitarbeiter arbeitet in genau einer Abteilung. Zur Beziehung gehören 2 Attribute: Eintrittsdatum in die Abteilung und Aufgabe in der Abteilung. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 22 ERM: Eintrittsdatum Aufgabe gehört zu 1, 1 1, n Mitarbeiter Bild 2-8 Abteilung ERM Zunächst wäre man versucht, eine Periodengruppe zu entwerfen: Abteilungs-Nr. Mitarbeiter Bild 2-9 Eintrittsdatum Aufgabe Entwurf mit Periodengruppen Periodengruppen sind jedoch - wie Sie bereits wissen - nicht zulässig. Also muß man anders vorgehen: Ein Entwurf mit nur 1 Relation geht also nicht, man muß 2 Relationen entwerfen. Jede 1 zu n Beziehung kann durch 2 Relationen definiert werden. Die Beziehung wird als Fremdschlüssel in der Relation modelliert, deren Tupel n-fach in der Beziehung auftreten (siehe Modellierungsvergleich auf der nächsten Seite). Der Fremdschlüssel entspricht dem Primärschlüssel in der 1-fach auftretenden Relation. Würde man den Fremdschlüssel in der Relation angeben wollen, deren Tupel einfach in der Beziehung auftreten, so hätte man wieder das Problem der Periodengruppe. Die Link-Attribute werden in der n-fachen Relation modelliert (im folgenden fett dargestellt). Der Datenbankentwurf sieht dann folgendermaßen aus: Relation (Entitätstyp) MITARBEITER Relation (Entitätstyp) ABTEILUNG (persNr, name, vorname, abtlgNr #, eintritt, aufgabe) (abtlgNr, name, leiter, ...) Relationales Modell: Mitarbeiter 1, n gehört zu 1, 1 Bild 2-10 Relationales Abteilung Modell ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 23 Modellierungsvergleich: Beispiel: 8 Mitarbeiter arbeiten in jeweils einer, von insgesamt 3 Abteilungen. Möglichkeit 1: Mitarbeiter PersNr 1 2 3 4 5 6 7 8 Name ..... Vorname ..... ..... ..... A-Nr# 1 3 2 1 2 3 2 3 Abteilung A_Nr 1 2 3 Name An1 An2 An3 Budget 10000 20000 30000 Möglichkeit 2 Mitarbeiter PersNr 1 2 3 4 5 6 7 8 Name ..... Vorname ..... Abteilung A-Nr 1 2 3 1 2 2 3 3 Name An1 An2 An3 An1 An2 An2 An3 An3 Budget 10000 20000 30000 10000 20000 20000 30000 30000 PersNr# 1 3 2 4 5 7 6 8 ..... ..... Bei der Möglichkeit 2 werden Name und Budget der Abteilung redundant gespeichert, zudem wird dadurch mehr Speicherplatz benötigt. Deshalb ist Möglichkeit 1 vorzuziehen. Bei einer 1 zu n Beziehung wird also die Beziehung als Fremdschlüssel in der Relation modelliert (hier Relation Mitarbeiter), deren Tupel nfach in der Beziehung auftreten. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 24 2.4.3 Datenbankentwurf für m zu n -Beziehungen des ERM • Zwischen den Entitäten1 und 2 existiert ein Beziehungs-Typ. • Jeweils m Tupel der Entität 1 können mit n Tupeln der Entität 2 in Beziehung stehen. • Jede Beziehung hat i Attribute. Beziehungs-Typ 0, n 0, m Entitäts 1 Entität 2 attribut 1 ••••• attribut i Bild 2-11 Allgemeine m zu n Beziehung Entwurf für allgemeine m zu n-Beziehungen (n > 1, m > 1): Die beiden Entitäten werden direkt in zwei Relationen 1 und 2 überführt. Die Beziehung zwischen der Relation 1 und der Relation 2 wird durch eine neue dritte Relation ausgedrückt. Der Primärschlüssel der dritten Relation setzt sich aus den Primärschlüssel-Attributen der Relation 1 und aus den Primärschlüssel-Attributen der Relation 2 zusammen. Um die obigen Sachverhalte noch etwas zu verdeutlichen, sollen diese anhand eines Beispiels erläutert werden. Im Beispiel gibt es Projekte, an denen mehrere Mitarbeiter arbeiten. Ein Mitarbeiter kann in keinem, einem oder mehreren Projekten mitarbeiten. In den Bildern unten ist der Übergang vom Entity-Relationship-Modell zum Relationalen Modell zu sehen. Der Entitätstyp Mitarbeiter des ERM wird zur Relation MITARBEITER im Relationalen Modell, aus dem Entitätstyp Projekt wird die Relation PROJEKT und aus der Beziehung "arbeitet mit an" wird die Relation MA_PROJEKT. Zur Beziehung gehören zwei Attribute: ERM : a r b e ite t m it a n 0, m 1, n M it a r b e it e r A u fg a b e P r o je k t Dauer Bild 2-12 ERM ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 25 Der Datenbankentwurf sieht dann folgendermaßen aus: • Relation • Relation • Relation MITARBEITER PROJEKT MA_PROJEKT (persNr, name, vorname, abtlgNr, ... ) (projektNr, name, leiter, ... ) (persNr#, projektNr#, aufgabe, dauer ) Relationales Modell: 1 1, n 0, m Mitarbeiter Bild 2-13 1 Ma_Projekt Projekt Relationales Modell Im folgenden werden die Relationen-Schemata dargestellt: MITARBEITER PROJEKT persNr name vorname abtlgNr ... projektNr name leiter... 131 123 134 112 125 ... Maier Müller Kaiser Berger Fischle ... Herbert Hugo Fridolin Karl Amadeus ... 12 19 12 03 19 ... 1 2 3 ... Neuentwicklung Prototyp Änderung ... 112 131 112 ... Tabelle 2-2 Tabelle 2-1 MA_PROJEKT persNr# projektNr# aufgabe dauer ... 125 123 134 123 112 ... Test Arbeiten Layout Arbeiten Planung ... 10 07 15 03 02 ... 2 1 3 2 2 ... Tabelle 2-3 ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 26 2.5 Normalisierung Wozu Normalisierung ? Die Normalisierung hilft uns beim fachgerechten Entwurf von relationalen Datenmodellen. Bei Beachtung der Normalisierungsregeln werden Redundanzen beseitigt und Updateanomalien vermieden. Eine Normalisierung findet stets aufgrund bereits bestehender Tabellen statt. Ist die Aufgabe in Textform gegeben, müssen die Tabellen zuerst erzeugt werden. Dafür werden geeignete Testdaten benötigt, die den Wertebereich der Aufgabenstellung abdecken. Die Normalisierung kann nur bezogen auf diese Daten stattfinden. Mit anderen Daten ergibt sich eine andere Normalisierung. Anhand eines hier durchgeführten Beispiels sollen nun die Grundlagen und Regeln der Normalisierung bekanntgemacht werden. 2.5.1 Beispiel 1 An einer Fachhochschule für Technik werden Vorlesungen von Dozenten gehalten. Die Dozenten gehören zu einem Fachbereich, welcher von einem Dekan geleitet wird. Die Verwaltung erfolgt in einer relationalen Datenbank. Dann könnte ein Eintrag in der Datenbank wie folgt aussehen: Dozent_Nr 4711 4713 4712 Fachbereich TI NT NT Dekan_Nr 007 003 003 Semester TI 1 NT 2 TI 1 Fach DV Physik Mathe Anz_Stud 48 43 48 Tabelle 2-4 Als ein Pflegeproblem dieses Beispiels (weitere folgen später), sei hier das folgende erwähnt: • Ändert sich die maximale Anzahl der Studenten in einem Semester, so muß in jedem Eintrag in der Datenbank, in dem die Anzahl Studenten vorkommt, die maximale Anzahl der Studenten geändert werden • Wird ein Eintrag vergessen, kommt es zu Inkonsistenzen Abhilfe schafft die Normalisierung. Dann genügt ein Zugriff auf ein Tupel. Inhaltliche widersprüchliche Datensätze kommen somit nicht vor. Zudem werden die Updates sehr änderungsfreundlich (Minimalisierung der Anzahl der Updates). ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 27 Wie die Übersicht zeigt, gibt es viele verschiedene Normalformen. In der Praxis beschränkt man sich jedoch auf die dritte Normalform. < weitere Normalformen > Relation in 3. NF Relation in 2. NF Relation in 1. NF unnormalisierte Relationen Übersicht Normalformen Jede Normalform enthält implizit die vorgehende Normalform (die 3. Normalform enthält die zweite und damit die erste Normalform). Um auf eine Normalform zu kommen, müssen nicht zwangsweise die vorgehenden Normalformen durchlaufen werden ( d.h. man kann z.B. mit etwas Übung direkt auf die 3. NF kommen). 2.5.1.1 Unnormalisierte Relationen Eine Relation heißt unnormalisiert, wenn die Attribute nicht atomare Werte enthalten, gegenseitig Beziehungen eingehen oder nicht funktionell abhängig vom eindeutigen Primärschlüssel sind. Hochschulbetrieb 1 Dozent_Nr 4711 4713 4712 Fachber. TI NT NT Dekan_Nr 007 003 003 Semester TI 1, TI 1 NT 2 TI 1 Fach DV, ET Physik Mathe Anz_Stud 48 43 48 Tabelle 2-5 Wie in diesem Beispiel (Hochschulbetrieb 1) zu sehen ist, werden alle 3 Normalformen verletzt. 2.5.1.2 Erste Normalform Eine Relation befindet sich in der 1. Normalform, wenn alle zugrundeliegenden Wertebereiche nur atomare Werte enthalten. Vor der Überführung in die zweite ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 28 Normalform ist die Einführung des Primärschlüssels von Bedeutung. Der Primärschlüssel muß so gewählt werden, daß jede Zeile eindeutig ist. In diesem Beispiel wählen wir Dozent_Nr, Semester und Fach als Primärschlüssel aus. Hochschulbetrieb 2 Wir sehen hier die Relation, in der die 1. NF erfüllt ist, aber die 2. und die 3. NF verletzt sind. Dozent_Nr Fachber. Dekan_Nr Semester Fach Anz_Stud 11 TI 5 TI 1 Physik 55 11 TI 5 TI 2 DV 51 11 TI 5 TI 1 Mathe 55 21 NT 8 NT 1 DV 58 21 11 NT TI 8 5 TI 1 TI 2 Mathe Mathe 55 51 Tabelle 2-6 2.5.1.3 Zweite Normalform Eine Relation ist in 2. Normalform, wenn sie in 1. Normalform ist und wenn jedes Nichtschlüsselattribut voll funktional abhängig ist vom Primärschlüssel. Felder, die nur von einem Schlüsselteil abhängen, werden separat modelliert.Die zweite Normalform kann somit nur verletzt werden, wenn der Primärschlüssel aus mehr als einem Attribut zusammengesetzt ist. Hochschulbetrieb 3 In diesem Beispiel ist die 1. und 2. Normalform erfüllt. Aus einer Tabelle entstehen 3 Tabellen (separate Modellierung). Das ist notwendig, da • die Anzahl der Stunden nur vom jeweiligen Semester abhängt • und da Anz_Stud/Fachbereich/Dekan_Nr nicht voll funktional abhängig sind von Semester/Dozent-Nr/Fach (Primärschlüssel) Dozent_Nr 11 21 Dozent Fachbereich TI NT Dekan_Nr 5 8 Tabelle 2-7 ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 29 Dozent/Vorlesung Semester Dozent_Nr Fach TI 1 11 Physik TI 2 11 DV TI 1 11 Mathe NT 1 21 DV TI 1 21 Mathe TI 2 11 Mathe Tabelle 2-8 Beachten Sie, daß die Relation Dozent/Vorlesung den zusammengesetzten Primärschlüssel Semester/Dozent-Nr/Fach besitzt. Anz_Sem Semester TI 1 TI 2 NT 1 Anz_Stud 55 51 58 Tabelle 2-9 Vorteil: Ändert sich die max. Anzahl der Studenten eines Semesters, so genügt jetzt das Updaten eines Tupels. 2.5.1.4 Dritte Normalform Eine Relation ist genau dann in der 3. Normalform, wenn sie in 1. und 2. NF ist und wenn alle Nichtschlüsselattribute gegenseitig unabhängig, aber voll funktional abhängig vom gesamten Primärschlüssel sind. Hochschulbetrieb 4: Im Beispiel Hochschulbetrieb 3 ist Dozent_Nr der Primärschlüssel der Relation Dozent. Die Attribute Fachbereich/Dekan_Nr sind Nichtschlüsselattribute. Da sie gegenseitig abhängig sind (zu einem Fachbereich gehört der entsprechende Dekan) ist die dritte Normalform verletzt. Dies ist im Beispiel Hochschulbetrieb 4 korrigiert: es entsteht eine weitere Tabelle (Dekan). ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 30 Dozent Dozent_Nr Fachber 11 TI 21 NT Tabelle 2-10 Dekan Dekan_Nr Fachber 5 TI 8 NT Tabelle 2-11 Dozent/Vorlesung Semester Dozent_Nr Fach TI 1 11 Physik TI 2 11 DV TI 1 11 Mathe NT 1 21 DV TI 1 21 Mathe 11 Mathe TI 2 Tabelle 2-12 Anz_Sem Semester TI 1 TI 2 NT 1 Tabelle 2-13 Vorteil: Anz_Stud 55 51 58 Wechselt jetzt ein Dozent den Fachbereich oder ändert sich der Dekan in einem Fachbereich, so genügt jetzt das Updaten eines einzigen Attributes. Mit der Modellierung in 4 Tabellen erreichen wir in diesem Beispiel die Einhaltung aller 3 Normalformen. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 31 2.5.2 Beispiel 2 Nicht normalisierte Tabelle: Matrikelnr. 678430 562721 Student-Name Gerhard Gscheidle Walter Weisheit 628389 Schorsch Schlaule 621285 Bodo Bildung Vorlesungstitel Mathematik Vorlesungsnr. 2001 Chemie 3010 Compilerbau 7203 Mathematik 2001 Physik 2002 Chemie 3010 Compilerbau 7203 Mathematik 2001 Physik 2002 Professor-Name Albert Algebra Ingo Integral Fridolin Fermenter Richard Reagenz Patrick Parser Albert Algebra Ingo Integral Freddy Force Ingo Integral Fridolin Fermenter Richard Reagenz Patrick Parser Albert Algebra Ingo Integral Freddy Force Ingo Integral Tabelle 2-12 2.5.2.1 Erste Normalform Die erste Normalform beinhaltet nur atomare Feldinhalte. In jedem Feld darf nur ein Wert stehen. Überzählige Werte führen zu neuen Zeilen. Tabelle in 1. Normalform: Matrikelnr. 678430 678430 678430 678430 678430 562721 562721 562721 562721 628389 628389 628389 621285 621285 621285 621285 Student-Name Gerhard Gscheidle Gerhard Gscheidle Gerhard Gscheidle Gerhard Gscheidle Gerhard Gscheidle Walter Weisheit Walter Weisheit Walter Weisheit Walter Weisheit Schorsch Schlaule Schorsch Schlaule Schorsch Schlaule Bodo Bildung Bodo Bildung Bodo Bildung Bodo Bildung Vorlesungstitel Mathematik Mathematik Chemie Chemie Compilerbau Mathematik Mathematik Physik Physik Chemie Chemie Compilerbau Mathematik Mathematik Physik Physik Vorlesungsnr. 2001 2001 3010 3010 7203 2001 2001 2002 2002 3010 3010 7203 2001 2001 2002 2002 Professor-Name Albert Algebra Ingo Integral Fridolin Fermenter Richard Reagenz Patrick Parser Albert Algebra Ingo Integral Freddy Force Ingo Integral Fridolin Fermenter Richard Reagenz Patrick Parser Albert Algebra Ingo Integral Freddy Force Ingo Integral Tabelle 2-13 Vor der zweiten Normalform führen wir den Primärschlüssel ein. In diesem Beispiel handelt es sich um einen aus drei Attributen zusammengesetzten Primärschlüssel. Primärschlüsselattribute werden unterstrichen dargestellt. Es wäre hier auch möglich gewesen, den Primärschlüssel aus anderen Schlüsseln zusammenzusetzen. Es wäre möglich statt der Matrikelnummer den Studentennamen und statt der ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 32 Vorlesungsnummer den Vorlesungstitel zu verwenden. Die Möglichkeit wie der Schlüssel gesetzt werden kann, wird durch die verwendeten Testdaten bestimmt 2.5.2.2 Zweite Normalform Bei der Überführung in die zweite Normalform werden die Nichtschlüsselattribute betrachtet. Sie dürfen nur vom Gesamtschlüssel abhängen, nicht von Teilschlüsseln. Dies wird als funktionale Abhängigkeit bezeichnet. In unserem Beispiel ist der Student von der Matrikelnummer und die Vorlesung von der Vorlesungsnummer abhängig. Beide sind jedoch nur vom Teilschlüssel abhängig. Deshalb werden zwei neue Tabellen gebildet. Matrikelnr. 678430 678430 678430 678430 678430 562721 562721 562721 562721 628389 628389 628389 621285 621285 621285 621285 Vorlesungsnr. 2001 2001 3010 3010 7203 2001 2001 2002 2002 3010 3010 7203 2001 2001 2002 2002 Professor-Name Albert Algebra Ingo Integral Fridolin Fermenter Richard Reagenz Patrick Parser Albert Algebra Ingo Integral Freddy Force Ingo Integral Fridolin Fermenter Richard Reagenz Patrick Parser Albert Algebra Ingo Integral Freddy Force Ingo Integral Tabelle 2-14 Matrikelnr. 678430 562721 628389 621285 Student-Name Gerhard Gscheidle Walter Weisheit Schorsch Schlaule Bodo Bildung Tabelle 2-15 Vorlesungsnr. 2001 3010 7203 2002 Vorlesungstitel Mathematik Chemie Compilerbau Physik Tabelle 2-16 2.5.2.3 Dritte Normalform: In der dritten Normalform darf es keine funktionalen Abhängigkeiten geben zwischen Attributen, die nicht zum Schlüssel gehören. Durch geeignete Wahl der Testdaten und des Primärschlüssels bei der 1. Normalform befindet sich dieses Beispiel bereits in der dritten Normalform. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 33 2.5.2.4 Redunzanzfreiheit Die Tabelle 2-14 weist jedoch immer noch redundante Information auf. Es handelt sich um die Verschmelzung zweier einfacherer Relationen. Durch eine Normalisierung bis zur 5. Normalform zerfällt diese Tabelle in zwei Tabellen: Matrikelnr. 678430 678430 678430 562721 562721 628389 628389 621285 621285 Vorlesungsnr. 2001 3010 7203 2001 2002 3010 7203 2001 2002 Tabelle 2-17 Vorlesungsnr. 2001 2001 3010 3010 7203 2002 2002 Professor-Name Albert Algebra Ingo Integral Fridolin Fermenter Richard Reagenz Patrick Parser Freddy Force Ingo Integral Tabelle 2-18 Es ist nicht erforderlich, daß nur zwei Spalten pro Tabelle übrigbleiben! Dies ergibt sich lediglich durch unser einfach gewähltes Beispiel. Bei den Änderungen an den Matrikelnummern ergibt sich jedoch ein Problem, auf das wir später bei der Modellierung noch eingehen werden. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 34 2.5.3 Modellierung Aufgabenstellung Für eine Modellierung wird meist eine Beschreibung der Aufgabe als Ausgangspunkt verwendet: Für eine Fachhochschule soll ein Verwaltungsprogramm für Professoren, Studenten und Vorlesungen erstellt werden. Professoren besitzen einen Namen. Studenten besitzen einen Namen und eine Matrikelnummer. Jede Vorlesung hat ihre eigene Vorlesungsnummer und einen Vorlesungstitel. Jeder Student kann mehrere Vorlesungen besuchen. Ein Professor kann mehrere Vorlesungen halten. In einer Vorlesung können mehrere Studenten sein. Eine Vorlesung kann von mehreren Professoren gehalten werden. Je nach Modellierungsart entstehen aus dem Text Entitäten, Relationen oder Objekte. Diese enthalten verschiedene Attribute und sind untereinander mit Beziehungen verknüpft. Objekt-Darstellungsform: Ein solches Modell läßt sich einfach in relationale Tabellen umwandeln. Die hier dargestellten m:n Verknüpfungen müssen aufgelöst werden, indem Zwischentabellen (Zwischenrelationen) erzeugt werden. Relationale Darstellungsform: Jeder Relation wird ein eindeutiger Primärschlüssel hinzugefügt. Die Beziehungen werden über Fremdschlüssel aufgelöst. Die Trennung zwischen fachlichen Attributen und Beziehungsattributen erleichtert die Arbeit mit den Tabellen. Die Beziehungsattribute sind in der unteren Grafik mit Großbuchstaben abgekürzt. Primärschlüssel sind wieder unterstrichen, Fremdschlüsseln folgt das Zeichen ‘#’. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 35 Tabellen: Mit den Beispieldaten der Normalisierung ergeben sich folgende Tabellen. Es sind in diesem Beispiel relationale Tabellen entstanden, die der dritten Normalform genügen. Es ist außerdem leicht ersichtlich, daß diese Tabellen redundanzfrei sind. Student SNR 1 2 3 4 Matrikelnr. 678430 562721 628389 621285 Name Gerhard Gscheidle Walter Weisheit Schorsch Schlaule Bodo Bildung Tabelle 2-19 Vorlesung VNR Vorlesungsnr. 1 2001 2 3010 3 7203 4 2002 Vorlesungstitel Mathematik Chemie Compilerbau Physik Tabelle 2-20 Professor PNR Name 1 Albert Algebra 2 Ingo Integral 3 Fridolin Fermenter 4 Richard Reagenz 5 Patrick Parser 6 Freddy Force Hört SNR 1 1 1 2 2 3 3 4 4 VNR 1 2 3 1 4 2 3 1 4 Tabelle 2-21 Liest VNR 1 1 2 2 3 4 4 PNR 1 2 3 4 5 6 2 Tabelle 2-22 ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 36 2.5.3.1 Vergleich der Methoden Nachfolgendes Schema zeigt den Zusammenhang zwischen Modellierung und Normalisierung. Bei einer Aufgabenstellung in Form einer nicht normalisierten Tabelle ist nur der Schritt der Normalisierung notwendig. Dieser ist jedoch äußerst schwierig. Diese Aufgabenstellung kommt in der Praxis auch kaum vor. Weit häufiger hat man zum Beispiel nach einer Besprechung eine Aufgabenstellung in textueller Form vorliegen. Bei dieser sind bei beiden Wegen zwei Schritte notwendig. Bei der Erstellung einer Tabelle aus einer Textaufgabe ergibt sich das Problem die richtigen Testdaten zu finden. Diesesollen möglichst alle auftretenden Möglichkeiten abdecken. 2.5.3.2 Modellierung impliziert Normalisierung Mit einer sachgerechten Modellierung kann man sich die schwierige Normalisierung ersparen. Die einzelnen Schritte der Normalisierung werden implizit bei der Modellierung durchgeführt: 1. Normalform Atomare Werte Die Attribute der verschiedenen Modellierungsverfahren sind per Definition bereits atomar. Es können nicht zwei Werte in einem Attribut gespeichert werden. Werte von Attributen sind nicht teilbar. 2. Normalform funktionale Abhängigkeit 3. Normalform transitive Abhängigkeit Durch die fachliche Modellierung werden die Attribute den Objekten zugeordnet. Sie sind somit stets vom Objekt funktional abhängig. Für alle nicht fachlichen Abhängigkeiten zwischen Relationen, die bei der Auflösung von Vererbung, usw. entstehen, gibt es feste Umwandlungsregeln. Über die oben beschriebene dritte Normalform hinaus wird mit einer Modellierung meist eine Redundanzfreiheit erreicht, die beim Normalisierungsverfahren erst in der 5. Normalform erreicht wird. Die Modellierung mit modernen Verfahren bietet darüber hinaus die Möglichkeit komplexere Konstrukte wie Vererbung (Generalisierung ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 37 Spezialisierung) und Aggregation zu verwenden. Für die Umwandlung eines Modells in konkrete Datenbanktabellen gibt es bereits Softwarewerkzeuge. 2.5.4 Zusammenfassung Im folgenden Bilde werden die ersten drei Normalformen noch einmal zusammengestellt: 1. NF: funktionale Abhängigkeit vom Primärschlüssel S1 S2 A B C D ... 3. NF: keine funktionalen Abhängigkeit zwischen Nichtschlüsselattribute 2. NF: keine funktionale Abhängigkeit von Schlüsselteilen Werden die Daten von Programmsystemen in Dateien gespeichert, so führt dies in der Praxis oft zur redundanten Speicherung der Daten und damit auch zu inkonsistenten Datenbeständen. Ein Programm muß die physikalische Speicherung der Daten kennen, sowie Routinen für das Lesen, Schreiben, Aktualisieren, Suchen vor allem für das Fehlerhandling beinhalten. Was man aber haben will, ist daß Programme unabhängig von der physikalischen Speicherung sind (Datenunabhängigkeit der Programme), und daß die Routinen für das Lesen, Schreiben, Aktualisieren, Suchen und Fehlerhandling nur einmal zentral vorhanden sein müssen. Solche Vorteile werden von Datenbankmanagementsystemen geboten (Kap. 2.1). Beim Zugriff auf Datenbanken gibt es interne Satzschnittstellen, logische Satzschnittstellen und mengenorientierte Schnittstellen (Kap. 2.2). Relationale Datenbanken besitzen eine mengenorientierte Schnittstelle. Relationale Datenbanken enthalten Relationen, die in Form von Tabellen dargestellt werden (Kap. 2.3). Die Relationen entsprechen den Entitätstypen des Entity-Relationship Modells. Ein Attribut eines Entitätstyps entspricht einem Attribut einer Relation und stellt eine Spalte einer Tabelle dar. Eine Zeile (Tupel) entspricht einer konkreten Entität des Entitättyps. Die Attribute bestehen nur aus einem Wert pro Tupel, nicht aus mehreren Werten. Sie sind „atomar“. Eine Zusammenstellung von Attributwerten heißt Candidate-Key, wenn die Werte, die diese Attribute annehmen, stets ein Tupel eindeutig identifizieren. Eine Relation kann einen oder mehrere Candidate-Keys besitzen. Ein Primary-Key ist ein Candidate-Key, der zum Primary-Key erklärt wird oder der als neues Attribut speziell zu diesem Zweck eingeführt wird. Fremdschlüssel dienen dazu, um Relationen zu verknüpfen und um die referentielle Integrität zu gewährleisten. Durch die referentielle Integrität wird sichergestellt, daß ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 38 jedem Wert eines Foreign-Keys in einer Relation R2 gleich ist einem Wert des Primary-Keys in einer Relation R1 oder daß der Wert des Foreign-Keys ein NULLWert ist. Referentielle Integrität bedeutet z.B., daß wenn ein Mitarbeiter aus dem Datenbestand "Mitarbeiter" verschwindet, er dann auch aus dem Datenbestand "Firmenkreditkarte" verschwinden muß. Für den Datenbankentwurf müssen nun die Entitätstypen und die Beziehungen zwischen Entitätstypen abgebildet werden auf Relationen. Eine 1 zu 1 -Beziehung kann dabei auf 2 Relationen oder auf 1 Relation abgebildet werden. Im zweiten Fall werden die Entitätstypen auf Attribute dieser Relation abgebildet. Eine 1 zu n Beziehung wird auf 2 Relationen abgebildet, eine n zu m Beziehung auf 3 Relationen (Kap. 2.4). Um Redundanzen zu beseitigen und Update-Anomalien zu vermeiden, werden die Relationen normalisiert (Kap. 2.4). In der Praxis geht man bis zur 3. Normalform. Da die Normalisierung aber die Zahl der Tabellen erhöht, gibt es in der Praxis auch Fälle, wo man aus Performance-Gründen auch nicht normalisierte Relationen verwendet. Jede Normalform enthält implizit die vorhergehende Normalform (die 3. Normalform enthält die 2. und damit die 1. Normalform). Eine Relation befindet sich in der ersten Normalform, wenn alle Attribute nur atomare Werte enthalten. Eine Relation ist in der 2. Normalform, wenn sie in 1. Normalform ist und wenn jedes Nichtschlüsselattribut voll funktional abhängig ist vom Primärschlüssel. Felder, die nur von einem Schlüsselteil abhängen, werden separat modelliert. Die zweite Normalform kann somit nur verletzt werden, wenn der Primärschlüssel aus mehr als einem Attribut zusammengesetzt ist. Eine Relation ist genau dann in der 3. Normalform, wenn sie in 1. und 2. Normalform ist und wenn alle Nichtschlüsselattribute gegenseitig unabhängig sind, aber voll funktional abhängig vom gesamten Primärschlüssel sind. Wenn Attribute gegenseitig abhängig sind, entsteht eine weitere Tabelle. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 39 3 SQL 3.1 Allgemeines zur Sprache SQL SQL, ausführlich 'Structured Query Language', ist die Standardsprache für relationale Datenbanken. Sie wurde als Zugriffssprache für das von dem Mathematiker E.F. Codd in den siebziger Jahren aufgestellte Relationenmodell entwickelt. SQL stellt die praktische Umsetzung der relationalen Algebra dar. SQL ist eine Sprache zur • • • • • • • strukturierten Abfrage Aktualisierung Datendefinition Datenprüfung Datenüberprüfung Sicherung der Konsistenz Pflege des Datenkatalogs SQL ist eine nichtprozedurale und mengenorientierte Sprache. SQL gehört zu den Programmiersprachen der 4. Generation. In diesen Sprachen wird nur noch ausgedrückt, wie ein Ergebnis aussehen soll, und nicht, wie bei Programmiersprachen der 3. Generation, wie der Rechner zu diesem Ergebnis kommt. SQL ist die am meisten verbreitete Sprache für relationale Datenbanken. Dies liegt unter anderem auch daran, daß die ursprünglich von IBM entwickelte Sprache 1987 durch ANSI standardisiert wurde. Die Meilensteine der Standardisierung sind: 1987 1989 1992 geplant SQL wird erstmals durch ANSI standardisiert erweiterter SQL Standard (Embedded SQL, Integrität) SQL2 SQL3 Standard (Objektorientierung) Die meisten Hersteller relationaler Datenbanken haben die Sprache SQL in ihrem Produkt um einige Anweisungen erweitert, da Standards üblicherweise der Entwicklung etwas hinterherlaufen. Deshalb sind in den marktüblichen Datenbanksystemen weitere, hier nicht aufgeführte, Anweisungen enthalten. Wesentliche Eigenschaften von SQL sind • SQL entspricht in der Grundstruktur und den verwendeten Schlüsselwörtern der englischen Sprache und ist auf sehr wenige Befehle beschränkt und somit leicht zu erlernen. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 40 • SQL ist Teil des Datenbank Management Systems (DBMS) und die einzige Schnittstelle um, mit der Datenbank auf konzeptioneller oder externer Ebene zu kommunizieren. • SQL ist sowohl eine einfache Abfragesprache als auch ein Entwicklungswerkzeug für Anwendungsprogrammierer. Sämtliche Anwender, die mit der Datenbank arbeiten, sei es der Datenbankadministrator, oben genannter Anwendungsentwickler oder der einfache Benutzer, der lediglich Abfragen startet, arbeiten mit demselben Werkzeug. • Sämtliche relationale Datenbanken, die SQL unterstützen, benutzen dieselbe standardisierte Sprache. Die Sprache muß somit vom Benutzer nur einmal erlernt werden. Er kann sie auf jedem beliebigen System, vom PC bis hin zum Großrechner, gleich einsetzen. • SQL ist damit in der Lage, heterogene Rechnersysteme zu verbinden und schafft somit die Möglichkeit zur Realisierung verteilter Datenbanken. 3.2 Objekte einer Relationalen Datenbank Innerhalb einer relationalen Datenbank sind Objekte definiert, auf denen Operationen ausgeführt werden können. Einige wichtige Objekte werden im folgenden kurz erläutert. • Tabellen Tabellen (Relationen) sind zweidimensionale Basisstrukturen, um Daten von Benutzern zu speichern. Tabellen sind definiert durch Spalten (Attribute, Eigenschaften) und Zeilen (Datensätze, Tupel). Kreuzungspunkte von Spalten und Zeilen nennt man Felder. Um Zeilen eindeutig identifizieren zu können, werden Spalten angelegt, die die Eindeutigkeit gewährleisten. Sie werden Primärschlüssel genannt. • Views Views sind logische Sichten auf physische Basistabellen. Ein View ist im Gegensatz zu einer Basistabelle eine virtuelle Tabelle, durch die es möglich wird, Daten nach bestimmten Kriterien sichtbar zu machen bzw. unsichtbar zu halten. • Indizes Ein Index ist eine Struktur, die optional für eine Tabelle angelegt werden kann. Durch einen Index kann die Suche nach Datensätzen beschleunigt werden. 3.3 Etwas relationale Algebra Die relationale Algebra beschäftigt sich mit dem datenmanipulierenden Teil des relationalen Modells. Hier werden Operatoren definiert, die auf Relationen (Tabellen) angewandt werden und als Ergebnis neue Relationen schaffen. SQL orientiert sich sehr stark an der relationalen Algebra. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 41 Nachfolgend werden die wichtigsten Begriffe der relationalen Algebra kurz vorgestellt. Auf die Angabe der exakten mathematischen Definitionen wird dabei verzichtet, da sie vornehmlich Datenbanktheoretiker zufriedenstellen. 3.3.1 Restriction REST (Relation, Bedingung) Sie extrahiert aufgrund der Bedingung ein oder mehrere Tupel aus der Relation (Zeilenauswahl). r1 Rest (r1, attr2 = ‘A’) attr1 1 2 3 attr2 A B C attr1 1 attr2 A 3.3.2 Projection PROJ (Relation, Attr1, Attr2,....) Sie extrahiert Attribute (Spalten, Eigenschaften) aus der Relation. r1 attr1 1 2 3 Proj (r1,<attr2>) attr2 A B C attr2 A B C 3.3.3 Product PRODUCT (Relation1, Relation2) bildet das kartesische Produkt aus den beiden Relationen. (Jedes Tupel in Relation1 wird mit jedem Tupel in Relation2 kombiniert.) r1 r2 A B C x y Product (r1,r2) A A B B C C x y x y x y ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 42 3.3.4 Union UNION (Relation1, Relation2) bildet die Vereinigungsmenge zweier Relationen. Dabei müssen die Attribute selbstverständlich kompatibel sein. r1 r2 A B C D E Union (r1,r2) A B C D E 3.3.5 Intersection INTERSECTION (Relation1, Relation2) bildet die Schnittmenge, also die gemeinsamen Tupel zweier Relationen. r1 r2 A B C A D Intersection (r1,r2) A 3.3.6 Difference DIFFERENCE (Relation, Relation2) bildet die Differenzmenge zweier Relationen, also Vereinigungsmenge abzüglich Schnittmenge. r1 r2 A B C A D Difference (r1,r2) B C D ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 43 3.3.7 Join JOIN (Rel1, Rel2, Attr1 = Attr2) verbindet zwei Relationen ähnlich dem Operator PRODUCT. Hier werden jedoch nur die Tupel abgebildet, in der zwei bestimmte Attributwerte in einer gewissen Beziehung zueinander stehen. Es gibt mehrere Arten des Joins. • Inner-Join • Theta-Join (Θ-Join): zusammen- Beim Theta-Join erfolgt eine Zuordnung hängender Tupel aus verschiedenen Relationen durch einen Vergleich je eines Attributs pro beteiligter Relation. Das Θ steht dabei als Platzhalter für den möglichen Operator, der aus der Menge der Vergleichsoperatoren (=,<,>,>=,<=, <>) stammen muß. r1 a4) a1 A B C r2 a2 w x y a3 C D a4 y z a1 A A B B C C a2 w w x x y y a3 C D C D C D Theta-Join (r1,r2,a2 = a4 y z y z y z a1 C a2 y a3 y a4 C • Equi-Join: Ein Equi-Join ist eine Untermenge des Theta-Joins und läßt nur das Gleichheitszeichen als Operator zu. • Natural-Join: Ein Natural-Join ist ein Equi-Join, der die gleichen Attributwerte (der Vergleichsoperation) nur einmal beinhaltet. r1 a1 A B C Product(r1,r2) r2 a2 w x y a3 C D a4 y z a1 A A B B C C Product(r1,r2) Natural-Join (r1,r2,a2 = a4) a2 a3 a4 a1 a2 a3 w C y C y C w D z x C y x D z y C y y D z • Semi-Join: Bei einem Semi-Join werden nur die Tupel aus der ersten Relation des Joins ausgegeben. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 44 r1 r2 a1 A B C a2 w x y a3 C D a4 y z a1 A A B B C C • Multiple-Join: r1 a2 w x y a3 C D r3 a4 y z a5 A B C • Restricted-Join: r1 a1 A B C D E a3 C D a4 y z • Non-Equi-Join: r1 a1 A B C D E a3 C D Restricted-Join (r1,r2,a2 = a4 AND a2 = ’z’) a1 a2 a3 E z D Ein Non-Equi-Join bedeutet, daß in der JoinBedingung bzw. in der Restriktion ein beliebiger Operator vorkommen darf. r2 a2 v w x y z Multiple-Join (r1,r2, r3, a2 = a4 = a6) a6 a1 a2 a3 a5 x C y C B y z Bei einem Restricted-Join werden zusätzlich zur Join-Bedingung noch weitere Bedingungen (Restriktionen) über eine AND-Verknüpfung angegeben. r2 a2 v w x y z Semi-Join (r1,r2,a2 = a4) a4 a1 a2 y C y z y z y z Ein Join, an dem mehr als zwei Relationen beteiligt sind, nennt man Multiple-Join. r2 a1 A B C Product(r1,r2) a2 a3 w C w D x C x D y C y D a4 y z • Auto-Join (Self-Join): Non-Equi-Join (r1,r2,a2 = a4 AND a2 <= ’z’) a1 a2 a3 D y C E z D verknüpft eine Relation mit sich selbst. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 45 r1 a1 A B C D E a2 w x y z y Auto-Join (r1, row1.a2 = row2.a2) a1 a2 a1 C y E • Outer-Join • zeigt neben den Tupeln, bei denen der Attributwert der ersten Relation in der zweiten Relation vorkommt, auch die Tupel einer Relation an, bei denen dies nicht der Fall ist. D.h. eine Relation kann vollständig angezeigt werden. r1 a1 A B C r2 a2 w x y a3 C D a4 y z Outer-Join (r1,a2 = a4,r2) a1 a2 a3 A w B x C y C 3.4 Sprachbereiche SQL arbeitet mit Datenbankobjekten und Operatoren auf diesen Objekten. Weiterhin verwaltet SQL Privilegien, die festlegen wer welche Operation auf welche Objekte ausführen darf. Demzufolge kann man die Sprache SQL in 3 Kategorien einteilen. DDL = DML = DCL = Data Definition Language Data Manipulation Language Data Control Language zur Definition von Objekten zur Manipulation von Objekten zur Transaktionsverwaltung und zur Kontrolle von Privilegien 3.5 DML Zu den Data Manipulation Anweisungen gehören die Befehle • • • • SELECT INSERT UPDATE DELETE Abfragen von Daten Einfügen von Datensätzen Ändern von Daten Löschen von Datensätzen 3.5.1 Abfragen (Queries) mit der SELECT Anweisung Der SELECT Befehl ist der mächtigste Befehl der Sprache SQL. Er dient dazu bestimmte Datensätze und Spalten aus einer Tabelle oder View zu lesen. Das Ergebnis einer Abfrage ist wiederum eine Tabelle. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 46 Die SELECT Anweisung besteht im Minimalfall aus der SELECT und FROM Klausel. SQL> SELECT <spalte1>, <spalte2>,... FROM <tabelle> 3.5.1.1 SELECT Klausel In der SELECT Klausel werden die Spalten definiert, die in der Ergebnisrelation erscheinen sollen. Wird direkt hinter SELECT das Wort 'DISTINCT' angegeben, so wir die Ausgabe von gleichen Tupeln unterdrückt. Die Gleichheit bezieht sich dabei auf die Spalten, die in der SELECT Klausel angegeben sind. Das Wort 'ALL' (Default) wertet alle Zeilen aus, also auch Duplikate. Die Selektionsliste kann folgende Elemente enthalten: * selektiert alle Spalten der Tabelle Spaltennamen Namen von Spalten einer Tabelle. Die Eindeutigkeit muß gewährleistet sein. Funktionen Ergebnisse von arithmetischen Operationen über mehrere Spalten eines Tupels, wie z.B. Berechnung von Jahresgehältern aus Monatsgehältern sowie arithmetische Funktionen oder Stringfunktionen. Gruppenfunktionen führen Berechnungen über eine Spalte (nicht wie oben über eine Zeile) aus. Konstanten Konstante numerische oder alphanumerische Werte. Die Elemente können miteinander kombiniert werden, wenn sie durch Kommata getrennt werden. 3.5.1.2 Funktionen Funktionen werden in Ausdrücken verwendet, die Spaltenwerte enthalten. Also in der SELECT Klausel WHERE Klausel ORDER BY Klausel Funktionen bestehen immer aus dem Funktionsnamen und einem oder mehreren Argumenten. Man unterteilt die Funktionen in folgende Bereiche ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 47 • • • • • Arithmetische Funktionen Zeichenkettenfunktionen Datumsfunktionen Konvertierungsfunktionen Sonstiges (SIN(),LOG(),MOD(),SIGN(),ABS(),...) (SUBSTR(), RTRIM(), TRANSLATE(),...) (LAST_DAY(),NEXT_DAY(),ADD_MONTH(),...) (TO_CHAR(), TO_DATE(),REPLACE(),...) (NVL(), GREATEST(), LEAST(),...) Die Bedeutung und genaue Syntax der Funktionen kann aus Handbüchern oder Syntaxdiagrammen entnommen werden. Erklärungen an dieser Stelle würden den Rahmen der Einführung sprengen. 3.5.1.3 FROM Klausel Die FROM Klausel enthält die Bezeichnung der Tabelle oder View aus der Daten selektiert werden sollen. Eine Tabelle ist immer einem Besitzer zugeordnet. In SQL werden Tabellen mit gleichem Namen aber unterschiedlichen Besitzern durch voranstellen des Besitzernamens vor den Tabellennamen unterschieden. In den Anweisungen können Namen von Tabellen oder Views, um die Handhabung zu erleichtern durch meist kürzere Aliasnamen ersetzt werden. Dies geschieht einfach durch anhängen des Aliases an den Namen in der FROM Klausel. Beispiel einer minimalen SELECT Anweisung. SQL> SELECT Name, Abteilung, Monatsgehalt, 12*Monatsgehalt FROM USER1.Mitarbeiter Diese Anweisung extrahiert aus der Tabelle 'Mitarbeiter', deren Eigentümer USER1 ist, die Spalten 'Name', 'Abteilung', 'Monatsgehalt' und fügt der Ergebnistabelle eine Spalte mit dem Jahresgehalt hinzu. 3.5.1.4 WHERE Klausel - Zeilenfilter Nachdem durch die SELECT Klausel eine Selektion bezüglich der Spalten ermöglicht wurde, werden mittels der WHERE Klausel bestimmte Zeilen extrahiert. Die WHERE Klausel enthält eine Bedingung, der die Zeilen entsprechen müssen, wenn sie mit in die Ergebnistabelle eingehen sollen. Eine Bedingung ist folgendermaßen aufgebaut Ausdruck Vergleichsoperator Ausdruck Ein Ausdruck ist ein Spaltenname, eine Konstante oder das Ergebnis einer untergeordneten, verschachtelten Abfrage. • Eine untergeordnete Abfrage kann in der WHERE Klausel folgendermaßen formuliert sein. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 48 ...WHERE Name = (SELECT Name FROM mitarbeiter WHERE Personalnummer=123) • Arithmetische Vergleichsoperatoren Arithmetische Vergleichsoperatoren sind die üblichen Programmiersprachen bekannten Operatoren (=, <>, <=, >=, <, >). aus anderen • Alphanumerische Vergleichsoperatoren Der Zeichenkettenoperator LIKE ermöglicht das Erstellen von Suchschablonen. Der Vergleichswert muß dabei nicht vollständig angegeben werden. So können beispielsweise Zeilen selektiert werden, bei denen ein Attribut nicht vollständig bekannt ist. • Das Platzhaltersymbol '%' repräsentiert kein, ein oder beliebig viele Zeichen. • '_' repräsentiert genau ein Zeichen. Beispiele: SQL> SELECT Name, Abteilung FROM Mitarbeiter WHERE Name= 'Maier' selektiert alle Zeilen, in denen die Spalte Name der Wert 'Maier' beinhaltet. ...WHERE Name LIKE 'Ma%' selektiert alle Zeilen mit Namen, die mit 'Ma' anfangen ...WHERE Name LIKE '%ai%' selektiert alle Zeilen mit Namen, die 'ai' beinhalten, egal an welcher Stelle. ...WHERE Name LIKE '_aier' selektiert alle Zeilen mit Namen, die 5 Zeichen lang sind und mit 'aier' enden. • Logische Vergleichsoperatoren • Durch BETWEEN <Wert1> AND <WERT2> werden alle Zeilen erfaßt, die zwischen zwei Grenzwerten liegen. ...WHERE Name BETWEEN 'Holzmann' AND 'Maier' selektiert alle Mitarbeiter deren Namen im Alphabet zwischen den angegebenen liegt. • Der Operator IN erlaubt es ein Attribut mit einer Menge von Werten zu vergleichen. ...WHERE Name IN ('Maier', 'Müller,...) • Zeilen, die NULL Felder enthalten können mit der Bedingung ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 49 ...WHERE Name IS NULL selektiert werden. • Mit dem NOT Operator können Bedingungsergebnisse invertiert werden. ...WHERE Name NOT IN ('Maier', 'Müller') • Mehrere Bedingungen können formuliert und mit logischen Operatoren AND und OR verknüpft werden. ...WHERE Name = ' Maier' AND Abteilung = 'Vertrieb' Dadurch werden alle Mitarbeiter namens Maier in der Abteilung 'Vertrieb' gefunden. 3.5.1.5 Gruppenfunktionen, GROUP BY Klausel In der SELECT Klausel können, wie oben erwähnt, Guppenfunktion auftauchen, die ihr Ergebnis aus mehreren Zeilen berechnen. Diese Gruppenfunktionen liefern als Ergebnis einen Wert zurück. Gruppenfunktionen beziehen sich stets auf die Ergebnistabelle und nicht auf die Haupttabelle und immer auf die angegebene Spalte. Enthält diese Spalte NULL Werte, können unter Umständen unerwartete Ergebnisse entstehen, da NULL Werte von den Gruppenfunktionen unterschiedlich gehandhabt werden. Im Standard SQL sind folgende 5 Gruppenfunktionen definiert. • • • • • COUNT AVG SUM MIN MAX Anzahl ausgewählter Zeilen Durchschnitt der ausgewählten Werte Summe der ausgewählten Werte kleinster Wert größter Wert Die Verwendung von Gruppenfunktionen ist solange unkritisch, solange ausschließlich Gruppenfunktionen in der SELECT Klausel verwendet werden. Kommen in der SELECT Klausel normale Spaltennamen vor, muß die GROUP BY Klausel verwendet werden. GROUP BY führt eine Gruppenbildung durch. Eine Teilmenge von Zeilen mit gleichen Attributwerten in einer Spalte wird dabei zusammengefaßt. Gruppenfunktionen beziehen sich somit auf die durch GROUP BY gebildeten Gruppen. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 50 In der GROUP BY Klausel müssen alle Spaltennamen der SELECT Klausel aufgeführt sein. Beispiele: SQL> SELECT SUM (Gehalt) FROM Mitarbeiter; gibt als Ergebnis die Gesamtsumme aller Gehälter aus. SQL> SELECT Abteilung, SUM(Gehalt) FROM Mitarbeiter GROUP BY Abteilung; gibt als Ergebnis für jede Abteilung die Summe der Gehälter aus. SQL> SELECT Abteilung, Funktion, SUM (Gehalt) FROM Mitarbeiter GROUP BY Abteilung, Funktion; gibt als Ergebnis die Summe der Gehälter für jede Berufsgruppe (Funktion) in jeder Abteilung aus. 3.5.1.6 HAVING Klausel - Gruppenfilter Die HAVING Klausel dient, wie die WHERE Klausel, der Auswahl bestimmter Zeilen, deshalb entspricht die Syntax der HAVING Bedingung der, der WHERE Bedingung. Im Gegensatz zur WHERE Klausel bezieht sich die HAVING Klausel jedoch nicht nur auf einzelne Zeilen , sondern auf die Gruppen, die durch die GROUP BY Klausel erzeugt worden sind. SQL> SELECT Abteilung, SUM (Gehalt) FROM Mitarbeiter WHERE Abteilung <> 'Vertrieb' GROUP BY Abteilung HAVING SUM(Gehalt) > 1000000; Diese Anweisung extrahiert alle Abteilungen außer der Abteilung 'Vertrieb', bei denen das Gesamtgehalt der Mitarbeiter über 1 000 000 liegt. Die HAVING Klausel und die WHERE Klausel können durchaus in derselben Anweisung verwendet werden. Dabei filtert die WHERE Klausel alle Zeilen aus, die aufgrund eines Attributes nicht betrachtet werden sollen, während die HAVING Klausel die Zeilen ausfiltert, die aufgrund des Ergebnisses einer Gruppenfunktion ausscheiden. Die Entscheidung, ob eine Zeile zum Ergebnis gehört oder nicht kann nicht anhand einzelner Zeilen getroffen werden. 3.5.1.7 ORDER BY Klausel ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 51 Die ORDER BY Klausel sorgt für die Sortierung der Zeilen in der Ergebnistabelle. Die Liste der Argumente ist eine Teilmenge der SELECT Argumente. SQL> SELECT Name, Abteilung FROM Mitarbeiter ORDER BY Name ASC; Die Sortierung kann durch den Zusatz DESC absteigend erfolgen. Kein Zusatz oder der Zusatz ASC verursacht eine aufsteigende Sortierung. 3.5.1.8 Subselects Innerhalb einer WHERE oder HAVING Klausel können SELECT Anweisungen verwendet werden, was zu einer Verschachtelung der SELECT Anweisung führt. SQL> SELECT Name FROM Mitarbeiter WHERE Abteilung = (SELECT Abteilung FROM Mitarbeiter WHERE Name='Maier'); Diese Anweisung führt alle Mitarbeiter auf, die in derselben Abteilung arbeiten, wie der Mitarbeiter mit dem Namen 'Maier'. Die Subselect Anweisung ermittelt hier die Abteilungsbezeichnung die im übergeordneten SELECT als Ausdruck in der WHERE Bedingung dient. Die Unterabfrage kann einen Wert oder eine Wertemenge zurückliefern. Deshalb ist die Verwendung eines arithmetischen Operators in der WHERE Klausel der übergeordneten Abfrage nicht zu empfehlen. Besser ist hier der logische Operator IN. Eine Unterabfrage muß stets rechts vom Vergleichsoperator der übergeordneten WHERE Klausel stehen. • Der EXISTS Operator wird in Verbindung in Verbindung mit SUBSELECTS verwendet, um auf das Vorhandensein von Zeilen zu prüfen, die ein Vergleichskriterium erfüllen. SQL> SELECT Abteilung FROM Mitarbeiter WHERE EXISTS (SELECT * FROM Mitarbeiter WHERE Name='Maier'); Hier werden alle Abteilungen extrahiert, die einen Mitarbeiter Namens 'Maier' beschäftigen. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 52 3.5.1.9 Mengenoperatoren Eine relationale Menge sind die Zeilen , die das Ergebnis einer SELECT Anweisung darstellen. Die leere Menge entspricht dabei 0 selektierten Zeilen. Relationale Mengen können mittels der Mengenoperatoren • UNION (ALL) • INTERSECT • MINUS Vereinigungsmenge, mit der Option ALL werden auch Duplikate ausgegeben. Schnittmenge Zeilen, die in der ersten, nicht aber in der zweiten Menge vorkommen. verknüpft werden. SQL> SELECT Name FROM Mitarbeiter WHERE Abteilung='Vertrieb' UNION SELECT Name FROM Mitarbeiter WHERE Abteilung='Einkauf'; Hier werden Namen der Mitarbeiter aus den Abteilungen 'Vertrieb' und 'Einkauf' ausgegeben. Die Abfragen müssen sich nicht auf dieselbe Tabelle beziehen. Die Attributwerte der Ergebnistabellen müssen jedoch derselben Domäne entstammen. 3.5.1.10 JOIN - Verknüpfung von Tabellen Die bisher verwendeten SELECT Anweisungen verwendeten immer nur eine Tabelle. Da i.a. Daten in verschieden Tabellen gehalten werden, muß es eine Möglichkeit geben, Abfragen über mehrere Tabellen zu formulieren. Das Konstrukt, das dies ermöglicht, heißt JOIN. Er wurde in der relationalen Algebra bereits vorgestellt. In der Sprache SQL gibt es keine explizite Anweisung zur Bildung dieses Produktes. Der JOIN wird dadurch realisiert, daß in der FROM Klausel einer SELECT Anweisung mehrere Tabellen angegeben werden. Die Art des Operators JOIN der relationalen Algebra wird durch die Angabe einer Join Bedingung in der WHERE Klausel bestimmt. Als Beispiel sollen zwei Tabellen dienen. Die Tabelle Mitarbeiter enthält die Personalnummer, Namen und Abteilung der Angestellten, die Tabelle Projekt enthält die Personalnummer und das dem Mitarbeiter zugehörige Projekt. Mit einer SQL Abfrage soll nun ermittelt werden, wer in welchem Projekt arbeitet. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 53 SQL> SELECT Mitarbeiter.Name, Mitarbeiter.Abteilung, Projekt.ProjBezeichnung FROM Mitarbeiter, Projekt Diese Anweisung bildet das kartesische Produkt der beiden Tabellen. Dabei werden zwangsläufig Zeilen entstehen, die die Realität falsch wiedergeben, weil jeder Mitarbeiter plötzlich bei jedem Projekt mitarbeitet. Durch die Join Bedingung muß die Teilmenge des kartesischen Produktes ermittelt werden, die die Realität widerspiegelt. In unserem Fall benötigen wir einen EQUI JOIN, da nur die Datensätze der Produkttabelle von Interesse sind in denen die Personalnummer aus Mitarbeiter und aus Projekt übereinstimmen. Die gesuchte Abfrage lautet somit. SQL> SELECT Mitarbeiter.Name, Mitarbeiter.Abteilung, Projekt.ProjBezeichnung FROM Mitarbeiter, Projekt WHERE Mitarbeiter.Personalnummer = Projekt.Personalnummer Da die Spalte Personalnummer in beiden Tabellen vorkommt, muß der Eindeutigkeit wegen der Tabellenname mit angegeben werden. Es ist möglich, mehr als zwei Tabellen mit einem Join zu verknüpfen. Werden n Tabellen miteinander verknüpft, müssen n-1 Join Bedingungen formuliert werden. Die Join Bedingung kann selbverständlich mit weiteren Bedingungen kombiniert werden. In der SELECT Anweisung kann, um die oft langen Tabellennamen abzukürzen und um beim SELF JOIN die Tabellen zu unterscheiden, für die Tabellennamen ein Aliasname vergeben werden. Beispiel: SQL> SELECT M.Name, M.Abteilung, P.ProjBezeichnung FROM Mitarbeiter M, Projekt P WHERE M.Personalnummer = P.Personalnummer Der OUTER JOIN wird realisiert, indem in der Join Bedingung die Tabelle, die vollständig in das Ergebnis eingehen soll, mit einem '(+)' ergänzt wird. SQL> SELECT M.Name, P.Projekt FROM Mitarbeiter M, Projekt P WHERE M.Personalnummer (+) = P.Personalnummer Mit dieser Anweisung erhalten wir alle Mitarbeiter, also auch solche, die in keinem Projekt tätig sind. Wenn in der Tabelle P unter M.Personalnummer kein Datensatz gefunden wird, so wird ein zusätzlicher Datensatz erstellt, der im Schlüsselfeld den Wert des geforderten Schlüssels enthält. Alle anderen Felder sind NULL. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 54 3.5.2 Umsetzung der SELECT Anweisung in relationale Operatoren Die Anweisungen der Sprache SQL werden innerhalb des Datenbanksystems auf Operationen der relationalen Algebra umgesetzt. Zunächst werden die Anweisungen semantisch und syntaktisch geprüft. Läßt man Optimierungsprozesse außer acht, läuft die Umsetzung einer SELECT Anweisung folgendermaßen ab. 1. Bei der Verwendung von JOINS wird zuerst das kartesische Produkt über die Tabellen gebildet. 2. Aufgrund der WHERE Klausel werden Zeilen selektiert. 3. Das Ergebnis wird entsprechend der SELECT Klausel auf die gewünschten Spalten projiziert. Nach jedem Schritt entsteht eine temporäre Ergebnistabelle. Beispiel: In der Tabelle Mitarbeiter seien 500 Mitarbeiter, davon 50 im 'Vertrieb'. In der Tabelle seien 30 Projekte. Jeder Mitarbeiter ist in genau einem Projekt tätig. SQL> SELECT Name, Projekt FROM Mitarbeiter M, Projekt P WHERE M.Abteilung = 'Vertrieb' AND M.Personalnummer = P.Personalnummer Mitarbeiter (500) Projekt (30) Product (15.000) Rest ( Mitarbeiter.Abteilung = 'Vertrieb' M.Personalnummer = P.Personalnummer) (50) Proj (Name,Projekt) (50) Durch die sequentielle Abarbeitung der Operationen entstehen mitunter enorm große temporäre Tabellen. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 55 Aufgabe sog. Optimierer ist, die Reihenfolge und Art der Umsetzung so anzupassen, daß die Anzahl der Zeilen in den temporären Tabellen möglichst klein gehalten wird, wobei die Geschwindigkeit der Abarbeitung mit berücksichtigt werden muß. Bei kleinen Tabellen wird anstatt des Operators Product auch der Join Operator verwendet. Bei diesem Operator wird bereits die Join Bedingung berücksichtigt. Es fallen so sehr viel weniger Zeilen an. Da der Join Operator allerdings durch Programmschleifen realisiert ist, wird er bei steigender Zeilenanzahl sehr langsam. 3.5.3 INSERT Die INSERT Anweisung fügt in eine bestehende Tabelle Datensätze ein. Sie benötigt dazu die Angabe des Tabellennamens, der Spaltenname und der Werte, die eingetragen werden sollen. Je nachdem ob eine Zeile oder mehrere Zeilen angefügt werden sollen, wird die VALUES Klausel verwendet. SQL> INSERT INTO <tabelle> (<spalte>,...) VALUES (<Wert1>,<Wert2>,...); schreibt eine neue Zeile in die <tabelle> mit den Werten, die nach VALUES angegeben sind. SQL> INSERT INTO <tabelle> (<spalte>,....) SELECT...; schreibt alle die Zeilen in <tabelle>, die durch die SELECT Anweisung erzeugt werden. Die Anzahl und die Datentypen in der Spaltenauswahl der SELECT Anweisung muß denen der INSERT Anweisung entsprechen. 3.5.4 UPDATE UPDATE ändert ein oder mehrere bereits bestehende Felder einer Tabelle. SQL> UPDATE <tabelle> SET <spalte> = <Wert> WHERE <Bedingung> Es können mehrere Spalten mit Werten, durch Komma getrennt, angegeben werden. Die WHERE Klausel selektiert die Datensätze, die aktualisiert werden. Dort kann auch eine Unterabfrage (Subquery) eingebaut werden. Durch die Verwendung einer Subquery in der SET Klausel SQL> UPDATE<tabelle> SET (<spalte>,...) = (SELECT...) WHERE <Bedingung> sind komplexe UPDATE Anweisungen möglich. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 56 3.5.5 DELETE DELETE löscht eine oder mehrere Zeilen aus einer Tabelle. SQL> DELETE FROM <tabelle> WHERE <bedingung>; Mit der WHERE Klausel werden die zu löschenden Zeilen spezifiziert. Fehlt die WHERE Klausel oder ist sie nicht eindeutig, werden mehrere Zeilen oder der ganze Inhalt der Tabelle gelöscht. 3.6 DDL Die Data Definition Language (DCL) dient auf konzeptioneller Datenbankebene der Erstellung , Änderung und dem Löschen von Datenbankobjekten. Demzufolge gehören dazu die Anweisungen • CREATE • ALTER • DROP 3.6.1 CREATE 3.6.1.1 CREATE TABLE CREATE TABLE definiert eine neue Tabelle. Die Parameter enthalten den Tabellennamen und die Spalten. Für jede Spalte muß der Datentyp und das Attribut NULL/NOT NULL angegeben werden (Default ist NULL). SQL> CREATE TABLE <tabelle> (<spalte1> <Datentyp> [NULL/NOT NULL], <spalte2> <Datentyp> [NULL/NOT NULL],.....) Eine weitere Variante des CREATE Befehls ist die Verwendung der AS SELECT Klausel, die es ermöglicht, die Tabellenstruktur und die Daten einer bestehenden Tabelle zu übernehmen. SQL> CREATE TABLE <tabelle1> (<spalte1>, <spalte2>,...) AS SELECT <spalte1>,<spalte2>,... FROM <tabelle2> Die Anzahl der Spalten in der SELECT Anweisung muß gleich sein wie die Anzahl in der CREATE TABLE Anweisung. 3.6.1.2 CREATE VIEW Die Anweisung SQL> CREATE VIEW <view_name> AS SELECT .... ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 57 generiert eine virtuelle Tabelle , die genau die Spalten und Zeilen enthält, die durch die SELECT Anweisung erzeugt wurden. 3.6.1.3 CREATE INDEX CREATE INDEX erzeugt einen Index auf eine bestimmte Spalte einer Tabelle (wird beim Anlegen eines Primary Key automatisch erzeugt). 3.6.2 ALTER Die ALTER Anweisung ändert bestehende Datenbankobjekte. Angewandt auf Tabellen können Spalten angefügt oder modifiziert werden, d.h. die Eigenschaften wie Datentyp oder die Zulassung von Nullwerten. • Eine NOT NULL Spalte kann jedoch nur bei leeren Tabellen angefügt werden. • Verkleinern der Spaltenbreite ist nur bei leeren Spalten möglich. SQL> ALTER TABLE <tabelle> ADD (<Spalte1 <Datentyp> NULL/NOT NULL, <Spalte2> ...); SQL> ALTER TABLE <tabelle> MODIFY (<Spalte1 <Datentyp> NULL/NOT NULL, <Spalte2> ...); ALTER VIEW und ALTER INDEX spielen eine eher unwichtige Rolle, so daß auf ihre Behandlung hier verzichtet werden kann. Nähere Informationen sind aus den Syntaxdiagrammen ersichtlich. 3.6.3 DROP DROP löscht ein Datenbankobjekt. Dazu muß der Objekttyp und der Objektname angegeben werden. SQL> DROP TABLE <tabelle> DROP INDEX <index> DROP VIEW <view> 3.7 DCL 3.7.1 Transaktionsverarbeitung Eine Transaktion ist eine logisch zusammengehörende Arbeitseinheit, die eine oder mehrere SQL Anweisungen enthält. Die Auswirkungen aller der Transaktion angehörigen Anweisungen müssen aus Sicherheitsgründen gemeinsam festgeschrieben oder zurückgenommen werden. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 58 Ohne Mechanismen der Transaktionsverarbeitung können sich die Daten während einer Transaktion in einem inkonsistenten Zustand befinden. Ein Beispiel dafür ist die Buchung von Geldbeträgen von einem Konto zu einem anderen. Je nachdem, wie lange die Transaktion dauert (evtl. Warten auf Eingaben inbegriffen), steigt die Wahrscheinlichkeit, daß Probleme auftreten, die das Weiterarbeiten verhindern. Somit wäre beispielsweise ein Betrag vom Konto abgebucht, nicht jedoch auf das andere Konto übertragen. Die Änderungen während einer Transaktion werden solange, bis die Eingabe bestätigt wird, in sog. Rollbacksegmenten gespeichert und erst bei Bestätigung in die Tabellen übertragen. Ändern des Kontostandes auf Konto 1 Zeitachse Ändern des Kontostandes auf Konto 2 Festschreiben oder Zurücknehmen der Transaktion SQL bietet für die Transaktionsverarbeitung die Anweisungen COMMIT und ROLLBACK. COMMIT dient dabei der Bestätigung und des Festschreibens der Änderungen ROLLBACK nimmt alle noch nicht bestätigten Anweisungen zurück. Um die Integrität der Daten bei einem Multi-User System zu gewährleisten, müssen Tabellenzeilen oder vollständige Tabellen für die Dauer einer Transaktion für andere Anwender gesperrt werden (bezüglich Schreibzugriffen, Lesezugriffe sind immer möglich). SQL hält dazu den LOCK Befehl bereit. Da allerdings alle gängigen Datenbanksysteme die Sperrung automatisch bei Datenmanipulierenden Anweisungen wie UPDATE, INSERT, DELETE veranlassen, wird der LOCK Befehl nur selten verwendet. 3.7.2 Objektprivilegien SQL stellt Anweisungen bereit, den Zugriff auf Daten und Strukturen zu verhindern, um die Datensicherheit zu gewährleisten. Datenbankanwendern werden Privilegien auf Datenbankobjekte verliehen oder entzogen. Man unterscheidet folgende Privilegien • CREATE Erstellen eines Objekts • ALTER Ändern eines Objekts ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 59 • • • • DELETE INSERT SELECT UPDATE Löschen eines Objekts Einfügen neuer Zeilen in Tabellen oder Views Selektion aus einer Tabelle oder View Ändern von Daten in einer Tabelle oder View 3.7.2.1 GRANT Mit der GRANT Anweisung werden Privilegien weitergereicht. Beispiel: SQL> GRANT create Table TO <user> 3.7.2.2 REVOKE Mit der REVOKE Anweisungen werden Privilegien entzogen Beispiel: SQL> REVOKE create table FROM <user> 3.8 Erweiterungen durch weiterführende SQL Standards 3.8.1 Check-Option Die CHECK-Option ermöglicht es einen Wertebereich für Tabellenspalten anzugeben. Bei UPDATE oder INSERT Anweisungen wird der Eingabewert auf Gültigkeit überprüft. 3.8.2 Default-Option Für Attribute einer Tabelle können beim Anlegen Default Werte festgelegt werden. Dies vermeidet NULL Werte. 3.8.3 Unique-Option Die Eindeutigkeit bestimmter Attributswerte wird durch die UNIQUE-Option beim anlegen einer Tabelle gewährleistet. 3.8.4 Foreign Key Ein Attribut kann als Foreign Key deklariert werden. Dieser Foreign Key verweist auf einen Primärschlüssel einer weiteren Relation. Grundsätzlich gilt: Jeder Wert des Foreign Keys muß einem Wert des Primary Keys entsprechen. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 60 Die Verletzung dieser Integritätsregel durch UPDATE, INSERT oder DELETE Anweisungen kann mittels der Foreign Key Option verhindert werden. Es besteht dadurch auch die Möglichkeit des kaskadierbaren Löschens. Beispiel: Tabelle Auftrag enthält als Foreign Key die Kundennummer. Wird nun ein Kunde gelöscht, werden automatisch auch die Aufträge dieses Kunden gelöscht. Ohne Verwendung von Foreign Key bliebe ein Auftrag übrig, der keinem Kunden zugeordnet werden könnte oder aber bei Wiederverwendung der Kundennummer einem falschen Kunden zugeordnet wird. 3.8.5 Definition von Domänen Seit dem SQL2 Standard ist die Definition eines Datenbankobjektes Domäne möglich. Damit können Datentypen erzeugt werden, die eine stärkere Einschränkung des Wertebereichs von Attributen ermöglichen. 3.8.6 Zustände von Tabellen Tabellen können verschiedene Zustände annehmen. So ist es zum Beispiel möglich Tabellen nur für die Dauer einer Session anzulegen. 3.8.7 Transaktionen (siehe auch Kapitel 3.7.1) Die Zugriffsart bei Transaktionen kann manuell festgelegt werden. Read-only und Read-write Transaktionen sind möglich. Dadurch wird bestimmt inwieweit Datenänderungen für eine konkurrierende Transaktion sichtbar sind. 3.8.8 dynamisches SQL Die Form von SQL Anweisungen kann zur Laufzeit der Anwendung geändert werden. Der Anwender kann so interaktiv eingreifen. 3.8.9 Funktionen Die Standardfunktionen COUNT, AVG, MAX, MIN, SUM können an jeder beliebigen Stelle verwendet werden. Weitere Funktionen sind implementiert, die hauptsächlich auf Stringvariablen bezogen sind. (Bsp.: Substring, Char_length,..) ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 61 4 Einführung in SQL*Plus 4.1 Begriffe zu SQL*Plus SQL*Plus stellt eine einfache Möglichkeit dar um mit der Oracle Datenbank interaktiv in Kontakt zu treten, Änderungen vorzunehmen, Eingaben und Abfragen zu tätigen. Es handelt sich hierbei um einen Interpreter, d.h. die Übersetzung der Eingaben in Maschinencode erfolgt anweisungs-orientiert. SQL*Plus stellt ein typisches Prototyping-Werkzeug dar, mit dessen Hilfe interaktiv Eingaben getestet werden können, die später in Programme eingebunden werden. Möglichkeiten von SQL*Plus: • Unterstützung von SQL Kommandos, wie z.B. create, select, insert • Verarbeitung PL/SQL-Blöcken • Informationen über den Aufbau von Tabellen • Einlesen und Schreiben von SQL-Befehlen von bzw. in Dateien 4.2 SQL*Plus Befehle Dieses Kapitel stellt lediglich die Befehle vor, die zur Durchführung der Übungen gebraucht werden. Zur Vertiefung von SQL*PLUS wird auf das Oracle Handbuch „SQL*PLUS User Guide and Reference“ verwiesen. 4.2.1 Eingabe von SQL*Plus Befehlen Wie bereits schon erwähnt, handelt es sich bei SQL*Plus um einen Interpreter. Der SQL*Plus Interpreter arbeitet anweisungsorientiert. Eine Anweisung wird durch ein Semikolon abgeschlossen. Es ist möglich, eine Anweisung länger als 1 Zeile zu machen, d.h. Folgezeichen einzugeben, bis das Statement in einer Folgezeile durch einen Strichpunkt abgeschlossen wird. Beispiel: Eine Eingabe mit Folgezeilen kann folgendermaßen aussehen: SQL> SELECT name, vorname 1 from person 2 where name=‘Maier’ and 3 vorname like ‘A%’; 4.2.2 START SQL*Plus Befehle können im Dialog eingegeben werden. Es ist aber auch möglich, eine Stapeldatei von SQL*Plus Befehlen zu schreiben. Mit START können einzelne oder auch mehrere SQL-Befehle aus einem File gelesen und gleich ausgeführt werden. Dabei ist zu beachten, daß dieses File die Extension „.sql“ besitzen muß und nur durch den Filenamen ohne explizite Angabe der Extension aufgerufen wird. SQL> START <Filename> ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 62 Falls mehrere SQL-Befehle in diesem File vorhanden sind und diese nacheinander abgearbeitet werden sollen, so müssen sie durch einen „/“ voneinander getrennt werden. Beispiel: Das File „test.sql“ mit folgendem Inhalt soll aufgeführt werden: CREATE TABLE person(id int, nachname varchar(30), varchar(30)) / CREATE TABLE Student(MatrNr int, id int, semester int) / Durch Eingabe des folgenden SQL-Befehls wird das File „test.sql“ ausgeführt: SQL> START test 4.2.3 DESCRIBE Der Befehl DESCRIBE ermittelt den Aufbau einer angelegten Tabelle. SQL> DESCRIBE <Tablename> Beispiel: Das folgende Kommando gibt die Struktur der Tabelle aus. SQL> DESCRIBE person Name ---------------------------------------------------------ID NAME VORNAME Null? ------------- Type ---------------------------INT VARCHAR(30) VARCHAR(30) 4.2.4 Tabelle TABS In der Tabelle TABS werden von Oracle allgemeine Informationen zu den angelegten Tabellen abgelegt, wie z.B. der Name aller angelegten Tabellen eines Benutzers. Auf diese Tabelle kann wie auch auf andere Tabellen über den SELECTBefehl zugegriffen werden. Die Tabelle TABS ist nicht SQL*PLUS spezifisch, sondern ist ebenso in anderen Oracle-Werkzeugen verfügbar. Beispiel: Mit folgendem Befehl werden alle angelegten Tabellen des Benutzers aufgeführt: SQL> SELECT table_name 1 FROM tabs; ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 63 5 PL/SQL - eine prozedurale Erweiterung von SQL für Oracle 5.1 Allgemeines PL/SQL (Procedural Language Structured Query Language) ist eine prozedurale Erweiterung von SQL und basiert auf der Programmiersprache Ada. PL/SQL bietet einerseits die prozeduralen Elemente von 3.Generation-Sprachen wie C oder PASCAL und andererseits die nicht-prozeduralen Möglichkeiten der Datenmanipulation von SQL. Dabei unterstützt PL/SQL alle Data Manipulation Statements von SQL (DELETE, INSERT, SELECT, UPDATE), Cursor-Operationen sowie Transaction Processing (COMMIT, ROLLBACK und SAVEPOINT). Ferner kann eine beliebige Anzahl von SQL-Statements mit Statements für die Programmierung von Schleifen (FOR ... LOOP , WHILE ... LOOP), mit Statements zur Ablaufsteuerung (IF ... ELSIF ... ELSE ... END IF, EXIT und GOTO) und mit Zuweisungs-Statements verknüpft werden. PL/SQL faßt mehrere SQL-Statements zusammen und schickt diese als Einheit an die Datenbank. Diese Funktionalität steigert die Performance und reduziert den Netzwerk-Verkehr in verteilen Systemen drastisch. PL/SQL ist kein eigenständiges Tool . Es ist einerseits direkt im Oracle Management System (RDBMS) eingebaut und kann andererseits in Oracle-Precompilern, SQL*Plus, SQL*Forms und anderen Oracle-Tools verwendet werden. 5.2 Aufbau eines PL/SQL Blockes Ein PL/SQL Block besteht aus einem Deklarationsteil und einem Anweisungsteil. Folgende Schlüsselwörter definieren den Aufbau eines Blockes: • DECLARE bezeichnet den Beginn des Deklarationsteiles und eines PL/SQL Blockes • BEGIN bezeichnet den Beginn des Anweisungsteils und den Beginn des PL/SQL Blockes, wenn keine Deklarationen vorzunehmen sind. • EXCEPTION bezeichnet den Beginn des Fehlerbehandlungsteiles. • END bezeichnet das Ende des PL/SQL Blockes. 5.3 Ablaufsteuerung Bedingte Verzweigung: • IF-Statement: Wenn die Bedingung erfüllt ist, werden die nachfolgenden Statements ausgeführt. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 64 • ELSIF-Statement: Wenn die neue Bedingung erfüllt ist werden die nachfolgenden Statements ausgeführt. • ELSE-Statement: Sind die Bedingungen obiger IF- oder ELSIF-Statements nicht erfüllt, werden die nachfolgenden Statements ausgeführt. Unbedingte Verzweigung: Mit Hilfe von GOTO kann der Kontrollfluß des PL/SQL-Programms gesteuert werden. Schleifen: • FOR-Schleife Beispiel: FOR i IN 1..100 LOOP Statement; Statement; ... END LOOP; Die Schleife wird für jeden ganzzahligen Wert der Indexvariablen durchlaufen. Eine Umkehr der Zählrichtung erfolgt ausschließlich mit dem Schlüsselwort REVERSE. Der Werte-bereich des Zählers kann auch in Form von Variablen und Ausdrücken angegeben werden. Beispiel: ... FOR i IN REVERSE 1..max_zeilen LOOP Statement; Statement; ... END LOOP; • WHILE Schleifen Beispiel: WHILE BEDINGUNG LOOP Statement; Statement; ... END LOOP; • EXIT-Statement ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 65 Mit dem EXIT-Statement kann eine Schleife verlassen werden. Sind die Schleifen mit Namen versehen, so kann bei verschachtelten Schleifen nicht nur die aktuelle Schleife, sondern auch die übergeordnete Schleife verlassen werden. Beispiel: ... <<Schleife_aussen>> FOR l_v1 IN 1..10 LOOP ... <<Schleife_innen>> FOR l_v2 IN 1..100 LOOP Statement; ... IF ... THEN EXIT Schleife_aussen; END IF; END LOOP Schleife_innen; END LOOP Schleife_aussen; ... 5.4 Das SELECT-Statement Das SELECT-Statement hat eine zusätzliche INTO-Klausel, in der die PL/SQLVariablen mit den Daten aus der Datenbank gefüllt werden. In der WHERE-Klausel kann auf PL/SQL-Variable Bezug genommen werden. Ansonsten gibt es keine Unterschiede zum SELECT-Statement von SQL. Beispiel: DECLARE v_empno NUMBER(4) := 7700; v_sal emp.sal%TYPE; /*Mit dem Schluesselwort %TYPE wird v_sal mit dem Typ der Spalte sal deklariert.*/ BEGIN SELECT sal INTO v_sal FROM emp WHERE empno = v_empno; ..... END; 5.5 INSERT-, UPDATE- und DELETE-Statement Diese Statements manipulieren die Datenbank. Mit dem INSERT-Statement kann man einen Datensatz einfügen. Das UPDATE-Statement verändert und das DELETE-Statement löscht Datensätze, die mit der WHERE-Klausel beschrieben werden. Beispiel: DECLARE ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 66 v_empno NUMBER(4) := 7700; v_sal emp.sal%TYPE; v_deptno dept.deptno%TYPE; BEGIN SELECT sal INTO v_sal FROM emp WHERE empno = v_empno;v_sal := v_sal * 1.1; DELETE FROM emp WHERE mgr = v_empno; v_deptno :=0; UPDATE emp SET deptno = v_deptno WHERE empno = v_empno; INSERT INTO dept VALUES(v_deptno,’Temp’,’Temp;); .... END; 5.6 Elementare Datentypen PL/SQL der Version 2 hat folgende Datentypen: • BINARY_INTEGER Wertebereich : -2-31-1 ... 231 -1 Mit folgenden Subtypen: - NATURAL 0.. 231 -1 - POSITIVE 1.. 231 -1 • NUMBER[(x[,y])] x : Gesamtziffernzahl im Bereich 1.0E-129..9.99E125. y : Rundung auf Stellen hinter dem Komma. Die folgenden Subtypen haben denselben Wertebereich wie der Basistyp NUMBER: - DECIMAL / DEC - FLOAT - INTEGER / INT - REAL - SMALLINT - DOUBLE PRECISION - NUMERIC • CHAR[(n)] Zur Speicherung von CHAR-Daten fester Länge. n : Länge bis maximal 32767 Bytes, ohne Angaben nimmt n den Wert 1 an. Die maximale Länge dieses Datentyps weicht von der maximalen Länge des gleichnamigen Datentyps für Tabellenspalten ab, dort beträgt er 255 Bytes. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 67 Subtypen sind: - CHARACTER - STRING • ROWID Interne Spalte einer Datenbanktabelle, die angibt, in welchem Block(B), in welcher Zeile(R) und in welchem Datenbank-File(F) ein Datensatz gespeichert ist. Diese ROWID kann selektiert und in einer Variablen gleichen Typs gespeichert werden. • VARCHAR(n) VARCHAR2(n) Zur Speicherung von CHAR-Daten variabler Länge. Die Längenangabe n ist verbindlich. (n = max 32767). • LONG Entspricht dem Datentyp VARCHAR2. Max Länge 32767 Bytes. Die maximale Länge dieses Datentyps weicht von der maximalen Länge des gleichnamigen Datentyps für Tabellenspalten ab. • RAW / LONG RAW Dient zur Speicherung binärer Daten. Maximale Länge: 32767 Bytes bzw. 32760 Bytes (LONG RAW). 5.7 Strukturierte Datentypen 1. PL/SQL-TABLE PL/SQL-TABLES sind ähnlich aufgebaut wie Datenbanktabellen. Die Anzahl der Zeilen ist nicht beschränkt. Eine PL/SQL-TABLE besteht aus zwei Spalten, einem Primärschlüssel vom Datentyp BINARY_INTEGER und einer zweiten Spalte mit einem beliebigen Datentyp. Die Deklaration erfolgt in zwei Schritten: 1. Schritt: Deklaration des Tabellentyps. Beispiel: DECLARE TYPE s_name_tabelletyp IS TABLE OF CHAR(10) INDEX BY BINARY_INTEGER; Mit tabellenname.spaltenname%TYPE kann der Datentyp einer Tabellenspalte direkt vergeben werden: DECLARE ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 68 TYPE s_name_tabelletyp IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER; 2. Schritt: Deklaration einer Variablen dieses Typs. Beispiel: s_name_tab s_name_tabelletyp Wertzuweisung: Beispiel einer Zuweisung mittels Schleife: ... FOR i IN 1.. 14 LOOP SELECT ename INTO s_name_tab(i) FROM emp; END LOOP; ... 2. Records Wie die Tables müssen auch die Records in zwei Schritten deklariert werden. 1. Schritt: Deklaration des Records. 2. Schritt: Definition von Records dieses Typs. Beispiel: DECLARE --Deklaration TYPE emprectyp IS RECORD (empno NUMBER(4), ename emp.ename%TYPE, job emp.job%TYPE); .... --Definition emp_rec emprectyp; 5.8 Cursor-Management Cursor sind Datenstrukturen im Arbeitsspeicher, sie verwalten den Zustand der Abarbeitung einer SQL-Anweisung. Bei INSERT-, UPDATE- und DELETEStatements werden im Cursor lediglich Statusinformationen über den Erfolg einer Operation abgelegt. Bei SELECT-Statements kann ohne einen Cursor nur genau ein Datensatz in die Ergebnisvariablen eingelesen werden. Ein SELECT-Statement, welches keinen oder mehrere Datensätze findet, führt ohne Verwendung eines Cursors zu einem Fehler. Der Cursor beinhaltet bei SELECT-Statements außer den Statusinformationen über ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 69 Erfolg oder Mißerfolg auch Information über den gerade aktuellen Datensatz. Es wird zwischen zwei verschiedenen Cursorn unterschieden. Dem expliziten und dem impliziten Cursor. Der explizite Cursor muß selbst verwaltet werden der implizite Cursor wird ohne Zutun des Anwendungsentwicklers verwaltet. 1. Expliziter Cursor Für die Handhabung eines expliziten Cursors werden 4 Schritte benötigt: • DECLARE Im DECLARE-Statement wird dem Cursor ein Name zugewiesen und das SELECT-Statement angegeben. Input Parameter können deklariert werden, die für das SELECT-Statement dienen. Beispiel: DECLARE v_empno emp.empno%TYPE := 2312; CURSOR curs1(p_emp_no NUMBER) IS SELECT empno, ename,sal FROM emp; WHERE empno = p_empno; satz curs1%ROWTYPE; --Deklaration der Strukturvariable. • OPEN Es wird das SELECT-Statement ausgeführt und der Cursor auf den ersten Datensatz positioniert. Beispiel: OPEN curs1(v_empno); • FETCH Mit dem FETCH-Statement werden die einzelnen Datensätze sequentiell eingelesen. Beispiel: LOOP FETCH curs1 INTO satz; EXIT WHEN curs1%NOTFOUND OR curs1%NOTFOUND IS NULL; END LOOP; • CLOSE Das CLOSE-Statement schließt den Cursor, es können keine weiteren Datensätze gelesen werden, ohne den Cursor erneut zu öffnen. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 70 Beispiel: CLOSE curs1; 2. Impliziter Cursor Bei impliziten Cursorn übernimmt die Datenbank die Verwaltung des Cursors. Bei der Verwendung von impliziten Cursorn muß mittels FOR-Schleife der komplette Cursor abgearbeitet werden. Die Cursor-FOR Schleife: Da der Programmierer nicht auf den impliziten Cursor mit DECLARE, OPEN, FETCH und CLOSE einwirken kann, wird mit einer FOR-Schleife gearbeitet, bei welcher der Cursor automatisch geöffnet, alle Datensätze eingelesen und der Cursor wieder geschlossen wird. Die Daten der Sätze werden als „Felder“ einer Struktur ausgegeben. Beispiel: DECLARE v_empno emp.empno%TYPE := 2312; CURSOR curs1(p_emp_no NUMBER) IS SELECT empno, ename,sal FROM emp; WHERE empno = p_empno; BEGIN FOR emp_rec IN curs1(v_deptno)LOOP ... END LOOP; Die For <record> IN Schleife: Die For <record> IN Schleife arbeitet wie die Cursor_FOR Schleife, ist aber einfacher zu codieren. Beispiel: DECLARE ... v_empno emp.empno%TYPE := 2312; BEGIN FOR emp_rec IN (SELECT empno, ename,sal FROM emp; WHERE empno = n_empno) LOOP ... END LOOP; ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 71 Attribute: Sie erlauben es, die Statusinformationen eines Cursors abzufragen. Es gibt folgende Attribute: • %NOTFOUND %NOTFOUND wird TRUE gesetzt, wenn ein INSERT-, UPDATE- und DELETEStatement auf keinen Datensatz wirkt oder ein SELECT-Statement keinen Satz in der Datenbank findet. Bei SELECT-Statements wird der Exception Handler NO_DATA_FOUND angestoßen, %NOTFOUND kann also nur im Exception Handler geprüft werden. Anstatt %NOTFOUND zu prüfen kann, auch der Exception Handler NO_DATA_FOUND direkt verwendet werden. • %FOUND Ist das Gegenteil von %NOTFOUND und wird TRUE gesetzt, wenn ein DMLStatement auf einen oder mehrere Datensätze wirkt oder ein SELECT-Statement einen Satz in der Datenbank findet. • %ROWCOUNT Liefert die Anzahl betroffener oder gefundener Zeilen eines Statements. Wird bei SELECT INTO mehr als eine Zeile geliefert. Wird die Predefined Exception TOO_MANY_ROWS angestoßen und %ROWCOUNT auf 1 gesetzt. • %ISOPEN Ist TRUE, solange der Cursor geöffnet ist. Bei impliziten Cursorn ist %ISOPEN immer FALSE, da diese automatisch geschlossen werden. Aufruf: Der Aufruf der Attribute erfolgt mit folgenden Schlüsselwörtern: Beim expliziten Cursor mit dem Cursornamen und dem Attribut: cursor_name%FOUND; Beim impliziten Cursor mit SQL und dem gewünschten Attribut: SQL%FOUND; 5.9 Prozeduren und Funktionen Unterprogramme wie Prozeduren und Funktionen können einerseits in PL/SQLBlöcken und andererseits als eigenständige Datenbankobjekte (stored procedures) deklariert werden. Wie bei anderen Programmiersprachen muß die Prozedur oder Funktion zuerst deklariert werden und kann danach aufgerufen werden. Deklaration einer Funktion: Beispiel: FUNCTION gehalt_lesen(l_empno IN BINARY_INTEGER , sal OUT BINARY_INTEGER) RETURN BINARY_INTEGER IS BEGIN ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 72 .... END gehalt_lesen; Syntax: FUNCTION func_name[(argument) [, argument, ...])] RETURN datentyp [Lokale Deklarationen] IS|AS BEGIN Anweisungen [EXCEPTION] Fehlerbehandlung END [func_name]; Deklaration einer Prozedur: PROCEDURE proc_name[(argument) [, argument, ...])] IS|AS [Lokale Deklarationen] BEGIN Anweisungen [EXCEPTION] Fehlerbehandlung END [proc_name]; Aufruf: Beispiel für Funktion: l_retval :=func_name(empno,sal); Beispiel für Prozedur: proc_name(empno,sal); Parametermodi: Die Parameter können als IN , OUT oder IN OUT übergeben werden. IN-Parameter, zur Übergabe von initialisierten Werten an ein Unterprogramm. Innerhalb der Subroutine verhaltet sich ein IN-Parameter wie eine Konstante,der kein Wert zugewiesen werden kann. IN-Parameter können bei der Deklaration mit Defaultwerten vorbesetzt werden. Beispiel: ... , v_empno IN BINARY_INTEGER DEFAULT 22, ... OUT-Parameter liefern die Rückgabewerte an das aufrufende Objekt. Innerhalb der Subroutine wird ein OUT-Parameter wie eine nicht initialisierte Variable behandelt. Vor dem Verlassen sollte dem Parameter ein Wert zugewiesen werden. IN OUT-Parameter übergeben initialisierte Werte an die Subroutine, verhalten sich innerhalb wie initialisierte Variable. Einem IN OUT-Parameter kann zum einen ein Wert zugewiesen werden und zum anderen kann mit dem Inhalt eines IN OUTParameters eine andere Variable initialisiert werden. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 73 5.10 Fehlerbehandlung Die Fehlerbehandlung (Exception Handling) zur Laufzeit in PL/SQL erfolgt mit Hilfe von Exceptions. Beispiel: DECLARE status CHAR(240); ... BEGIN ... EXCEPTION WHEN NO_DATA_FOUND THEN RETURN 0; WHEN OTHERS status := SQLERRM(SQLCODE); RETURN SQLCODE; END; Wichtigen Fehlern ist standardmäßig ein vordefinierter Name (Predefined Exception) zugeordnet. Den übrigen Fehlern kann mit Hilfe der EXCEPTION_INIT ein Name zugewiesen werden. Ansonsten kann der Fehler mit Fehlernummer SQLCODE und Fehlertext SQLERRM ausgegeben werden. Beispiele für Predefined Exceptions sind: NO_DATA_FOUND, NOT_LOGGED_ON, TOO_MANY_ROWS, OTHERS,..... In der Predefined Exception OTHERS werden alle Fehlernummern behandelt, die nicht in einer anderen Predefined Exception behandelt werden. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 74 6 Embedded SQL mit PRO*C 6.1 Allgemeines Die Grundidee von „Embedded SQL“ besagt, daß es möglich sein muß, alle SQLAnweisungen, die interaktiv gültig sind, unverändert in ein Programm zu integrieren. Zu beachten ist aber, daß der Umkehrschluß nicht möglich ist, da Embedded SQL gegenüber dem interaktiven SQL einige Spracherweiterungen aufweist, die zwar innerhalb eines Programms, aber nicht interaktiv zulässig sind. Dazu wird ein Programm geschrieben, das bei PRO*C die Endung .pc erhält. Dieses Programm wird dann von einem PRE-Compiler so übersetzt, daß daraus gültiger C-Code entsteht, der dann ganz normal vom Compiler übersetzt werden kann. Deklarative und ausführbare Anweisungen Man unterscheidet zwei Arten von Anweisungen, ausführbare und deklarative: • Ausführbare Anweisungen werden vom Precompiler in Funktionen und Unterprogramme umgewandelt, die dann verschiedene Werte zurückliefern können, z.B. über die Variable SQLCA. Zu dieser Gruppe zählen alle vom interaktiven SQL her bekannten Anweisungen (Query, DML, DDL, DCL) • Deklarative Anweisungen werden nicht durch den Precompiler in Funktionen umgewandelt und liefern folglich auch keinen Return-Code. Diese Anweisungen dienen u. a. dazu, dem System die benutzten Variablen bekannt zu machen. Beispiele für deklarative Anweisungen: BEGIN DECLARE SECTION END DECLARE SECTION INCLUDE ... WHENEVER ... DECLARE CURSOR ... DECLARE DATABASE ... DECLARE STATEMENT ... DECLARE TABLE ... Alle Anweisungen, seien sie ausführbar oder deklarativ, müssen, um für den Precompiler erkennbar zu sein, mit dem Präfix EXEC SQL begonnen werden. Abschließend muß ein Semikolon folgen. 6.2 Teile eines Pro*C-Programms • Der „Application Prologue“ besteht fast ausschließlich aus deklarativen Anweisungen. Er dient der Vorbereitung und Bereitstellung all dessen, was die im zweiten Teil, dem sogenannten „Application Body“ folgenden Anweisungen benötigen. Es müssen bestimmte Elemente enthalten sein, wie weiter unten noch beschrieben wird. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 75 • Der „Application body“ enthält ausführbare, in der Regel auch zusätzliche deklarative Embedded SQL-Anweisungen. Die ausführbaren Anweisungen beschränken sich nicht auf Abfragen und Anweisungen zur Datenmanipulation. Diese treten in der Praxis zwar am häufigsten auf, aber Anweisungen zur Datendefinition und Datenintegritätskontrolle sind ebenso zulässig und in vielen Fällen sinnvoll. Zwischen diesen Teilen können jederzeit ‘normale’ C-Anweisungen und Funktionen stehen. 6.3 Vorgehensweise bei der Erstellung eines ESQL-Programms Der Ablauf beim Erstellen eines Programms, das in einer Sprache der 3.Generation geschrieben wird, mag sich hinsichtlich der notwendigen Kommandos von Compiler zu Compiler unterscheiden, schließt jedoch immer die folgenden vier Schritte ein: 1. 2. 3. 4. Erstellen der Quelldatei (Editor). Übersetzen des Programms (Compiler). Linken des Programms (Linker). Starten des Programms. Diese vier Schritte bleiben auch notwendig, wenn SQL-Anweisungen in das Programm eingebettet werden. Um die Embedded SQL-Anweisungen in C-Code umzuwandeln, muß vor dem Compilerlauf noch der PRE-Compiler-Lauf eingeschoben werden (Pro*C). Der PRE-Compiler darf nicht verwechselt werden mit dem Präprozessor des C-Compilers! 6.3.1 Grundstruktur eines ESQL-Programms /* Deklaration der in ESQL-verwendeten Variablen */ /* (Declare Section) */ function( ) /* function() = Funktion, die Datenbankzugriff benötigt */ /* (kann z.B.: void main() sein) */ { /* Herstellen einer Datenbankverbindung */ /* Anweisung für Fehlerbehandlung */ /* SQL - Anweisung */ . . . /* Beenden der Datenbankverbindung */ } ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 76 6.4 Der Application Prologue Dem Application Prologue kommt etwa die gleiche Funktion zu, die in einem Programm ohne Embedded-SQL durch den Deklarationsteil übernommen wird: die Vorbereitung und Bereitstellung all dessen was im Anweisungsteil benötigt wird. Im allgemeinen sind dies die folgenden drei Teile: 1. DECLARE-SECTION: Hier werden die Programmvariablen vereinbart. 2. Bereitstellen eines Datenbereichs für die Kommunikation des Datenbankkernels mit dem Programm (SQLCA). 3. Das Anmelden bei der Datenbank. Hier wird lediglich die Syntax dargestellt. Praktische Implementationsbeispiele sehen Sie dann im Übungsteil. 6.4.1 DECLARE - SECTION In der DECLARE-SECTION werden alle Programmvariablen bekanntgemacht, die später in SQL-Anweisungen verwendet werden. Sie beginnt immer mit der Anweisung: EXEC SQL BEGIN DECLARE SECTION; und wird abgeschlossen durch EXEC SQL END DECLARE SECTION; Zwischen diesen beiden Anweisungen dürfen nur Vereinbarungen auftreten. Bei der Wahl der Variablennamen sind einerseits die Einschränkungen durch ORACLE (reservierte Worte), andererseits diejenigen durch den Compiler zu berücksichtigen. Namen von Variablen und Spalten aus Datenbanktabellen dürfen gleich sein, da durch die Syntax eindeutig bezeichnet wird, ob die Spalte oder Variable gemeint ist. Alle Variablen, die in einer SQL-Anweisung benutzt werden sollen, müssen hier vereinbart werden. Trifft der PRE-Compiler auf eine nicht vereinbarte Variable, wird die Fehlermeldung Undeclared host variable a at line b in file c ausgegeben. Ob Variablen, die nicht in SQL- ,sondern ausschließlich in Programmiersprachenanweisungen verwendet werden, innerhalb oder außerhalb der DECLARE SECTION vereinbart werden, bleibt dem Programmierer überlassen. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 77 Die innerhalb der DECLARE SECTION vereinbarten Variablen bezeichnet man auch als HOSTVARIABLEN. Sie dürfen sowohl in SQL-Anweisungen, als auch in der CApplication verwendet werden. Pro Programmeinheit darf es nur eine DECLARE SECTION geben. 6.4.2 Zulässige Datentypen: Es sind alle vordefinierten C-Datentypen erlaubt und werden vom PREcompiler entsprechend unterstützt (selbst Strukturen sind zulässig, sofern die Strukturen innerhalb der Declare Section instanziiert werden). Desweiteren sind einfache Pointer, also solche, bei denen nur eine einmalige Dereferenzierung notwendig ist, erlaubt. Es ist hingegen verboten Namen zu verwenden, die durch typdef’s bekannt gemacht werden, da der PREcompiler diese nicht kennen kann, da sie erst vom Compiler ausgewertet werden. EXEC SQL BEGIN DECLARE SECTION; . . . . . EXEC SQL END DECLARE SECTION; Datentyp char char[n] int float double VARCHAR[n] char[9] Beschreibung einzelnes Zeichen Zeichenkette n Zeichen integer (number) Gleitkomma-Zahl, einfach (number) Gleitkomma-Zahl, doppelt (number) Zeichenkette mit variabler Länge (Oracle-Datentyp) date 6.4.3 Strings variabler Länge Strings variabler Länge spielen bei der Kommunikation mit ORACLE, sowie bei der Programmierung von User Exits eine große Rolle. Da C standardmäßig keinen geeigneten Datentyp für Strings mit variabler Länge hat, macht dies ORACLE, welches durch den PREcompiler den zusätzlichen Datentyp VARCHAR zur Verfügung stellt. Dabei handelt es sich um eine Verbindung eines Strings (fester Länge) und einem ganzzahligen Wert, der die Länge des Strings angibt. Dies wird abgebildet durch einen struct, mit den Komponenten char arr[zahl] und short len. Die Angabe zahl gibt an, wieviele Zeichen der String maximal haben darf. In der Komponente len wird angegeben, wieviele Zeichen der String tatsächlich enthält. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 78 Wie VARCHAR-Variablen bearbeitet werden, ist abhängig vom Ort ihres Auftretens: in SQL-Anweisungen werden sie als Einheit angesprochen, während in Programmiersprachen-Anweisungen nur auf die Komponenten Bezug genommen werden kann. Wird die Variable von ORACLE beschrieben und vom Programm gelesen, so trägt ORACLE den String und die Länge ein. Wird sie dagegen vom Programm beschrieben , so ist der Programmierer auch dafür verantwortlich, die Längenangabe einzutragen. • Vereinbarung von VARCHAR innerhalb des PRO*C-Programms: EXEC SQL BEGIN DECLARE SECTION; VARCHAR username[20]; VARCHAR password[20]; EXEC SQL END DECLARE SECTION; • Der Precompiler nimmt folgende Umsetzung vor: struct { unsigned short len; unsigned char arr[20]; } username; struct { unsigned short len; unsigned char arr[20]; } password; Der Precompiler akzeptiert auch die Deklaration der Form: VARCHAR username[20],password[20]; 6.5 Die Vereinbarung der SQLCA zur Fehlerbehandlung Für die Kommunikation zwischen dem Datenbanksystem und der Applikation, die nicht den Datentransfer, sondern die Informationen über Erfolg und Mißerfolg einer Aktion enthalten, ist ein spezieller Datenbereich, die sogenannte SQL Communications Area (SQLCA), vorgesehen. Diese muß durch ein geeignetes Statement eingebunden werden. Dies geschieht durch das Statement: EXEC SQL INCLUDE sqlca; ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 79 6.6 Die CONNECT - Anweisung Bevor auf Daten zugegriffen werden kann, muß das Programm eine Verbindung zur Datenbank aufbauen. Dies geschieht durch die CONNECT - Anweisung in der Form EXEC SQL CONNECT :username IDENTIFIED BY :password oder EXEC SQL CONNECT :userid wobei im zweiten Fall die userid als username/password angegeben werden muß. Username, password und userid müssen Variablen sein (keine Konstanten). Das Einlesen der Variablen geschieht erst im Programmteil (Application Body), wodurch sich der Application Prologue in diesen hinein erstreckt. Zudem ist die CONNECT-Anweisung selbst keine deklarative sondern eine ausführbare Anweisung. Allerdings beginnt mit Ihr keine Transaktion. Eine Disconnect - Anweisung existiert nicht. Die Auflösung der Verbindung erfolgt durch COMMIT/ROLLBACK WORK RELEASE. Dazu wird nach dem Ausführen einer Transaktion der Commit-Befehl ausgeführt oder beim Fehlerfall ein Rollback durchgeführt: EXEC SQL ROLLBACK WORK RELEASE EXEC SQL COMMIT WORK RELEASE abschließen -- Transaction zurückrollen -- Transaction Beispiel für CONNECT: /* HOSTVARIABLEN */ . . . VARCHAR password[20]; VARCHAR username[20]; . . . strcpy(username.arr,“SCOTT“); username.len=strlen(username.arr); strcpy(password.arr,“TIGER“); password.len=strlen(password.arr); EXEC SQL CONNECT :username IDINTIFIED BY :password; . . . ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 80 6.7 Der Application Body Der Application Body enthält die Anweisungen zur Abfrage, Manipulation, Definition und Kontrolle von Daten der Datenbank. Sämtliche SQL-Anweisungen die interaktiv möglich sind, sind auch hier erlaubt. Allerdings sind zur Bearbeitung von Queries einige Syntax-Erweiterungen gegenüber dem interaktiven SQL notwendig. In der DECLARE SECTION vereinbarte Variablen können in den SQL-Anweisungen und in der C-Application verwendet werden. In SQL-Anweisungen müssen sie, um sie von Spaltennamen zu unterscheiden, durch einen vorangestellten Doppelpunkt gekennzeichnet werden. EXEC SQL BEGINN DECLARE SECTION REAL INCR EXEC SQL END DECLARE SECTION ... /********************************************************/ /* Die folgende SQL-Anweisung addiert bei allen */ /* Angestellten, deren Gehalt (SAL) kleiner als */ /* 2000 ist, den Wert INCR hinzu. */ /********************************************************/ EXEC SQL UPDATE EMP SET SAL = SAL + :INCR -- SAL WHERE SAL < 2000 -- :INCR kennzeichnet eine Spalte kennzeichnet eine Variable 6.7.1 Kennzeichnung von Kommentaren Seit der Version 1.3 des PRO*C PRE-Compilers ist es möglich, SQL-Anweisungen durch Kommentare zu unterbrechen. Ein solcher dem ANSI-Standard entsprechender Kommentar wird mit einem doppelten Bindestrich eingeleitet und erstreckt sich bis zum Zeilenende. Sie können an der oben stehenden SQLAnweisung sehen, wie dies aussieht. Es ist desweiteren auch möglich, die in C übliche Schreibweise für Kommentare zu verwenden. C++ Kommentare („//“) dürfen jedoch nicht verwendet werden. 6.8 Einbetten von Queries Die Ergebnisse einer interaktiv eingegebenen SELECT-Anweisung werden direkt auf den Bildschirm ausgegeben. Ebenso werden die Ergebnisse einer SELECTAnweisung, die in ein Programm eingebettet wurde, an das Programm übergeben und müssen dort übernommen werden. Welche Schritte der Programmierer unternehmen muß, um dieser Anforderung zu genügen, hängt davon ab, ob das Ergebnis lediglich aus einem Datensatz besteht (Single Row Select) oder aus mehreren (Multiple Row Select). ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 81 6.8.1 Single Row Select Ist es sichergestellt, daß die Abfrage nur einen Datensatz als Ergebnis liefern kann, so genügt es, die SELECT-Anweisung durch die gegenüber dem interaktiven SQL zusätzliche INTO-Klausel zu erweitern. Diese enthält die Variablen, die die Ergebniswerte aufnehmen sollen: EXEC SQL SELECT NAME INTO :nachname FROM Student WHERE MATR_NR = :mat_nr; Die Spalten der SELECT-Klausel und die Variablen in der INTO-Klausel müssen hinsichtlich der Anzahl und der Reihenfolge übereinstimmen. Es ist nicht möglich, mehr oder weniger Variablen anzugeben. Alle Variablen müssen in der DECLARE SECTION bekannt gemacht worden sein. 6.8.2 Multiple Row Select Besteht das Ergebnis einer Query aus mehreren Datensätzen, so genügt der im vorigen Abschnitt dargestellte Mechanismus nicht mehr, da es mehr Ergebniswerte gibt, als Variablen, die sie aufnehmen. Um dieses Problem zu umgehen muß mit einem sogenannten CURSOR gearbeitet werden. Das heißt, daß die Ergebnisdaten quasi in einer temporären Tabelle abgelegt werden, wo sie dann sequentiell ausgelesen werden können. Der CURSOR ist sozusagen ein Zeiger, der jeweils auf die nächste Reihe der Ergebnisse zeigt. Mit einer FETCH-Anweisung wird der Cursor auf die nächsten Datensatz bewegt. Die Bearbeitung einer solchen SELECT-Anweisung geschieht in folgenden vier Schritten: Schritt 1: CURSOR DEKLARIEREN EXEC SQL DECLARE abfrage CURSOR FOR SELECT NAME,VORNAME FROM Student WHERE GESCHLECHT = :sex Der Cursor muß auf diese Weise deklariert worden sein, bevor er in irgendeiner anderen Anweisung auftreten darf. Ist er einmal deklariert, so ist er von da an im gesamten Programm bekannt. Jedoch müssen alle Anweisungen, die sich auf ihn beziehen, sich in der gleichen Precompiler-Einheit befinden wie die DECLAREAnweisung, da der Cursor sonst dem Pre-Compiler nicht bekannt ist. Schritt 2: ÖFFNEN DES CURSORS EXEC SQL OPEN abfrage Bei dieser Anweisung wird das SELECT-Statement ausgeführt und der Cursor auf den ersten Datensatz positioniert. Allerdings wird hier noch kein Ergebnis an das Programm übergeben. Nachdem der Cursor einmal geöffnet wurde, bewirkt eine Veränderung im Datenbestand der Datenbank keine Veränderung der ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 82 Ergebnismenge des Cursors mehr. Um dies zu erreichen, müßte der Cursor wieder neu geöffnet werden. Schritt 3: FETCH (einlesen) der Datensätze EXEC SQL FETCH abfrage INTO :nachname,:vorname; Die erste FETCH-Anweisung liefert den ersten Datensatz, jede weitere den jeweils nächsten. Explizites Positionieren des Cursors innerhalb der Ergebnismenge ist nicht nötig - aber auch nicht möglich. Das bedeutet, daß man die einzelnen Datensätze nur sequentiell vorwärts lesen kann, aber nicht rückwärts. Um einen bereits gelesenen Datensatz noch einmal zu lesen, muß der Cursor neu geöffnet und von Anfang an gelesen werden. Beachten Sie aber bitte, daß beim erneuten öffnen eines Cursors sich in der Ergebnismenge eine zwischenzeitliche Veränderung des Datenbestandes der Datenbank niederschlägt. Da die Anzahl der ermittelten Datensätze in der Regel nicht bekannt ist, muß bei der Bearbeitung eine Schleife mit Abbruchbedingung verwendet werden. Diese Bedingung ist dadurch gegeben, daß ORACLE, wenn kein oder kein weiterer Datensatz vorhanden ist, in eine Komponente der SQLCA (SQLCA.SQLCODE) den WERT +1403 einträgt. Dies kann in zweifacher Weise ausgenutzt werden: 1. SQLCODE wird in der Schleife direkt abgefragt do { EXEC SQL FETCH abfrage INTO :nachname,:vorname; if (sqlca.sqlcode == 1403) break; } while (TRUE); 2. Verwenden der WHENEVER-Anweisung exec sql whenever not found goto weiter; do { EXEC SQL FETCH abfrage INTO :nachname,:vorname; } while (TRUE); weiter: /* weiter Anweisungen */ Schritt 4: Schließen des Cursors EXEC SQL CLOSE abfrage Nach dem Schließen des Cursors können keine weiteren Datensätze mehr übertragen werden. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 83 6.8.3 Die INSERT-Anweisung Die INSERT-Anweisung hat im embedded SQL folgende Syntax EXEC SQL INSERT INTO (Fach_Nr,Fach_Bez) VALUES (:f_nr,:f_name); wobei Fach_nr und Fach_Bez die Tabellenspalten bezeichnen, und f_nr und f_name die Variablen, die den einzufügenden Datensatz beinhalten. Ansonsten kennen Sie den Befehl ja vom interaktiven SQL. 6.8.4 Die DELETE-Anweisung Äquivalent sieht auch die DELETE-Anweisung aus EXEC SQL DELETE FROM Student WHERE MATR_NR = :mat_nr; wobei Student die Tabelle bezeichnet und mat_nr eine Variable für die WHEREKLAUSEL. Wie im interaktiven Betrieb auch, können auch hier über die WHEREKlausel mehrere Datensätze selektiert und gelöscht werden. 6.8.5 Die UPDATE-Anweisung Auch hier ist die Anweisung im Prinzip gleich aufgebaut EXEC SQL UPDATE Student SET Fachbereich = :fb, Sem = :sem WHERE MATR_NR = :mat_nr Selbstverständlich ist es auch hier möglich, dieselben Aktionen durchzuführen wie im interaktiven Betrieb. 6.9 Arbeiten mit VARCHAR Wie VARCHAR-Variablen bearbeitet werden, ist abhängig vom Ort ihres Auftretens: in SQL-Anweisungen werden sie als Einheit angesprochen während in Programmiersprachen-Anweisungen nur auf die Komponenten Bezug genommen werden kann. Ein kleines Beispiel dazu ist der gesamte Kontext zum CONNECT mit der Datenbank. exec sql begin declare section; VARCHAR username[20],password[20]; exec sql end declare section; printf („\n\nORACLE-Username: „); gets (username.arr); username.len = strlen (username.arr); printf („\n\nOracle-Password: „); gets (password.arr); ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 84 password.len = strlen (password.arr); exec sql connect :username identified by :password; Wird die Variable von ORACLE beschrieben und vom Programm gelesen, so trägt ORACLE den String und die Länge ein. Vor einer Weiterverarbeitung mit CStringverarbeitungsfunktionen muß das Stringende durch Anhängen des Stringterminators (ASCII 0) gekennzeichnet werden. Achtung: Länge der VARCHARVariable um 1 größer dimensionieren als die maximale Stringlänge! Wird die Variable vom Programm beschrieben , so ist der Programmierer auch dafür verantwortlich, die Längenangabe einzutragen. 6.10 Strukturen Seit der Version Pro*C 2.0 ist es möglich, Strukturen innerhalb einer Abfrage direkt mit ihrem Namen anzusprechen. Beispiel 1: struct { int emp_no; float salary; char emp_name [10]; char emp_job [10]; } emp_record; ... ... EXEC SQL SELECT empno, sal, ename, job FROM emp INTO :emp_record WHERE mgr IS NULL; Beispiel 2: Es ist auch möglich, auf einzelne Elemente einer Struktur zuzugreifen. struct { int emp_no; float salary; char emp_name [10]; char emp_job [10]; } emp_record; ... ... EXEC SQL SELECT ename, sal FROM emp INTO :emp_record.emp_name, :emp_record.salary WHERE mgr IS NULL; Nach wie vor ist es aber nicht möglich, auf ein array of structures oder nested host structures zuzugreifen ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 85 6.11 Indikatorvariablen Indikatorvariablen sind eine Neuerung, die seit der Oracle Version 7.0 gibt. Diese Variablen ermöglichen es, bei einer Abfrage NULL-Values und gekürzte Zeichenketten zu erkennen. Des weiteren können sie zum expliziten einfügen von NULL-Values bei INSERT- oder UPDATE-Anweisungen genutzt werden. Indikatorvariablen sind vom Typ „short“. Die Syntax lautet: <programmvariable>:<indikatorvariable> oder <programmvariable> INDICATOR :<indikatorvariable> Auch hier kann mit Strukturen gearbeitet werden. Beispiel: Abfrage mit Indikatorvariablen struct { int emp_no; float salary; char emp_name [10]; char emp_job [10]; } emp_record; struct { short i_emp_no; short i_salary; short i_emp_name; short i_emp_job; } i_emp_record; ... ... EXEC FROM INTO WHERE SQL SELECT ename, sal emp :emp_record.emp_name:i_emp_record.i_emp_name, :emp_record.salary:i_emp_record.i_salary mgr IS NULL; Nach der Ausführung der Anweisung kann der Inhalt der Indikatorvariablen abgefragt werden: =0: Fehlerfreie Übertragung. -1: Inhalt der Programmvariablen undefiniert -> Übertragung brachte einen NULLValue. >0: Ein String wurde bei der Übertragung gekürzt. Der Wert der Indikatorvariablen gibt die ursprüngliche Länge an. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 86 Anmerkung: Die Übertragung von NULL-Values in Programmvariable, denen keine Indikatorvariable zugeordnet sind, erzeugt einen Laufzeitfehler (ORA-1405). Beispiel: Explizites Schreiben eines NULL-Values float salary; short i_salary = -1; ... ... i_salary = -1; EXEC SET SQL UPDATE emp sal = :salary:i_salary; 6.12 Der Outer Join Der Outer Join dient zur zusätzlichen Abfrage all jener Zeilen, die keine direkte Entsprechung in der anderen Tabelle haben. Zu der Tabelle, die für die Abfrage spezifiziert wurde, wird ein zusätzlicher NULL-Datensatz hinzugefügt, bei welchem das Schlüsselfeld mit dem in der Abfrage spezifiziertem Wert gefüllt wird. Die Tabelle wird spezifiziert, indem das Zeichen (+) zu dem bzw. den Spaltennamen hinzugefügt wird. Die mit (+) bezeichnete Tabelle wird um eine zusätzliche NULLZeile (all null row) ergänzt. Diese Nullzeile wird dann in der Ergebnistabelle zu allen bisherigen ungültigen (irrelevanten) Zeilen der anderen Tabelle des Joins hinzugefügt. 1. Beispiel: Der Outer Join sorgt dafür, daß alle Abteilungen ausgegeben werden, auch die, in welchen keine Angestellten beschäftigt sind. SELECT FROM INTO WHERE name, abteilungsname, abteilungsnr, abteilungsort angestellte, abteilung :emp_name, :dept, :dept_no, :loc abteilung.abteilungsnr = angestellte.abteilungsnr(+); 2. Beispiel: Der Outer Join kann auch auf mehrere Bedingungen in einer Abfrage angewandt werden, auch die, in welchen keine Angestellten beschäftigt sind. SELECT name, abteilungsname, abteilungsnr, abteilungsort, firmenname angestellte, abteilung, firma :emp_name, :dept, :dept_no, :loc, :firm abteilung.abteilungsnr = angestellte.abteilungsnr(+) firma.abteilungsnr = angestellte.abteilungsnr(+); FROM INTO WHERE AND 6.13 Fehleranalyse und -behandlung An dieser Stelle sollen nur die wichtigsten Anweisungen der Fehlerbehandlung aufgeführt werden, wie sie für den Einstieg in die embedded SQL Programmierung notwendig sind. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 87 EXEC SQL WHENEVER <BEDINGUNG> <REAKTION>; Bedingung: SQLWARNING SQLERROR NOT FOUND Reaktionen: CONTINUE STOP GOTO marke DO function z.B. EXEC SQL WHENEVER NOT FOUND GOTO ende; EXEC SQL WHENEVER SQLERROR GOTO FEHLER; 6.14 Zusammenfassung Anhand der Übungsaufgaben und Musterlösungen können Sie einige praktische Vorgehensweisen und Ansätze selbst erforschen. Nach dem Sie sich die ersten Beispiele angeschaut und verinnerlicht haben, sollten Sie versuchen, die Aufgaben auch selbständig ohne die Zuhilfenahme der Musterlösung zu bearbeiten. Mit ein wenig Praxis lassen sich hier schnell die größten Probleme angehen und lösen. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 88 7 Aufgaben zum Datenbank-Seminar 7.1 Aufgaben zum ERM − Ausgangspunkt sei die folgende Problembeschreibung: An einer Fachhochschule gibt es viele verschiedene Fachbereiche. Jeder Fachbereich bietet einen Studiengang an. In diesen sind Studenten eingeschrieben. Sie besuchen Vorlesungen ihres jeweiligen Semesters, die von den Professoren des Fachbereichs gehalten werden. Die Professoren können außerdem noch Funktionen wie Dekan oder Praktikantenamtsleiter im Fachbereich übernehmen. Dieselbe Vorlesungen kann von Studenten mehrerer Fachbereiche besucht werden. Sie hat jedoch nur eine eindeutige Fachnummer. Außerdem haben sie eine definierte Wochenstundenzahl und natürlich einen Namen. Die Fachbereiche werden durch einen eindeutigen Namen identifiziert, zu dem es ein ebenso eindeutiges Kürzel gibt. Studenten wie Professoren haben Name und Vorname. Professoren haben ein Gehalt, Studenten dafür ihre Matrikelnummer. Jeder Student ist in einem bestimmten Semester. Erstellen Sie ein ERM. 7.2 Aufgaben zum Relationalen Modell − Konvertierung in ein relationales Modell Wandeln Sie das obige ERM in ein relationales Modell um. Achten sie dabei auf Link-Attribute und komplexe Beziehungen. • Identifizieren sie für jede Relation die möglichen Candidate-Keys und wählen sie daraus einen Primärschlüssel. Kennzeichnen Sie Primär- und Fremdschlüssel in ihrem Modell. ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 89 7.3 Aufgabe zur Normalisierung a) Überprüfen Sie, ob ihr Relationales Modell die ersten drei Normalformen erfüllt, und arbeiten Sie ggf. nach. b) Normalisieren sie untenstehende Vorgabe Softwarehaus: Programmierer Maier Buchberg Maier Schäfer Buchberg Derderlad Preis 500.10.500.1000.0.10599.- Projekt FiBu AAV AAV FiBu AAV FiBu Hersteller Kleinweich GNU Kleinweich Bohrhand UniMex Delphi-Soft Tool WirfWeg 6.0 Reh++ WirfWeg 6.0 Zeh++ Kharaz Orakel for NULL Deadline 31.12.95 31.07.95 31.07.96 31.12.95 31.07.96 31.12.95 Kunde Stadt ES Immens Immens Stadt ES Immens Stadt ES 7.4 Aufgaben zu SQL*PLUS Das Datenmodell wird folgendermaßen erzeugt: CREATE TABLE fachbereich (kuerzel VARCHAR (3), name VARCHAR (30), budget INT) CREATE TABLE Person (id int, name VARCHAR (30), vorname VARCHAR (30) ) CREATE TABLE Professor (persnr INT, id INT, gehalt INT, kuerzel VARCHAR (3), d_bz varchar(1), pal_bz varchar(1)) CREATE TABLE Student (matr_nr INT, semester INT, kuerzel varchar(3), id int) CREATE TABLE Vorlesung ( fach_nr INT, persnr INT, name VARCHAR(40), sws INT) CREATE TABLE stud_vorl (fach_nr INT, matr_nr INT) CREATE TABLE Fb_Vorl (kuerzel VARCHAR (3), fach_nr INT, semester INT) CREATE TABLE Fachbereich (kuerzel VARCHAR(3), name VARCHAR(30), budget INT) ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 90 1. Machen Sie sich einen Überblick über die vorhandenen Tabellen. 2. Korrigieren Sie Ihre persönlichen Angaben in den Tabellen Person und Student. 3. Tragen Sie sich in Tabelle Stud_Vorl mindestens in 2 Vorlesungen ein. 4. Führen Sie Abfragen durch um die folgenden Informationen zu erhalten: 4.1 Liste der Studenten mit Vor- und Nachnamen sowie Matrikelnummer. Die Liste soll alphabetisch sortiert sein. 4.2 Liste der Namen von Studenten mit dazugehörigem Fachbereich alphabetisch nach Namen sortiert. 4.3 Liste aller Studenten mit dazugehörigen Vorlesungen. 4.4 Liste aller Studenten, die Vorlesungen eines Professors mit Personalnummer 1000 besuchen. 4.5 Liste der Vor- und Nachnamen von Studenten, deren Matrikelnummer zwischen 400002 und 400006 liegt. 4.6 Liste aller Personen dessen Nachnamen mit „W“ beginnt. 5 Löschen Sie den Studenten mit der Matrikelnummer 666666 aus der Datenbank. Auf welche Tabellen müssen Sie zugreifen? 7.5 Aufgaben zu Embedded SQL Lösen Sie die in „Aufgaben in SQL*PLUS“ gestellten Fragen 4.1 bis 4.6 mi t Hilfe von Embedded SQL. Hinweise zum Einloggen (Aufgabe 6.4 und 6.5) 1. 2. 3. 4. 5. 6. Lokales login ( z.B. rhds01,nthx01,nthx02,...) rlogin rshx01.rz -l xxxxxx login bitte beim Kursdozenten nachfragen Password: yyyyyy Passwort bitte beim Kursdozenten nachfragen Oracle 7 - User: stud[1..10] Oracle 7 - Password: st[1..10] Ausführen: start [Name] Verzeichnisse unter: ~/DB_Kurs/stud[1..10] ~/DB_Kurs/create ( *.sql - Dateien) ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 91 8 Lösungen 8.1 Lösung zum ERM Name Person Gehalt Semester Professor ist eingeschrieben bei 1 Vorname 2 Matrikel Nummer Student hält 3 besucht bietet an Fachbereich Vorlesung 1: ist Dekan 2: ist Prakt.Amt.L Name 3: gehört zu Kürzel Studiengang Name Semester FachNr Wochenstunden Fachhochschule ist überflüssig, da nur einmal vorhanden. Studiengang und Fachbereich bezeichnen praktisch dasselbe. Erweiterungen: Es gibt auch Dozenten und Lehrbeauftragte. Neben Vorlesungen existieren darüberhinaus noch Labors. Sie finden, ebenso wie Vorlesungen in Räumen statt. Die Laborräumen werden von Meistern betreut. Wie könnte man StuPo´s, Prüfungsanmeldung und Notenspiegel im Modell unterbringen? Lösungshinweise: Lehrbeauftragter und Professor werden vom Dozent abgeleitet. Der Dozent ist eine Person, die Veranstaltungen hält. Eine Vorlesung und ein Labor sind Veranstaltungen. Eine Veranstaltung findet in einem Raum statt. Das kann eine Aula oder ein Laborraum sein. Der Laborraum wird von einem Meister betreut. Er ist eine Person die zum Fachbereich gehört. Ein Fachbereich hat mehrere StuPos. In ihnen tauchen die Veranstaltungen mit einer Gewichtung für das Diplomzeugnis auf. Ein Student studiert nach einer dieser StuPos und meldet sich für Veranstaltungen zur Prüfung an. Die entsprechende Beziehung enthält einen Zähler für die Versuche, die Note und ggf. einen Status (angemeldet, bestanden, durchgefallen). 8.2 Lösung zum Relationalen Modell ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 92 <kuerzel,name,budget> <persnr,gehalt,id#,kuerzel#,d_bz,p_bz> 1,n gehört zu 1,1 ist Dekan Professor 1,1 ist Prakt. 0,1 1,1 1,1 0,1 0,1 1,1 Fachbereich 1,1 <id,name,vorname> 1,1 hat hält Person 1,1 0,1 Student 1, n 1, n 1,1 Stud_Vorl 1, n 1, n <Matrnr,kuerzel#,id#,semester> <matrnr#,fachnr#> 1,1 1, n Vorlesung <fachnr,persnr#,kuerzel#, name,sws,semester> ist eingeschrieben 8.3 Lösung zur Normalisierung Programmierer Name bearbeitet Name Name Tool Projekt wird verwendet Hersteller Preis Deadline Kunde Programmierer Persnr Name ... Maier ... Buchberg ... Schäfer ... Derderlad ... Projekt ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 93 Name Deadline Kunde AAV 31.07.96 Stadt ES FiBu 31.12.95 Immens Prog Proj Prog persnr# Proj Name# ... FiBu ... AAV ... AAV ... FiBu ... Derderlad Tool Name Hersteller Preis Wirfweg 6.0 Kleinweich 500 Reh++ GNU 10 Zeh++ Bohrhand 1000 Kharaz UniMex 0 Orakel for NULL Delphi-Soft 10599 Tool Projekt Tool name# Projekt name# Wirfweg 6.0 FiBu Reh++ AAV Wirfweg 6.0 AAV Zeh++ FiBu Kharaz AAV Orakel for NULL FiBu ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 94 8.4 Lösungen zu SQL*PLUS 1 DESCRIBE <Tabelle> 2 UPDATE <Tabelle> SET <Spalte> = <Wert> WHERE <Bedingung>; 3 INSERT INTO stud_vorl VALUES (<Wert1> , <Wert2>..); 4.1 SELECT Name, Vorname, Matr_nr FROM Person,Student WHERE Person.id = Student.id ORDER BY Name; 4.2 SELECT Person.Name, fachbereich.name FROM Person,Fachbereich,Student WHERE Student.id = Person.id AND Fachbereich.kuerzel = Student.kuerzel ORDER BY Person.name; 4.3 SELECT vorlesung.Name, student.matr_nr FROM Vorlesung,Student,Stud_vorl WHERE Student.Matr_nr = Stud_vorl.Matr_nr AND Stud_Vorl.fach_nr = Vorlesung.fach_nr ORDER BY Vorlesung.name; 4.4 SELECT Person.Name, Vorlesung.Name, Vorlesung.Persnr FROM Person, Student, Stud_Vorl, Vorlesung WHERE Person.id = Student.id AND Student.Matr_nr = Stud_Vorl.Matr_Nr AND Stud_Vorl.Fach_Nr = Vorlesung.Fach_Nr AND Vorlesung.Persnr = 1000; 4.5 SELECt Person.Name, Person.Vorname, Student.Matr_nr FROM Person,Student WHERE Student.Matr_nr BETWEEN 400002 and 400006 AND Student.id = Person.id; 4.6 SELECT Name,Vorname FROM Person WHERE Name LIKE 'W%'; 5. DELETE from Person,Student WHERE Student.matr_nr = 666666 AND Student.id = Person.id AND Student.matr = Stud_vorl.matr_nr; ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 95 8.5 Lösungen Embedded SQL Aufgabe 1 / Lösung SQL*PLUS 4.1 in Embedded SQL #include <stdio.h> #include <string.h> EXEC SQL BEGIN DECLARE SECTION; int Matr_nr; VARCHAR Name[25]; VARCHAR Vorname[25]; VARCHAR username[20]; VARCHAR password[20]; EXEC SQL END DECLARE SECTION; EXEC SQL INCLUDE sqlca; main() { strcpy(username.arr,"stud1"); username.len=strlen(username.arr); strcpy(password.arr,"st1"); password.len=strlen(password.arr); EXEC SQL CONNECT :username IDENTIFIED BY :password; printf("\n in SQL eingeloggt"); /* CURSOR DECLARIEREN */ EXEC SQL DECLARE abfrage CURSOR FOR SELECT Name,Vorname,Matr_nr from Person,Student WHERE Person.id = Student.id order by Name; EXEC SQL OPEN abfrage; EXEC SQL WHENEVER NOT FOUND GOTO raus; while (1) /* (sqlca.sqlcode == 0) */ { EXEC SQL FETCH abfrage INTO :Name,:Vorname,:Matr_nr; { Name.arr[Name.len]='\0'; Vorname.arr[Vorname.len]=’\0’; printf ("\nNAME: %30s | Vorname: %30s | Matr._Nr. %d",Name.arr,Vorname.arr,Matr_nr); } } raus: EXEC SQL CLOSE abfrage; printf("\n\n"); EXEC SQL COMMIT WORK RELEASE; } ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 96 Aufgabe 2 / Lösung SQL*PLUS 4.2 in Embedded SQL #include <stdio.h> #include <string.h> EXEC SQL BEGIN DECLARE SECTION; VARCHAR Person_name[25]; VARCHAR Fachbereich_name[25]; VARCHAR username[20]; VARCHAR password[20]; EXEC SQL END DECLARE SECTION; EXEC SQL INCLUDE sqlca; main() { strcpy(username.arr,"stud1"); username.len=strlen(username.arr); strcpy(password.arr,"st1"); password.len=strlen(password.arr); EXEC SQL CONNECT :username IDENTIFIED BY :password; printf("\n in SQL eingeloggt"); /* CURSOR DECLARIEREN */ EXEC SQL DECLARE abfrage CURSOR FOR select Person.Name, fachbereich.name from Person,Fachbereich,Student where Student.id = Person.id and Fachbereich.kuerzel = Student.kuerzel order by Person.name; EXEC SQL OPEN abfrage; EXEC SQL WHENEVER NOT FOUND GOTO raus; while (1) /* (sqlca.sqlcode == 0) */ { EXEC SQL FETCH abfrage INTO :Person_name,:Fachbereich_name; { Fachbereich_name.arr[Fachbereich_name.len]='\0'; Person_name.arr[Person_name.len]=’\0’; printf ("\nPerson: %30s | Fachbereich: %30s ",Person_name.arr,Fachbereich_name.arr); } } raus: EXEC SQL CLOSE abfrage; printf("\n\n"); EXEC SQL COMMIT WORK RELEASE; } ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 97 Aufgabe 3 / Lösung SQL*PLUS 4.3 in Embedded SQL #include <stdio.h> #include <string.h> EXEC SQL BEGIN DECLARE SECTION; int Matr_nr; VARCHAR Vorlesung_name[25]; VARCHAR username[20]; VARCHAR password[20]; EXEC SQL END DECLARE SECTION; EXEC SQL INCLUDE sqlca; main() { strcpy(username.arr,"stud1"); username.len=strlen(username.arr); strcpy(password.arr,"st1"); password.len=strlen(password.arr); EXEC SQL CONNECT :username IDENTIFIED BY :password; printf("\n in SQL eingeloggt"); /* CURSOR DECLARIEREN */ EXEC SQL DECLARE abfrage CURSOR FOR select vorlesung.Name, student.matr_nr from Vorlesung,Student,Stud_vorl where Student.Matr_nr = Stud_vorl.Matr_nr and Stud_Vorl.fach_nr = Vorlesung.fach_nr order by Vorlesung.name; EXEC SQL OPEN abfrage; EXEC SQL WHENEVER NOT FOUND GOTO raus; while (1) /* (sqlca.sqlcode == 0) */ { EXEC SQL FETCH abfrage INTO :Vorlesung_name,:Matr_nr; { Vorlesung_name.arr[Vorlesung_name.len]='\0'; printf ("\nVorlesung: %30s | Matrikelnummer: %d ,Vorlesung_name.arr,Matr_nr); } } raus: EXEC SQL CLOSE abfrage; printf("\n\n"); EXEC SQL COMMIT WORK RELEASE; } ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 98 Aufgabe 4 / Lösung SQL*PLUS 4.4 in Embedded SQL #include <stdio.h> #include <string.h> EXEC SQL BEGIN DECLARE SECTION; int Persnr; VARCHAR Person_name[25]; VARCHAR Vorlesung_name[25]; VARCHAR username[20]; VARCHAR password[20]; EXEC SQL END DECLARE SECTION; EXEC SQL INCLUDE sqlca; main() { strcpy(username.arr,"stud1"); username.len=strlen(username.arr); strcpy(password.arr,"st1"); password.len=strlen(password.arr); EXEC SQL CONNECT :username IDENTIFIED BY :password; printf("\n in SQL eingeloggt"); /* CURSOR DECLARIEREN */ EXEC SQL DECLARE abfrage CURSOR FOR Select Person.Name, Vorlesung.Name, Vorlesung.Persnr from Person, Student, Stud_Vorl, Vorlesung where Person.id = Student.id and Student.Matr_nr = Stud_Vorl.Matr_Nr and Stud_Vorl.Fach_Nr = Vorlesung.Fach_Nr and Vorlesung.Persnr = 1000; EXEC SQL OPEN abfrage; EXEC SQL WHENEVER NOT FOUND GOTO raus; while (1) /* (sqlca.sqlcode == 0) */ { EXEC SQL FETCH abfrage INTO :Person_name,:Vorlesung_name,:Persnr; { Vorlesung_name.arr[Vorlesung_name.len]='\0'; Person_name.arr[Person_name.len]='\0'; printf ("\nName: %30s| Vorlesung: %s | Persnr: %d ",Person_name.arr,Vorlesung_name.arr,Persnr); } } raus: EXEC SQL CLOSE abfrage; printf("\n\n"); EXEC SQL COMMIT WORK RELEASE; ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 99 } Aufgabe 5 / Lösung SQL*PLUS 4.5 in Embedded SQL #include <stdio.h> #include <string.h> EXEC SQL BEGIN DECLARE SECTION; int Matr_nr; VARCHAR Person_name[25]; VARCHAR Person_Vorname[25]; VARCHAR username[20]; VARCHAR password[20]; EXEC SQL END DECLARE SECTION; EXEC SQL INCLUDE sqlca; main() { strcpy(username.arr,"stud1"); username.len=strlen(username.arr); strcpy(password.arr,"st1"); password.len=strlen(password.arr); EXEC SQL CONNECT :username IDENTIFIED BY :password; printf("\n in SQL eingeloggt"); /* CURSOR DECLARIEREN */ EXEC SQL DECLARE abfrage CURSOR FOR select Person.Name, Person.Vorname,student.matr_nr from Person,Student where Student.Matr_nr between 400002 and 400006 and Student.id = Person.id; EXEC SQL OPEN abfrage; EXEC SQL WHENEVER NOT FOUND GOTO raus; while (1) /* (sqlca.sqlcode == 0) */ { EXEC SQL FETCH abfrage INTO :Person_name,:Person_Vorname,:Matr_nr; { Person_name.arr[Person_name.len]='\0'; Person_Vorname.arr[Person_Vorname.len]='\0'; printf ("\nName: %30s | Vorname: %30s | Matrikelnummer: %d ",Person_name.arr,Person_Vorname.arr,Matr_nr); } } raus: EXEC SQL CLOSE abfrage; printf("\n\n"); ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 100 EXEC SQL COMMIT WORK RELEASE; } Aufgabe 6 / Lösung SQL*PLUS 4.6 in Embedded SQL #include <stdio.h> #include <string.h> EXEC SQL BEGIN DECLARE SECTION; VARCHAR Name[25]; VARCHAR Vorname[25]; VARCHAR username[20]; VARCHAR password[20]; EXEC SQL END DECLARE SECTION; EXEC SQL INCLUDE sqlca; main() { strcpy(username.arr,"stud1"); username.len=strlen(username.arr); strcpy(password.arr,"st1"); password.len=strlen(password.arr); EXEC SQL CONNECT :username IDENTIFIED BY :password; printf("\n in SQL eingeloggt"); /* CURSOR DECLARIEREN */ EXEC SQL DECLARE abfrage CURSOR FOR select Name,Vorname from Person where Name like 'W%'; EXEC SQL OPEN abfrage; EXEC SQL WHENEVER NOT FOUND GOTO raus; while (1) /* (sqlca.sqlcode == 0) */ { EXEC SQL FETCH abfrage INTO :Name,:Vorname; { Name.arr[Name.len]='\0'; Vorname.arr[Vorname.len]='\0'; printf ("\nName: %30s | Vorname: %30s ",Name.arr,Vorname.arr); } } raus: EXEC SQL CLOSE abfrage; printf("\n\n"); EXEC SQL COMMIT WORK RELEASE; } ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll 101 9 Literaturhinweise zum Entity Relationship und Relationalen Datenmodell: [Alber] Jörg Alber, Datenbankkomponente im Projekt VVA Diplomarbeit im Fachbereich NT, WS94 [Sauer] Sauer, Relationale Datenbanken [Letters] Letters, Vorlesungsmanuskript Datenmodellierung FB WI im WS94 zum Kapitel SQL: [1] [2] [3] [4] [5] [6] Finkenzeller/Kracke/Unterstein, 'Systematischer Einsatz von SQL-Oracle', ddsion-Wesley 1989. Sauer, 'Relationale Datenbanken', Addsion-Wesley 1991. Wilke, 'Oracle Datenbankmanagement professionell' 2.Aufl., Addison-Wesley 1991. Oracle Deutschland GmbH, 'Professioneller Einstieg in SQL und Oracle', Müchen 1994. Misgeld, 'Oracle für Profis', Hanser, München, Wien 1991. Letters, 'Daten-Modellierung', IBL, Echterdingen 1995 ────────────────────────────────────────────────────────────── STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK ESSLINGEN Datenbank-Seminar für Diplomanden V 1.7 20.05.1997 Goll