In den folgenden Beispielen wollen wir eine kleine Adreßdatenbank aufbauen (das vollständige Programm ist im Anhang zu finden). Dafür definieren wir uns den Datentyp Address.
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(
stat.Execute();
END
nnnnnnnn¯
TYPE
"
CREATE TABLE Addresses FOR Address"
);
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.
VAR adr: Address;
BEGIN
In.Open;
stat := conn.Prepare(
REPEAT
In.String(adr.firstName); In.String(adr.lastName); In.String(adr.street);
In.String(adr.town); In.Int(adr.zipCode);
IF adr.street =
IF In.Done THEN stat.Execute() END
UNTIL
END Insert;
nnnnnnnn¯
PROCEDURE Insert;
"
INSERT INTO Addresses values (:adr)"
);
"
NULL"
THEN stat.SetNull("
adr.street"
) END ;
~
In.Done
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.
VAR adr: Address; name: ARRAY 32 OF CHAR;
BEGIN
In.Open; In.String(name);
IF In.Done THEN
stat := conn.Prepare(
INTO :adr
stat.Execute();
WHILE stat.Fetch() DO
Out.String(adr.firstName); Out.Char(
IF ~stat.IsNull(
Out.Int(adr.zipCode, 0); Out.Char(
END
END
END ListByName;
nnnnnnnn¯
PROCEDURE ListByName*;
"
SELECT * FROM Addresses WHERE lastName = :name
"
);
" "
); Out.String(adr.lastName); Out.String(", ");
"
adr.street") THEN Out.String(adr.street) END ; Out.String(", ");
" "
); Out.String(adr.town); Out.Ln