P8000/WEGA/contrib/ingres/dbs/sys/man/amxi

798 lines
33 KiB
Plaintext

AMX(DABA) DABA16 AMX(DABA)
NAME
amx - Einbettung der Datenmanipulationssprache AMX in "C"
BESCHREIBUNG
Einleitung
Die Sprache AMX stellt ein Interface zur Einbettung von Da-
tenbankzugriffen in "C"-Programme dar und ist leicht erlern-
bar.
Es werden eine Laufzeitbibliothek, i.allg. .../lib/libamx.a,
und DABA-MUTOS-Kommandos (i.allg. amx(mutos)) bereitge-
stellt. Durch ein solches Kommando (z.B. amx) werden bei
entsprechend spezifizierten Optionen (Flags) ein DABA-
Praecompiler fuer AMX und der C-Compiler "cc" (einschliess-
lich Linker) aufgerufen. Der Praecompiler erzeugt ein guel-
tiges C-Programm, das mit dem C-Compiler uebersetzt wird.
Anschliessend werden die fuer die Datenbankaktionen notwen-
digen Objektmoduln aus der Laufzeitbibliothek eingebunden.
In AMX-Programmen ist das parallele Arbeiten mehrerer Nutzer
in den gleichen Relationen unterstuetzt.
Die Vorteile bei der Benutzung dieser AMX-Sprache bestehen
in der Moeglichkeit der Realisierung laufzeiteffektiver Pro-
gramme, in der Formulierbarkeit von Transaktionen und in ei-
ner rekursiven Anwendbarkeit. Letzteres bedeutet, dass z.B.
Wiederfinden und Aendern geschachtelt benutzbar sind. Aus-
serdem sind prozedurale Probleme, z.B. die totale
Mengenbedarfsermittlung (totale Stuecklistenaufloesung),
elegant loesbar.
Alle (auch temporaere) Relationen (einschliesslich aller da-
tenbankspezifischen Namen), die in AMX-Programmen verarbei-
tet werden sollen, muessen zur Uebersetzungszeit bereits
existieren. Das bedeutet, dass sie vorher mit IQL, EQL oder
"creater" (creater(mutos)) erstellt werden muessen.
Mit AMX-Programmen manipulierte Relationen sind mit IQL, EQL
oder auch AMX weiterhin bearbeitbar.
Uebersicht
Alle tupelorientierten AMX-Anweisungen sind ausschliesslich
auf eine einzige Relation anwendbar.
Die Sprache AMX hat als maechtigste Operation das Bereit-
stellen von Werten spezifizierter Domaenen aus einer u.U.
selektierten Tupelmenge einer Relation (Wiederfinden) (re-
trieve).
Die Recherche (Wiederfinden) kann alle Daten der Relation
umfassen oder durch Selektionsbedingungen (Qualifiktionen)
eingeschraenkt werden.
In einer retrieve-Anweisung kann eine Qualifikation und muss
eine Auswahl spezifizierter oder aller Domaenen als
target_list (Ergebnis- oder Zielliste) angegeben werden.
Eine solche Ergebnisliste besitzen ausser der retrieve nur
die append und die replace Anweisung.
Nach einer erfolgreichen Recherche, die eine Tupelmenge
(mindestens ein Tupel) bereitstellt, wird fuer jedes dieser
Tupel eine Aktion ausgefuehrt.
Die anderen tupelorientierten AMX-Anweisungen beziehen sich
immer nur auf ein Tupel.
Es sind das Ersetzen der Werte der Domaenen eines Tupels
(Ersetzen) (replace), das Loeschen eines Tupels (Loeschen)
(delete), das Anzeigen eines Tupels (print) bzw. das Erzeu-
gen eines neuen Tupels (Zufuegen zu einer Relation) (ap-
pend), aus der Menge vorher mit "retrieve" selektierter Tu-
pel, moeglich.
Des weiteren ist das Zufuegen eines neuen Tupels zur Rela-
tion ohne vorherige Selektion nutzbar (append).
Es gibt weiterhin AMX-Anweisungen fuer das Eroeffnen einer
spezifizierten Datenbank entweder mit exklusiver (alleini-
ger) Benutzung (daba oder exclusive), ohne Sperrung oder mit
geteilter Benutzung (shared) sowie fuer das Eroeffnen (open)
bzw. das Schliessen (close) einer Relation.
Sollen in einem AMX-Programm miteinander in logischer Bezie-
hung stehende Datenmanipulationen (i.allg. in mehreren Rela-
tionen) ausgefuehrt werden, ist es zur Erhaltung der Date-
nintegritaet erforderlich, Transaktionen zu formulieren.
Eine Transaktion ist eine Folge von AMX-Anweisungen als lo-
gische Arbeitseinheit. Es gibt jeweils eine Anweisung zur
Spezifikation des Transaktionsbeginns (use), des Transak-
tionsendes (commit), sowie des Abbrechens einer Transaktion
und das Ruecksetzen (abort) und fuer das Behandeln einer
Verklemmung (if (deadlock)).
Bei Transaktionsbeginn sind die beteiligten Relationen und
die Art ihrer Benutzung (alleinig (exclusive), geteilt
(shared) oder ohne Sperrung (nolock)) spezifizierbar. Aus-
serdem ist u.a. das Sperrniveau (Seitensperrung (page) oder
Relationssperrung (table)) angebbar.
Des weiteren sind Anweisungen zur vorzeitigen Beendigung
eine Wiederfindungszyklusses (endretrieve), zur vorzeitigen
Beendigung einer Tupelverarbeitung im Wiederfindungszyklus
(nextretrieve), zum Bereitstellen der Gesamt-Tupelanzahl ei-
ner Relation (tuplecount) sowie der maximalen Tupellaenge
der Relation (tuplelength), und eine Leeranweisung (;) ver-
fuegbar.
Neben den durch "C" bereitgestellten und von AMX unter-
stuetzten Datentypen short (2), int (2 bei 16 Bit- und 4 bei
32-Bit Rechnern), long(4) , float(4), double(8), char * und
char [] (1-255) sind durch AMX zusaetzlich die mit den
DABA-Datentypen uebereinstimmenden Typen
i1, i2, i4, f4, und f8
verfuegbar.
Einschraenkungen
Die Geschwindigkeit der AMX-Zugriffe erfordert einige Ein-
schraenkungen. AMX gestattet Datenveraenderungen und Wie-
derfinden ausschliesslich in Basis-Nutzerrelationen (nicht
in Sichten!). Das Wiederfinden in Index-Nutzerrelationen
wird unterstuetzt. Die Katalogrelationen sind, entsprechend
definierte Befugnisse vorausgesetzt, lesbar.
Da nur die in einem AMX-Programm konkret benoetigten Zu-
griffsroutinen eingebunden werden, sind keine Universallo-
esungen, z.B. universelle Druckprogramme, realisierbar.
Aus dem Dargelegten ergibt sich ebenfalls, dass die Nutzer-
relationen nicht mit AMX erstellt werden koennen. Bevor ein
AMX-Programm uebersetzt werden kann, muessen die in diesem
Programm spezifizierten Relationen bereits mit IQL, EQL oder
dem DABA-MUTOS-Kommandos "creater" (creater(mutos)) erstellt
worden sein.
Da nur die in einem AMX-Programm benoetigten Zugriffsrouti-
nen zu den Relationen, entsprechend den konkreten Bedingun-
gen, zugriffsoptimiert in das ausfuehrbare Programm einge-
bunden werden, ist nach jeder Modifikation der Relations-
struktur (modify(ql), modifyr(mutos), index(ql) bzw.
indexr(mutos), destroy(ql) bzw. destroyr(mutos) und crea-
te(ql) bzw. creater(mutos), eine Neuuebersetzung des AMX-
Programmes notwendig!
Eine Relation, die durch ein AMX-Programm verarbeitet werden
soll, darf keine definierten Integritaetsbedingungen besit-
zen! Als Befugnisse einer solchen Relation duerfen aus-
schliesslich operationelle Befugnisse (append, retrieve, de-
lete, replace oder all) ohne jede Qualifikation definiert
worden sein!
Werden mehrere Objektmodule zu einem ausfuehrbaren Programm
verbunden, darf nur einer dieser Objektmodule AMX-
Anweisungen enthalten!
Konvertierungen zwischen numerischen und Zeichenkettenwerten
(und umgekehrt) werden nicht unterstuetzt. Numerische Kon-
vertierungen erfolgen ohne Unter- bzw. Ueberlaufkontrolle.
Vergleiche von Zeichenkettenwerten zwischen Domaenen und Va-
riablen werden in der Laenge der Domaene ausgefuehrt, z.B.
liefert der Variablenwert "Automat" den Wert "Auto" fuer die
Datenbankaktion, wenn die zugehoerige Domaene den DABA-
Datentyp "c4" hat.
Uebersetzung
AMX-Anweisungen, im Anwendungsprogramm durch ein besonde-
res Praefixsymbol "##" gekennzeichnet, werden durch den
Voruebersetzer (Praeprozessor) syntaktisch und semantisch
ueberprueft und in Prozeduraufrufe der hoeheren Programm-
iersprache uebersetzt. Vorbild fuer diesen Loesungsansatz
war EQL des DABA.
"C"-Anweisungen werden unveraendert in das "C"-Programm ko-
piert.
Damit ein AMX-Quellprogramm vom AMX-Compiler verarbeitet
werden kann, muss das File, in dem es enthalten ist, den
File-Namenssuffix ".x" (z.B. prog.x) besitzen.
Der AMX-Compiler holt sich alle Informationen zu den Rela-
tionen und Domaenen aus den Systemkatalogen (Katalogrelatio-
nen) der Datenbank und entlastet somit den Anwender von der
Angabe dieser Details und den Fehlern, die an dieser Stelle
gemacht werden koennen. Durch diesen Ansatz ist eine weit-
gehende Quelltextunabhaengigkeit von der Struktur der Daten-
bank gesichert.
Bei der Zugriffspfadoptimierung werden die vorhandenen In-
dizes voll herangezogen. Wenn der AMX-Programmierer es for-
dert, ist eine davon abweichende Zugriffsgestaltung spezifi-
zierbar.
Aenderungen sind nur in Nutzerrelationen gestattet, die Sy-
stemkataloge und Indizes werden durch AMX aktualisiert.
Eine Aenderung der Speicherungsstruktur einer Relation er-
fordert, wie bereits betont, keine Aenderung des AMX-
Quellprogramms, wohl aber dessen neue Uebersetzung.
Wenn der AMX-Compiler ein AMX-Programm uebersetzen soll, ar-
beitet dieser als Nutzer "daba". Damit das erzeugte "C"-
Programm in das aktuelle Arbeits-Directory geschrieben wer-
den kann, muss deshalb "daba" in diesem Directory die
Schreiberlaubnis besitzen.
Die Spezifikation des AMX-Quell-Files erfolgt, wie ueblich,
entweder als absoluter Pfadname oder relativ zum aktuellen
Arbeit-Directory.
Das durch den AMX-Compiler erzeugte AMX-Programm besitzt den
Filemodus oktal "6755" und ist dem Nutzer daba und der Grup-
pe daba zugeordnet. Es ist z.B. beim Kopieren eines AMX-
Programmes darauf zu achten, dass dieser Filemodus erhalten
bleibt.
Zur Fehlererkennung beimm Compilieren ist folgendes zu be-
merken. Nach Erkennung eines Fehlers wird die Uebersetzung
erst nach drei als richtig erkannten syntaktischen Einheiten
(Token, Morpheme) fortgesetzt, sodass eine zweite Ueberset-
zung Fehler erzeugen kann, die in der ersten nicht gemeldet
wurden. Die zu jedem Fehler mit ausgegebene Zeilennummer ist
nicht immer exakt. Sie kann sich auf eine der vorherigen
Zeilen beziehen, wenn der Fehler am Zeilenende erkannt wur-
de, da der Compiler immer eine syntaktische Einheit voraus
liest.
Wird ein Fehler festgestellt, ist in dem oben genannten Fall
der Zeilenzaehler aber schon um eins (oder mehr, bei Zeilen
ohne syntaktische Einheiten) hochgezaehlt. Bei einigen syn-
taktischen Fehler ist eine Angabe der Fehlerursache aeus-
serst schwierig.
Aufgrund der einfachen Syntax von AMX wurde auf eine detail-
lierte Fehlererkennung verzichtet und der Anwender muss den
erzeugten Fehler
"syntax error"
selbst deuten.
Namenskonventionen
Fuer Datenbankbegriffe (ql(iql)) und auch bezueglich der
Grenzwerte gelten die gleichen Bedingungen wie in den an-
deren DABA-Interfaces. Es sei nochmals daran erinnert, dass
die Namen der Systemrelationen:
"relation" Verwaltung der Relationen
"attribute" Verwaltung der Domaenen
"indexes" Verwaltung der Indizes
"integrities" Verwaltung der definierten Integritaeten
"protect" Verwaltung der vergebenen Zugriffsrechte
"tree" Verwaltung der voruebersetzten Datenbank-
aktionen
"references" Verwaltung von Beziehungen zwischen
Relationen
als Namen von Nutzerrelationen gesperrt sind.
Alle Namen (Datenbank, Relationen, Domaenen) sind maximal 12
Zeichen lang und bestehen aus den Zeichen "[a-z_0-9]", wobei
der Name nicht mit einer Ziffer "[0-9]" beginnen darf (siehe
ql(iql)). Der AMX-Compiler konvertiert bei Namen grosse
Buchstaben "[A-Z]" automatisch in kleine "[a-z]".
Durch die Laufzeitbibliothek werden eine Reihe von Objekten
definiert, die alle mit "AA" beginnen. Der Anwendungspro-
grammierer hat zu gewaehrleisten, dass diese Objekte nicht
ueberdefiniert werden. Er sollte Namen, die mit "AA" begin-
nen, generell vermeiden.
AMX-Programm
Jedes AMX-Programm besteht aus "C"-Anweisungen und eingebet-
teten AMX-Anweisungen, die vom AMX-Praeprozessor verarbeitet
werden.
Alle AMX-Anweisungen sind durch das AMX-Kommandopraefix, das
aus zwei Nummernzeichen "##" am Zeilenanfang gebildet wird,
gekennzeichnet.
"C"-Variablen, die in AMX-Anweisungen verwendet werden, sind
ebenfalls durch "##" zu kennzeichnen.
Wie bereits dargelegt, sind die "C"-Variablentypen und zu-
saetzlich "i1", "i2", "i4", "f4" und "f8" verfuegbar.
Alle Variablen sind global zu deklarieren!
Die erste Anweisung im AMX-Quellprogramm muss eine der An-
weisungen zum Eroeffnen der Datenbank (exclusive, daba, no-
lock oder shared) sein.
Die erste auszufuehrende Funktion, anstelle von "main", muss
die Funktion "amx" sein. Fuer diese Funktion sind die glei-
chen Parameter wie bei "main" spezifizierbar (amx() ohne Pa-
rameter).
Jede Relation muss vor ihrer Verwendung eroeffnet und kann
nach Beendigung der Verarbeitung geschlossen werden. Durch
die MUTOS Funktion "exit" werden alle noch eroeffneten Rela-
tionen geschlossen, nachdem die entsprechenden noch ausste-
henden Ausgaben erfolgt sind.
Zur Bildung syntaktischer Konstruktionen werden zur Darstel-
lung einer Auswahl oder Wiederholung die folgenden Metasym-
bole verwendet:
| : Alternative.
[ ] : wahlweiser Ausdruck, kann entfallen.
{ } : mindestens einmalige Wiederholung,
mehrere Elemente werden durch ein Komma "," getrennt.
Als syntaktische Variable werden u.a. die folgenden verwen-
det:
dbname = Datenbankname
c_code = C-Anweisung
c_decl = Deklaration einer C-Variablen
relname = Relationsname
c_var = C-Variablenname
domname = Domaenenname bzw. Domaenennummer
const = int-Konstante | long-Konstante
| double-Konstante | "string"-Konstante
Sprachbeschreibung
Das Folgende ist eine Beschreibung der allgemeinen Syntax
der Sprache AMX und der syntaktischen Klassen aus denen die
Teile der AMX-Anweisungen gebildet werden. Die einzelnen
Anweisungen werden ebenfalls hier erlaeutert.
Kennzeichnung der AMX-Anweisungen
Alle AMX-Anweisungen beginnen mit "##" am Zeilenanfang. Nur
diese Anweisungen werden im folgenden behandelt. Alle an-
deren Anweisungen sind "C"-Anweisungen die den Regeln des
"C"-Compilers unterliegen.
Die erste AMX-Anweisung im Programm
Die erste AMX-Anweisung in einem AMX-Programm muss das Ero-
effnen einer Datenbank sein.
Ist keine Sperrung der Datenbank vorgesehen, ist die Anwei-
sung:
## nolock [ flags ] dbname [ with deadlock ]
zu verwenden.
Soll eine Datenbank alleinig benutzt werden, sind die Anwei-
sungen:
## daba [ flags ] dbname [ with deadlock ]
oder
## exclusive [ flags ] dbname [ with deadlock ]
zu benutzen.
Bei geteilter Nutzung ist:
## shared [ flags ] dbname [ with deadlock ]
zu verwenden.
Die wahlweisen Flags haben folgende Bedeutung:
-uname Erlaubt es, sich als Nutzer mit dem Login-Namen
name auszugeben. Das AMX-Programm arbeitet dann
mit den Datenbankbefugnissen des entsprechenden
Nutzers. Nur der DBA und der DABA-
Systemverantwortliche duerfen dieses Flag benut-
zen.
+bufno Ist die Spezifikation zusaetzlich verfuegbaren
DABA-Puffer. Normalerweise werden nur insgesamt
drei Puffer bereitgestellt. Bei paralleler Arbeit
mit mehreren Relationen (Indexrelationen muessen
mit gezaehlt werden!), sollte jeder Relation
mindestens ein Puffer zugeordnet werden. Empfeh-
lenswert sind zwei Puffer pro Relation.
Die Spezifikation with deadlock bedeutet, dass Deadlocks
(Totsperren) auftreten koennen, die der Nutzer selbst abfan-
gen will.
Kommentar
Kommentare sind innerhalb von AMX-Anweisungen in der C-
ueblichen Notation zugelassen und duerfen nicht geschachtelt
werden:
## . . . /* Kommentar */ . . .
Deklaration von C-Variablen
"C"-Variable, die in einer AMX-Anweisung verwendet werden
sollen, sind unbedingt durch "##" zu kennzeichnen. Folgende
"C"-Typen werden unterstuetzt:
- short
- int
- long
- float
- double
- char *
- char []
Ausserdem sind die DABA-Typen i1, i2, i4, f4 und f8 zugelas-
sen.
Folgende Speicherklassen werden unterstuetzt:
- auto
- extern
- static
Relationseroeffnung
Die Anweisung:
## open relation
eroeffnet die Relation relname fuer die weitere Verarbei-
tung.
Die Relation relname muss eine Primaer- bzw. Basisrelation
sein, d.h. es ist nicht moeglich, explizit eine Indexrela-
tion zu eroeffnen.
Durch die open Anweisung werden automatisch alle zur Rela-
tion gehoerigen Indizes miteroeffnet.
Die Relation relname darf keine Sicht (View) sein, und es
duerfen keine Integritaetsbedingungen bzw. nur operationelle
Befugnisse (append, replace, retrieve, delete oder all) ohne
jede Qualifikation auf ihr definiert sein. Die Systemkata-
loge relation , attribute und indexes werden durch den Start
eines AMX-Programms automatisch eroeffnet. Sie duerfen vom
Nutzer nicht explizit eroeffnet werden.
Recherchen sind auf alle Relationen zugelassen, d.h. auf
Basis-, Indexrelationen und Katalogen.
Aenderungen und Einfuegungen sind nur auf Basisrelationen
zulaessig, fuer die das Programm die Aenderungsbefugnis (de-
lete, append, replace) hat.
## close relname
Die close Anweisung schliesst die Relation relname fuer die
weitere Verarbeitung. Es koennen nur Relationen geschlossen
werden, die zuvor durch die open Anweisung eroeffnet wurden.
Die Beendigung eines Programms ( exit ) schliesst automati-
sch alle eroeffneten Relationen und Kataloge.
## tuplecount relname c_var
Die tuplecount-Anweisung weist der C-Variable c_var als Wert
die Anzahl der Tupel der Relation relname zu. C_var muss
von numerischem Typ und als long (oder besser i4 ) definiert
worden sein.
## tuplelength relname c_var
Die tuplelength-Anweisung weist der C-Variablen c_var als
Wert die Laenge eines Tupels zu und sollte als short ( oder
besser als i2 ) definiert sein.
Die Anzahl der Tupel einer Relation und ihre Laenge sind die
einzigen verfuegbaren variablen Kataloginformationen fuer
ein AMX-Programm. Auf Umwegen kann so die Anzahl der Aende-
rungen in einer Relation bestimmt werden:
. . .
## long old, new;
. . .
## tuplecount rel old
{ Neueinfuegungen }
## tuplecount rel new
printf("# of updates", new - old);
. . .
Ergebnisliste
In der retrieve, der replace und der append Anweisung kann
eine Domaenenauswahl in Form einer target_list (Ergebnis-
oder Zielliste) spezifiziert werden.
Die target_list ist eine durch Kommas separierte Liste von
Domaenenzuordnungen (dom_assign). Sie muss in runde Klam-
mern eingeschlossen werden und mindestens eine Domaenenspe-
zifikation enthalten.
Eine Domaenenzuordnung der Ergebnisliste besteht aus:
$domname = value.
Sie weist der Domaene domname den Wert value zu. Dabei
kennzeichnet das Dollar-Zeichen $ den Domaenennamen.
Als domname kann auch eine Domaenennummer ( attid des attri-
bute Kataloges) spezifiziert werden.
Bei den Zuweisungen von numerischen zu numerischen Typen
werden die notwendigen Konvertierungen ohne Ueberlauf- bzw.
Unterlaufkontrolle vorgenommen.
Zuweisungen von numerischen zu Zeichenkettenwerten und um-
gekehrt sind nicht zulaessig.
Durch die explizite Kennzeichnung von Domaenennamen durch
das Zeichen "$" werden im Gegensatz zu EQL Konflikte mit dem
Namen von C-Variablen vermieden.
Die Referenzierung von Domaenen ueber ihre interne Nummer
(Reihenfolge vom create(ql)) kann sinnvoll bei einer vekto-
risierten Verarbeitung sein.
Ein Wert value kann der aktuelle Wert der C-Variablen c_var,
eine in C uebliche Konstante const oder eine Domaenenzuord-
nung sein. Ein Wert kann der aktuelle Wert der Domaene (Do-
maenenzuordnung) (gekennzeichnet durch das Dollarzeichen)
$domname sein. Diese Form des Wertes kann nur im Aktions-
teil der Recherche angegeben werden und setzt eine ueber-
geordnete retrieve Anweisung voraus, aus dem der Wert fuer
die Domaene domname geholt werden kann.
Die retrieve-Anweisung
## [ over over_relname ] retrieve ret_relname [ qual ] [ (
target_list ) ]
Die retrieve Anweisung zur Recherche ist die maechtigste
AMX-Anweisung, sie uebernimmt die Zugriffspfadoptimierung
und ermoeglicht eine rekursive Verarbeitung, da innerhalb
einer Recherche eine weitere Recherche aufgerufen werden
kann.
Die over Klausel gestattet die Zuweisung des Zugriffspfades
ueber die Relation over_relname fuer die Recherche und damit
die Ausschaltung der Zugriffspfadoptimierung im AMX-
Compiler.
Over_relname muss die wiederzufindende Relation selbst oder
ein Index von ret_relname sein. Ist over_relname ein Index
und wird durch die Selektion qual keinem Schluessel von
over_relname ein Wert zugewiesen, wird der Zugriffspfad ue-
ber die Primaerrelation rel_relname gewaehlt, da eine Re-
cherche ueber die gesamte Relation und ueber einen Index un-
sinning ist.
Die retrieve Klausel ( retrieve ret_relname ) adressiert die
zu suchende Relation ret_relname.
Qualifikation
Die Recherche kann durch eine Qualifikation qual als Spezi-
fikation einer Selektion eingeschraenkt werden, wodurch die
relevanten Tupel selektiert werden.
Die Selektion ist eine Einschraenkung des Wertebereichs ein-
zelner (oder aller) Domaenen.
Mehrere Einschraenkungen werden durch "and" getrennt.
Eine Qualifikation qual hat maximal zwei Klausel pro Doma-
enenname. Eine Klausel besteht aus einer Domaenenspezifika-
tion (einem Domaenennamen domname, gekennzeichnet durch ein
Dollarzeichen "$" davor), einem Vergleichsoperator und einem
Wert value. Domname gibt die einzuschraenkende Domaene und
value den Wert der Einschraenkung an. Fuer die Spezifika-
tion von value gilt das in "Ergebnisliste" dargelegte.
Es sind die Vergleichsoperatoren:
"=", "==", "<", "<=", ">", ">=", "!="
zulaessig.
Wird eine Domaene doppelt eingeschraenkt, sind folgende zu-
laessige Kombinationen zu beachten:
"<[=]" und ">[=]"
"<[=]" und "!="
">[=]" und "!="
Die Reihenfolge der Einschraenkungen fuer eine Domaene ist
in folgender Art einzuhalten:
"<[=]" --> ">[=]" --> "!="
Alle zugewiesenen Bedingungen und Werte der angebenen Ein-
schraenkungen werden beim Einlauf in die Recherche gekel-
lert, sodass z.B. eine Aenderung des Wertes einer verwende-
ten C-Variablen keinen Einfluss auf die Selektion hat.
Ergebnisliste der retrieve-Anweisung
Die Ergebnisliste ( target_list ) zur Spezifikation der Do-
maenenauswahl (Projektionsoperation des DBBS) ist wahlweise.
Aktion
Die Aktion, die bei jedem gefundenen Tupel duchlaufen werden
soll, ist durch den Einschluss der ##{ und der ##} Anweisun-
gen, die unmittelbar der ## retrieve Anweisung folgen soll-
ten, zu spezifizieren. Zwischen diesen Anweisungen koennen
beliebige AMX-Anweisungen und C-Anweisungen stehen. Die Ak-
tion kann leer sein, allerdings muessen die Klammern ange-
geben sein.
Es ist wichtig zu wissen, dass innerhalb der Aktion die Do-
maenenwerte des gefundenen Tupel immer vorhanden sind und
sich nicht aendern.
Eine Aktion fuer ein Tupel kann vorzeitig beendet werden.
Es ist moeglich, durch die Anweisung
## nextretrieve
zur Verabeitung des naechsten Tupels ueberzugehen oder durch
## endretrieve
die Aktion (Recherche) zu beenden.
Variablenzuweisung
Eine Zuweisung weist der C-Variablen c_var den aktuellen
Wert der Domaene domname zu.
c_var = $domname
Bei den Zuweisungen von numerischen zu numerischen Typen
werden die notwendigen Konvertierungen ohne Ueberlauf-
bzw. Unterlaufkontrolle vorgenommen.
Zuweisungen von numerischen zu Zeichenkettenwerten und um-
gekehrt sind nicht zulaessig.
Die print-Anweisung
## print ([{ domname }])
Die print-Anweisung gibt die Werte der, durch eine oeffnende
"(" und eine schliessende runde Klammer ")", begrenzten Li-
ste der Domaenen in einem Standardformat nach Standardoutput
aus.
Die Liste enthaelt eine durch Kommas "," getrennte Aufza-
ehlung der auszugebenden Domaenen. Eine leere Liste "()"
gibt die Werte aller Domaenen aus.
Das Standardformat enthaelt den Namen und den Wert der Doma-
ene in folgender Form:
"%12s: %?\n", domname, value
? == Format der auszugebenden Domaene
Die delete-Anweisung
## delete
Eine delete-Anweisung loescht das innerhalb der laufenden
Recherche gefundene aktuelle Tupel aus der Relation. In-
nerhalb der Aktion bleibt das aktuelle Tupel mit seinen Wer-
ten erhalten.
Eventuell vorhandene Indizes werden automatisch aktuali-
siert.
Die replace-Anweisung
## replace (target_list)
Die replace Anweisung gestattet die Aenderung von Werten
einzelner (oder aller) Domaenen eines wiedergefundenen Tu-
pels.
Eine Unterscheidung von Schluessel- und Nichtschluesseldoma-
enen ist nicht zu beachten.
Die Aenderungen werden durch die Projektions target_list
spezifiziert.
Es ist zu beachten, dass die Aenderungen in einem gesonder-
tem Puffer ausgefuehrt werden, das aktuell gefundene Tupel
also innerhalb der Aktion unveraendert bleibt.
Eventuell vorhandene Indizes werden, falls noetig, auto-
matisch aktualisiert. Eine Aktualsierung entfaellt z.B.,
wenn eine identische Aenderung (geaendertes == Ursprungstu-
pel) ausgefuehrt wurde oder wenn die geaenderten Domaenen
nicht Bestandteil des Index sind und sich die Tupeladresse
TID nicht geaendert hat.
Die append-Anweisung
## append [ relname ] (target-list)
Die append Anweisung mit der Spezifikation relname fuegt ein
neues Tupel in die Relation relname ein. Die nicht in der
target_list spezifizierten Domaenen der Relation relname
werden mit einem Nullwert initialisiert, alle numerischen
Domaenen bekommen den Wert 0.
Den Zeichenkettendomaenen wird eine mit Leerzeichen gefuell-
te Zeichenkette zugewiesen.
Die append Anweisung ohne relname fuegt ein neues Tupel in
die Relation ein. Sie kann nur innerhalb einer Recherche ge-
nutzt werden. Durch die Projektion target_list werden den
aufgefuehrten Domaenen Werte zugewiesen.
Alle nicht angebenen Domaenen erhalten den Wert aus dem ak-
tuell gefundenen Tupel der laufenden Recherche.
Es ist zu beachten, dass die Aenderungen in einem gesonder-
ten Puffer ausgefuehrt werden, also das aktuell gefundene
Tupel unveraendert bleibt. Eventuell vorhandene Indizes
werden automatisch aktualisiert.
Arbeit mit Transaktionen
Zur Arbeit mit Transaktionen stehen die AMX-Anweisungen use,
commit, abort und if (deadlock) bereit.
## use ( use_rel [, ...] )
Use spezifiziert den Beginn einer Transaktion. den Beginn
einer Transaktion. Use_rel wird wie folgt angegeben:
[ exclusive | shared | nolock | + ] relname [
with [ level = page | table ]
[ readlock = exclusive | shared | nolock ]
[ maxlock = int ]
[ timeout = int ] ]
Exclusive oder + bedeuten exklusive (alleinige), das Weglas-
sen oder shared eine geteilte Benutzung. Die geteilte Be-
nutzung und nolock (kein Sperren) sind nur fuer Leseopera-
tionen, exklusive Benutzung fuer Schreiboperationen anwend-
bar.
Level kennzeichnet das Sperrniveau page (Seitensperren) oder
table (Relationsperren).
Readlock ist nur fuer Leseoperationen anwendbar und kenn-
zeichnet die Art der Lesesperren.
Maxlock spezifiziert die maximale Anzahl der Sperren ( -1 :
unbegrenzt) und timeout die Zeit (in Sekunden), bis eine
Rueckkehr vom DBBS erfolgt sein muss ( - 1 : warten, bis
verfuegbar).
Nur, wenn beim Eroeffnen der Datenbank with deadlock spezi-
fiziert wurde, sind die folgenden Anweisungen nutzbar.
## if ( bd deadlock ) { stmt_list }
Mit dieser Anweisung kann abgetestet werden, ob ein Deadlock
aufgetreten ist. Diese Anweisung ist unmittelbar nach use,
retrieve, append, replace oder delete anzuordnen. Wenn ein
Deadlock aufgetreten ist, wird die Anweisungsfolge stmt_list
abgearbeitet werden, was i.allg. die Anweisung abort sein
wird.
## abort
Diese Anweisung beendet eine Transaktion zwangsweise und
setzt die Datenbank auf den Stand vor Beginn der Transaktion
zurueck.