     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.
