next up previous contents
Next: Implementierung Up: EmbeddedSQL Previous: Operationen

Beispiele

In den folgenden Beispielen wollen wir eine kleine Adreßdatenbank aufbauen (das vollständige Programm ist im Anhang gif zu finden). Dafür definieren wir uns den Datentyp Address.

 nnnnnnnn¯ 
TYPE

Address = RECORD

firstName, lastName, street: ARRAY 32 OF CHAR;

town: ARRAY 20 OF CHAR;

zipCode: INTEGER

END ;

VAR

conn: EmbeddedSQL.Connection;

stat: EmbeddedSQL.Statement;

BEGIN

conn := EmbeddedSQL.Open(source, user, password);

stat := conn.Prepare("CREATE TABLE Addresses FOR Address");

stat.Execute();

END

Nach dem Öffnen der Verbindung erstellen wir eine Tabelle für die Adressen, die wir später einfügen wollen. Die Tabelle besteht aus genau sovielen Spalten, wie ein Record vom Typ Address Felder hat (mit entsprechenden Typen). Der Rekordtyp kann mit dem Modulnamen qualifiziert sein, in dem der Rekordtyp deklariert ist.

Um in die Tabelle Daten einzufügen, bereiten wir eine INSERT-Anweisung vor, in der wir die Variablen angeben, die die einzufügenden Werte enthalten. Diesen Variablen ist ein Doppelpunkt vorangestellt, um sie von Bezeichnern, die innerhalb der Datenbank verwendet werden, zu unterscheiden. Danach weisen wir den Variablen entweder Werte zu oder lassen sie Nullwerte enthalten. Schlußendlich führen wir die Anweisung aus, wobei die Werte der Variablen in die Datenbank transferiert werden. Eine Anweisung kann mit verschiedenen Variablenwerten mehrmals ausgeführt werden.

 nnnnnnnn¯ 
PROCEDURE  Insert;

VAR adr: Address;

BEGIN

In.Open;

stat := conn.Prepare("INSERT INTO Addresses values (:adr)");

REPEAT

In.String(adr.firstName); In.String(adr.lastName); In.String(adr.street);

In.String(adr.town); In.Int(adr.zipCode);

IF adr.street = "NULL" THEN stat.SetNull("adr.street") END ;

IF In.Done THEN stat.Execute() END

UNTIL ~In.Done

END Insert;

Um eine Liste aller Adressen einer Person zu erhalten, kann man die folgende SELECT-Anweisung ausführen. Der Eingabevariablen (in diesem Fall name) weisen wir vor der Ausführung den gewünschten Wert zu und führen die SQL-Anweisung nach der Vorbereitung aus. Weil die Tabelle Addresses für Records vom Typ Address erstellt wurde, hat eine Ergebniszeile genau in einem solchen Record Platz. Wenn uns nur die Vor- und Nachnamen interessieren, könnten wir eine SELECT-Anweisung der Art "`SELECT firstName, lastName FROM Persons WHERE age >= :minAge INTO :person.firstName, :person.lastName"' ausführen.

 nnnnnnnn¯ 
PROCEDURE  ListByName*;

VAR adr: Address; name: ARRAY 32 OF CHAR;

BEGIN

In.Open; In.String(name);

IF In.Done THEN

stat := conn.Prepare("SELECT * FROM Addresses WHERE lastName = :name

INTO :adr");

stat.Execute();

WHILE stat.Fetch() DO

Out.String(adr.firstName); Out.Char(" "); Out.String(adr.lastName); Out.String(", ");

IF ~stat.IsNull("adr.street") THEN Out.String(adr.street) END ; Out.String(", ");

Out.Int(adr.zipCode, 0); Out.Char(" "); Out.String(adr.town); Out.Ln

END

END

END ListByName;



next up previous contents
Next: Implementierung Up: EmbeddedSQL Previous: Operationen



Christoph Steindl
Thu Jul 24 14:37:19 MET DST 1997