diff --git a/WEGA/contrib/ingres/dbs/ing_doc/teil2/doc2_ab b/WEGA/contrib/ingres/dbs/ing_doc/teil2/doc2_ab new file mode 100644 index 0000000..0b68c38 --- /dev/null +++ b/WEGA/contrib/ingres/dbs/ing_doc/teil2/doc2_ab @@ -0,0 +1,2160 @@ + + + + Anwendung - 191 - QQQQUUUUEEEELLLL + + + + * retrieve (p.name, pergeh= + * avg(p.gehalt where 1985 - p.gebdat > 50)) + * where 1985 - p.gebdat > 50 + * \g + + I N G - d b . . . + + |name |pergeh | + |-------------------------------| + |Wunsch, Peter-Paul | 1277.444| + |Malter, Juergen | 1277.444| + |Schneider, Peter | 1277.444| + |Heine, Rolf | 1277.444| + |Ernst, Eva | 1277.444| + |Gruene, Peter | 1277.444| + |Zeidler, Fritz | 1277.444| + |Rose, Peter | 1277.444| + |Rose, Petra | 1277.444| + |-------------------------------| + 9 tuples touched + + ING_db: + * + + + Es ist manchmal gebra"uchlich, dass doppelte Werte gelo"scht + werden, bevor ein Aggregat-Operator ausgefu"hrt wird. Wenn + sie beispielsweise wissen mo"chten, wieviele Leiter + ("leiter") es gibt, wird die folgende Query die richtige + Antwort geben: + + + * retrieve (chefs = count(p.leiter)) + * \g + + I N G - d b . . . + + + |chefs | + |-------------| + | 25| + |-------------| + 1 tuples touched + + ING_db: + * + + + Beachten sie, dass "count" mitteilt, wieviele Tupel es in + "personal" gibt. Was wir wissen wollten, war, wieviele + Leiter ("p.leiter") es gibt. + + ING_DB 6.3 stellt drei spezielle Formen von Aggregat- + Operatoren zur Verfu"gung. + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 192 - QQQQUUUUEEEELLLL + + + + countu za"hlt unikate (einmalig vorkommende) + Werte + avgu Durchschnitt u"ber unikate Werte + sumu summiert unikate Werte + + + Interessanterweise werden "minu", "maxu" und "anyu" nicht + beno"tigt. Ihre Werte sind die gleichen, unabha"ngig davon, + ob doppelte Tupel vorkommen oder nicht. + + Die korrekte Query, um die Anzahl der "leiter" zu finden, + ist: + + + * retrieve (chefs=countu(p.leiter)) + * \g + + I N G - d b . . . + + + |chefs | + |-------------| + | 9| + |-------------| + 1 tuples touched + + ING_db: + * + + + Eine andere Erleichterung, die ING_DB 6.3 unterstu"tzt, sind + die sogenannten Aggregat-Funktionen. Aggregat-Funktionen + gruppieren Daten in Kategorien und unterstu"tzen separate + Zusammenfassungen zu jeder Kategorie. + + Was ist zum Beispiel, wenn wir fu"r die Angestellten, die zum + selben Leiter geho"ren, das Durchschnittsgehalt ermitteln + wollen? Die Query wu"rde sein: + + + + + + + + + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 193 - QQQQUUUUEEEELLLL + + + + + * retrieve (p.name,leiteravg=avg(p.gehalt by p.leiter)) + * \g + + I N G - d b . . . + + |name |leiteravg | + |-------------------------------| + |Mueller, Ernst | 700.000| + |Gruene, Peter | 1453.000| + |Rose, Petra | 1453.000| + |Loda, Dieter | 668.500| + |Baum, Klaus | 668.500| + |Kayser, Helmut | 968.500| + |Weber, Franz | 968.500| + |Fleischer, Karl | 877.000| + |Maerz, Udo | 1239.000| + |Mueller, Petra | 1239.000| + |Schmidt, Hermann | 1035.333| + |Warnke, Peter | 1035.333| + |Neumann, Inge | 1035.333| + |Schmidt, Petra | 1111.667| + |Thoms, Rolf | 1111.667| + |Wunsch, Peter-Paul | 1111.667| + |Malter, Juergen | 1111.667| + |Schneider, Peter | 1111.667| + |Weise, Juergen | 1111.667| + |Heine, Rolf | 1111.667| + |Ernst, Eva | 1111.667| + |Rose, Peter | 1111.667| + |Zeidler, Fritz | 1605.667| + |Moser, Otto | 1605.667| + |Schulze, Ernst | 1605.667| + |-------------------------------| + 25 tuples touched + + ING_db: + * + + + Die erste Person ist allein und ihr Einkommen betra"gt 700.00 + M. Die na"chsten zwei Personen haben den selben Leiter und + das Durchschnittseinkommen betra"gt 1453.00 usw. + + Noch einmal, wenn wir die gleiche Liste eben fu"r jene + Angestellten u"ber 50 sehen mo"chten: + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 194 - QQQQUUUUEEEELLLL + + + + + * retrieve (p.name,leiteravg=avg(p.gehalt by p.leiter)) + * where 1985-p.gebdat > 50 + * \g + + I N G - d b . . . + + |name |leiteravg | + |-------------------------------| + |Gruene, Peter | 1453.000| + |Rose Petra | 1453.000| + |Wunsch, Peter-Paul | 1111.667| + |Malter, Juergen | 1111.667| + |Schneider, Peter | 1111.667| + |Heine, Rolf | 1111.667| + |Ernst, Eva | 1111.667| + |Rose, Peter | 1111.667| + |Zeidler, Fritz | 1605.667| + |-------------------------------| + 9 tuples touched + + ING_db: + * + + + Aggregat-Funktionen (im Gegensatz zu Aggregat-Operatoren) + sind nicht vollsta"ndig in sich abgeschlossen. Die Doma"nen, + auf die die Daten gruppiert sind (, durch die sogenannte + "by_list"), sind logisch mit den restlichen Doma"nen der + Query verknu"pft. + + In diesem letzten Beispiel referenziert "p.leiter" in der + "by_list" zu den selben Tupeln wie "p.name" in der + "target_list". + + Wenn wir das Durchschnittsgehalt nach Leitern nur fu"r die + Leiter 33 und 199 berechnen wollen, erga"be sich diese Query: + + + + + + + + + + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 195 - QQQQUUUUEEEELLLL + + + + + * retrieve (p.name,leiteravg= + * avg(p.gehalt by p.leiter)) + * where p.leiter = 199 or p.leiter = 33 + * \g + + I N G - d b . . . + + |name |leiteravg | + |-------------------------------| + |Kayser, Helmut | 968.500| + |Weber, Franz | 968.500| + |Schmidt, Petra | 1111.667| + |Thoms, Rolf | 1111.667| + |Wunsch, Peter-Paul | 1111.667| + |Malter, Juergen | 1111.667| + |Schneider, Peter | 1111.667| + |Weise, Juergen | 1111.667| + |Heine, Rolf | 1111.667| + |Ernst, Eva | 1111.667| + |Rose, Peter | 1111.667| + |-------------------------------| + 11 tuples touched + + + ING_db: + * + + + Nehmen wir an, wir wollen herausfinden, wie viele Personen + bei jedem Leiter arbeiten und weiterhin wollen wir nur die + Personen einbeziehen, die bereits vor 1970 dort arbeiteten. + + + * retrieve (p.leiter,mitarb=count(p.name by p.leiter where + * p.einstdat < 1970)) + * \g + + I N G - d b . . . + + + |leiter|mitarb | + |--------------------| + | 0| 2| + | 10| 0| + | 13| 0| + | 26| 2| + | 32| 0| + | 33| 2| + | 55| 1| + | 129| 2| + | 199| 8| + |--------------------| + 9 tuples touched + + ING_db: + * + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 196 - QQQQUUUUEEEELLLL + + + Beachten sie, dass die Leiter 32, 10 und 13 keine + Angestellten haben, die vor 1970 dort angefangen haben. + Jetzt nehmen wir an, dass wir das Durchschnittsgehalt fu"r + diese Angestellten wissen wollen. A"ndern sie einfach + "count" in "avg" und starten sie die Query. + + * retrieve (p.leiter,mitarb=avg(p.gehalt by p.leiter where + * p.einstdat < 1970)) + * \g + + I N G - d b . . . + + |leiter|mitarb | + |-----------------| + | 0| 1453.000| + | 10| 0.000| + | 13| 0.000| + | 26| 954.000| + | 32| 0.000| + | 33| 1337.000| + | 55| 1362.000| + | 129| 1626.500| + | 199| 1088.125| + |-----------------| + 9 tuples touched + + ING_db: + * + + + Beachten sie, was ING_DB 6.3 fu"r die Leiter 32, 10 und 13 + macht. Das Durchschnitsgehalt fu"r diese Angestellten ist + tatsa"chlich nicht definiert, weil es keine Angestellten + gibt, die vor 1970 angefangen haben. ING_DB 6.3 wandelt + undefinierte Werte immer in Null. + + Wenn sie die Nullwerte von der Ausgabe entfernen wollen, + kann das durch Hinzufu"gung einer Qualifikation zur Query + erfolgen. Die folgende Query wird nur die + Durchschnittsgeha"lter finden, die einen Wert gro"sser Null + haben. + + + + + + + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 197 - QQQQUUUUEEEELLLL + + + + + * retrieve (p.leiter,mitarb=avg(p.gehalt by p.leiter where + * p.einstdat < 1970)) + * where avg(p.gehalt by p.leiter where p.einstdat < 1970) > 0 + * \g + + I N G - d b . . . + + |leiter|mitarb | + |-----------------| + | 0| 1453.000| + | 26| 954.000| + | 33| 1337.000| + | 55| 1362.000| + | 129| 1626.500| + | 199| 1088.125| + |-----------------| + 6 tuples touched + + ING_db: + * + + + Bis jetzt haben wir die Rechercheergebnisse direkt auf dem + Terminal ausgegeben. Sie ko"nnen die Ergebnisse auch in eine + neue Relation retten bzw. sichern. Das wird realisiert, + wenn sie sagen: + + + retrieve into steigerung ( ... ) + where . . . + + + Die Regeln sind genau die gleichen, als wu"rden sie u"ber das + Terminal recherchieren. ING_DB 6.3 gru"ndet die neue Rela- + tion mit den korrekten Doma"nen und gibt die Ergebnisse der + Query in diese Relation. + + Als Beispiel gru"nden wir eine neue Relation "steigerung", + die nur die Angestellten entha"lt, die mehr als 1000 M ver- + dienen: + + + + + + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 198 - QQQQUUUUEEEELLLL + + + + + * retrieve into steigerung (p.all) + * where p.gehalt > 1000 + * print steigerung + * \g + + I N G - d b . . . + + Relation: steigerung + K 1630 ING_DB + EVK Olbernhau - K1630 + + |num |name |gehalt|leiter|gebdat|einstd| + |-------------------------------------------------------| + | 10|Rose, Peter | 1590| 199| 1927| 1953| + | 11|Rose, Petra | 1206| 0| 1931| 1951| + | 26|Schneider, Peter | 1300| 199| 1930| 1970| + | 33|Ernst, Eva | 1010| 199| 1931| 1963| + | 37|Neumann, Inge | 1198| 26| 1950| 1974| + | 55|Malter, Juergen | 1200| 199| 1920| 1969| + | 157|Schmidt, Petra | 1200| 199| 1940| 1960| + | 199|Gruene, Peter | 1700| 0| 1920| 1952| + | 430|Moser, Otto | 1567| 129| 1938| 1959| + | 843|Schmidt, Hermann | 1120| 26| 1936| 1956| + | 994|Schulze, Ernst | 1564| 129| 1944| 1970| + | 1523|Zeidler, Fritz | 1686| 129| 1928| 1949| + | 1639|Maerz, Udo | 1116| 55| 1947| 1970| + | 5119|Mueller, Petra | 1362| 55| 1939| 1963| + | 5219|Weber, Franz | 1337| 33| 1944| 1959| + |-------------------------------------------------------| + 15 tuples touched + + ING_db: + * + + + Durch ein "retrieve into" wird nichts gedruckt bzw. ausgege- + ben. Wir haben ein "print"-Kommando eingefu"gt, um die + Ergebnisse zu sehen. Die Relation, die durch ein "retrieve + into" benannt wird, darf vorher nicht existieren. Wenn wir + beispielsweise versuchen, die selbe Query zu wiederholen: + + + * \g + + I N G - d b . . . + + 2135: line 1, You cannot duplicate the name of an + existing relation(steigerung) + + ING_db: + * + + + + Es gibt zwei spezielle Merkmale zu "retrieve into". Erstens + wird die Relation automatisch sortiert und doppelte Tupel + gelo"scht. Zweitens wird die Relation Bestandteil der Daten- + bank und sie werden ihr Eigentu"mer. Wenn sie nicht wollen, + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 199 - QQQQUUUUEEEELLLL + + + dass sie erhalten bleibt, denken sie daran, dass sie + gelo"scht werden muss. Der Ablauf zum Lo"schen einer Relation + wird etwas spa"ter erla"utert. + + Bisher haben wir nur Daten gesucht, aber niemals welche + gea"ndert. ING_DB 6.3 unterstu"tzt drei Aktualisierungskom- + mandos: "append", "replace" und "delete". + + Beispielsweise wollen wir "Heinz Heinrich" zur Liste der + Angestellten auf "steigerung" hinzufu"gen und ihm ein Gehalt + von 1000 M zuordnen: + + + * append to steigerung(name = "Heinrich, Heinz",gehalt = 1000) + * \g + + I N G - d b . . . + + 1 tuples touched + + ING_db: + * + + + Beachten sie, dass wir nur zwei Werte spezifizierten, obwohl + "steigerung" aus sechs Doma"nen besteht. Das ist scho"n! + ING_DB 6.3 setzt automatisch numerische Doma"nen auf Null + und Zeichenkettendoma"nen auf "blank", wenn sie nicht spezi- + fiziert wurden. + + Beachten sie auch, dass ING_DB 6.3 nach der Query nichts + ausgibt. Das trifft fu"r alle Aktualisierungskommandos zu. + + Wir wollen jedem in "steigerung" 10% Gehaltszuschlag geben. + Um das zu tun, ersetzen wir "gehalt" durch das Produkt aus + 1,1 mal Wert. Geben sie die Query ein: + + + * range of s is steigerung + * replace s(gehalt = s.gehalt * 1.1) + * \g + + I N G - d b . . . + + 16 tuples touched + + ING_db: + * + + + Wa"hrend das "append"-Kommando erwartet, dass sie einen + Relationen-Name (d.h. "append to steigerung") angeben, + erwartet das "replace"- und "delete"-Kommando eine Tupel- + Variable. Bemerken sie, dass das Kommando lautet: + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 200 - QQQQUUUUEEEELLLL + + + + + replace s ( . . . ) + where . . . + + und nicht: + + replace steigerung ( . . . ) + where . . . + + + Geben sie die Ergebnisse der beiden letzten Aktualisierungen + aus: + + + * print steigerung + * \g + + I N G - d b . . . + + + Relation: steigerung + + + |num |name |gehalt|leiter|gebdat|einstd| + |-------------------------------------------------------| + | 10|Rose, Peter | 1749| 199| 1927| 1953| + | 11|Rose, Petra | 1326| 0| 1931| 1951| + | 26|Schneider, Peter | 1430| 199| 1930| 1970| + | 33|Ernst, Eva | 1111| 199| 1931| 1963| + | 37|Neumann, Inge | 1317| 26| 1950| 1974| + | 55|Malter, Juergen | 1320| 199| 1920| 1969| + | 157|Schmidt, Petra | 1320| 199| 1940| 1960| + | 199|Gruene, Peter | 1870| 0| 1920| 1952| + | 430|Moser, Otto | 1723| 129| 1938| 1959| + | 843|Schmidt, Hermann | 1232| 26| 1936| 1956| + | 994|Schulze, Ernst | 1720| 129| 1944| 1970| + | 1523|Zeidler, Fritz | 1854| 129| 1928| 1949| + | 1639|Maerz, Udo | 1227| 55| 1947| 1970| + | 5119|Mueller, Petra | 1498| 55| 1939| 1963| + | 5219|Weber, Franz | 1470| 33| 1944| 1959| + | 0|Heinrich, Heinz | 1100| 0| 0| 0| + |-------------------------------------------------------| + + + ING_db: + * + + + Nun wollen wir denjenigen, der am wenigsten verdient, + entlassen: + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 201 - QQQQUUUUEEEELLLL + + + + + * delete s where s.gehalt = min(s.gehalt) \g + I N G - d b . . . + + 1 tuples touched + + ING_db: + * + + + Beachten sie, dass das "delete"-Kommando eine Tupel-Variable + (d.h. "delete s") erwartet und keinen Relationen-Name. + + Was ist, wenn wir wissen wollen, wer mehr als Otto Moser + verdient? Mit Heinz Heinrich ko"nnen wir nicht mehr arbeiten, + den haben wir entlassen. Die Query, die das erledigt, ist + recht schwierig. Zuerst beno"tigen wir eine neue Tupel- + Variable, genannt "o", die auf auf dem Bereich "steigerung" + liegt und benutzt wird, um Otto zu referenzieren. "o.name" + muss auf "Moser, Otto" gesetzt werden. Danach mu"ssen wir + eine Tupel-Variable "s" nutzen, die die gesamte Relation + durchforscht. Jedesmal, wenn wir "s.gehalt > o.gehalt" fin- + den, dann verdient "s.name" mehr als Otto. + + Die vollsta"ndige Query ist: + + + * range of o is steigerung + * retrieve (s.name, sgeh=s.gehalt,ottogeh=o.gehalt) + * where s.gehalt > o.gehalt + * and o.name = "Moser, Otto" + * \g + + I N G - d b . . . + + |name |sgeh |ottoge| + |----------------------------------| + |Rose, Peter | 1749| 1723| + |Gruene, Peter | 1870| 1723| + |Zeidler, Fritz | 1854| 1723| + |----------------------------------| + 3 tuples touched + + ING_db: + * + + + Wenn wir Otto Moser 50 M mehr geben wollen, als irgendeinem + anderen, dann muss die Query lauten: + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 202 - QQQQUUUUEEEELLLL + + + + + * replace s(gehalt = max(s.gehalt) + 50) + * where s.name = "Moser, Otto" + * \g + + I N G - d b . . . + + + ING_db: + * + + + Schliesslich wollen wir noch eine Relation, fu"r die sie + Eigentu"mer sind, lo"schen-geben sie das Kommando: + + + * destroy steigerung + * \g + + I N G - d b . . . + + ING_db: + * + + + Wir sind jetzt fertig und verlassen ING_DB 6.3. Das kann + durch Eingabe eines "end-of-file" (CONTROL_c) oder gu"nstiger + durch Verwendung des "\q"- Kommandos erreicht werden: + + + * \q + * ING-db Version 6.3/3 logout + K1630 / EVK Olbernhau - K1630 + Wed May 4 19:58:00 1988 + Auf Wiedersehen ing_db -- Kommen Sie bald wieder + + + Als "ing_db" wird immer der Nutzername eingetragen, ggfs. + aber eben auch ing_db. + + + + + + + + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 203 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + _2._2. AAAArrrrbbbbeeeeiiiitttt mmmmiiiitttt DDDDaaaatttteeeennnnbbbbaaaannnnkkkkeeeennnn **** + + + + + + + + + + + + + _2._2._1. VVVVoooorrrrbbbbeeeemmmmeeeerrrrkkkkuuuunnnngggg **** + + In diesem Abschnitt wird beschrieben, wie die Relationen der + Datenbank erzeugt, strukturiert und verwaltet werden. Es + wird davon ausgegangen, dass der Leser etwas vertraut ist + und die Anfragesprache QUEL von ING_DB versteht. + + Um eine neue Datenbank zu gru"nden, mu"ssen sie ein gu"ltiger + (eingetragener) ING_DB -Nutzer sein und die ccccrrrreeeeaaaattttddddbbbb + -Erlaubnis haben. Diese Erlaubnis wird vom ING_DB -System- + administrator verliehen. Wenn sie beide Bedingungen + erfu"llen, ko"nnen sie eine Datenbank unter Verwendung des + UNIX -Shell-Kommandos + + %%%% ccccrrrreeeeaaaattttddddbbbb mmmmeeeeiiiinnnnddddbbbb + + gru"nden, wobei mmmmeeeeiiiinnnnddddbbbb der Name der Datenbank ist. Sie wer- + den Datenbankadministrator (DBA) fu"r "meindb". Als DBA + haben sie spezielle Berechtigungen. + + + 1. Alle von ihnen erzeugten Relationen ko"nnen von allen + anderen, mmmmeeeeiiiinnnnddddbbbb verwendenden, Nutzern benutzt werden. + Erzeugt aber dagegen ein beliebiger Nutzer eine Rela- + tion, so ist sie strikt privat und auf sie kann weder + vom DBA noch von einem anderen Nutzer zugegriffen wer- + den. + + + 2. Sie ko"nnen das ----uuuu -Flag in qqqquuuueeeellll und pppprrrriiiinnnnttttrrrr verwenden. + Das befa"higt sie, ING_DB auf mmmmeeeeiiiinnnnddddbbbb als ein anderer + Nutzer laufen zu lassen. Schlagen sie im ING_DB + -Referenz- Manual unter den Kapiteln qqqquuuueeeellll((((uuuunnnniiiixxxx)))) und + uuuusssseeeerrrrssss((((ffffiiiilllleeeessss)))) wegen detaillierten Angaben nach. + + + 3. Sie ko"nnen mit ssssyyyyssssmmmmoooodddd , rrrreeeessssttttoooorrrreeee , ccccrrrreeeeaaaattttddddbbbb , ddddeeeessssttttrrrrooooyyyyddddbbbb + und ppppuuuurrrrggggeeee auf mmmmeeeeiiiinnnnddddbbbb arbeiten. + + + 4. Eine Datenbank, die ohne Angabe von Flags gegru"ndet + wurde, gestattet mehrere mitwirkende Nutzer. Wenn + jeweils nur ein Nutzer die Datenbank zu bestimmter Zeit + verwenden mo"chte, kann der Datenbankadministrator die + Gleichzeitigkeitskontrolle ausschalten. Schlagen sie + unter ccccrrrreeeeaaaattttddddbbbb((((uuuunnnniiiixxxx)))) im ING_DB - Referenz-Manual nach. + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 204 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + Wenn eine Datenbank gegru"ndet ist, sollten sie sofort + + %%%% ssssyyyyssssmmmmoooodddd mmmmeeeeiiiinnnnddddbbbb + + geben. Dieses Kommando konvertiert die Systemrelationen in + die gu"nstigste Struktur zur Verwendung in ING_DB . ssssyyyyssssmmmmoooodddd + wird spa"ter ausfu"hrlich erkla"rt. + + Als DBA oder als ein Nutzer ko"nnen sie neue Relationen in + jeder Datenbank erzeugen, zu der sie Zugriffsrecht haben. + Die vorliegenden Ausfu"hrungen beschreiben, wie das gemacht + werden muss. + + _2._2._2. EEEErrrrzzzzeeeeuuuugggguuuunnnngggg nnnneeeeuuuueeeerrrr RRRReeeellllaaaattttiiiioooonnnneeeennnn mmmmiiiitttt QQQQUUUUEEEELLLL + + Es gibt zwei Wege um neue Relationen mit QUEL zu erzeugen. + + + create + retrieve into + + rrrreeeettttrrrriiiieeeevvvveeee iiiinnnnttttoooo wird verwendet, um eine neue Relation aus + einer oder mehreren existierenden Relationen zu formieren. + ccccrrrreeeeaaaatttteeee wird verwendet, um eine neue Relation ohne Tupel + (leer) zu erzeugen. + + Beispiel 1: + + + range of t is teile + range of l is lieferung + retrieve into neuliefrg( + nummer = l.lnum, + t.tname, + l.liefdat) + where l.tnum = t.tnum + + + Beispiel 2: + + + create neuliefrg( + nummer = i2, + tname = c20, + liefdat = c8) + + + Im Beispiel 1 erzeugt QUEL eine neue Relation, genannt "neu- + liefrg". Das Format der Doma"nen wird berechnet. Die Query + wird bearbeitet und "neuliefrg" modifiziert zu "cheapsort". + (Dies wird ausfu"hrlicher im Abschitt 2.2.4. erkla"rt.) + + Im Beispiel 2 wird "neuliefrg" erzeugt und der Name sowie + das Format fu"r jede Doma"ne angegeben. Die zugelassenen For- + mattypen sind: + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 205 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + + + i1 1 Byte Integer + i2 2 " " + i4 4 " " + f4 4 Byte Gleitkommazahl + f8 8 " " " " + c1,c2,..,c255 1,2,..,255 Byte Zeichenkette + + + Im Beispiel 2 betra"gt die La"nge eines einzelnen Tupel 30 + Byte (2 + 20 + 8). Die Relation hat drei Doma"nen. Es ist + klar, dass ING_DB Grenzen hat. Eine Relation kann + installationsabha"ngig 49 bzw. 128 Doma"nen und eine + Tupella"nge von u"ber 498 bzw. 1010 Byte haben. + + UNIX stellt den Speicherplatz auf der Platte in Blo"cken von + 512 Byte, 1KByte bzw. 4KByte bereit. Datensa"tze werden in + ING_DB in Seiten (pages) abgelegt, deren Gro"ssen beim + Anlegen einer Datenbank eingestellt werden. Die maximale + Seitengro"sse ist generierungsabha"ngig. + ING_DB teilt ein Tupel nicht u"ber zwei Seiten, so kann es + vorkommen, dass Speicherplatz vergeudet wird. In einer + Seite werden fu"r den oooovvvveeeerrrrhhhheeeeaaaadddd 12 Bytes zuzu"glich je 2 Byte + pro Tupel fu"r Verwaltungsaufgaben genutzt. Die + Berechnungsvorschriften sind: + + + Anzahl der Tupel pro Seite = + (Seitengro"sse-12)/(Tupella"nge + 2) + + Verschwendeter (oder verschenkter) Speicherplatz = + (Seitengro"sse-12) - (Anzahl der Tupel pro Seite) * + * (Tupella"nge + 2) + + + Fu"r unser Beispiel und 512-Byte-Seitengro"sse ergibt das + + + 15 = 500 / (30 + 2) + + 20 = 500 - 15 * (30 + 2) + + 15 Tupel pro Seite und 20 Bytes unbelegter Platz. Diese + Berechnung gilt nicht fu"r komprimierte Relationen. Wir wer- + den auf dieses Problem im Weiteren zuru"ckkommen, wenn Tupel- + kompression diskutiert wird. + + Wenn sie einen Doma"nenname oder ein Format vergessen haben, + benutzen sie das "help"-Kommando. Geben sie auf das + Beispiel bezogen das QUEL- Kommando + + + help neuliefrg + + wird folgendes gedruckt: + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 206 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + + + Relation: neuliefrg + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Owner: bob + Tuple width: 30 + Saved until: Thu Nov 10 08:35:06 1988 + Number of tuples: 0 + Storage structure: heap + Relation type: user relation + + attribute name type length keyno. + + nummer i 2 + tname c 20 + liefdat c 8 + + + Merken sie sich, dass jede Relation ein Verfallsdatum hat. + Es wird ausgehend vom Erzeugungsdatum der Relation auf eine + Woche festgesetzt. Das ssssaaaavvvveeee -Kommando kann verwendet wer- + den, um diesen Zeitraum zu verla"ngern. Beachten sie dazu + ssssaaaavvvveeee((((qqqquuuueeeellll)))) und ppppuuuurrrrggggeeee((((uuuunnnniiiixxxx)))) im ING_DB -Referenz- Manual. + + + _2._2._3. DDDDaaaassss KKKKooooppppiiiieeeerrrreeeennnn vvvvoooonnnn DDDDaaaatttteeeennnn aaaauuuussss uuuunnnndddd iiiinnnn eeeeiiiinnnneeee + DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + _2._2._3._1. AAAAllllllllggggeeeemmmmeeeeiiiinnnneeee MMMMoooo""""gggglllliiiicccchhhhkkkkeeeeiiiitttteeeennnn + + Wenn eine Relation gegru"ndet wurde, gibt es folgende + Mo"glichkeiten, neue Daten einzufu"gen: + + + append-Kommando + copy-Kommando + + aaaappppppppeeeennnndddd wird zum Einfu"gen eines einzelnen Tupel zu irgend- + einem Zeitpunkt oder zum Fu"llen einer Relation aus anderen + Relationen verwendet. + + ccccooooppppyyyy wird zum Kopieren von Daten aus einem UNIX -File in + eine Relation benutzt. Es ist anzuwenden, um Daten von + einem anderen Programm oder von einem anderen System zu + kopieren. Es ist auch gebra"uchlich, um gro"ssere Datenmengen + zu kopieren. + + Wir wollen nun eine einfache Relation erzeugen und Daten + dort einbringen. + + Beispiel: + + + create abgabe (name = c10, wert = f4, ext = i2) + + Jetzt sollen zwei Personen eingegeben werden. Die ein- + fachste Mo"glichkeit ist natu"rlich, diese Eingabe unter + Verwendung des QUEL-Kommandos aaaappppppppeeeennnndddd zu vollziehen. + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 207 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + + append to abgabe (name="frank",wert = 5,ext = 204) + + append to abgabe (name="harry",ext = 209,wert = 4.50) + + + ING_DB erkennt die Doma"nen an ihren Namen, unabha"ngig von + ihrer aufgelisteten Reihenfolge. Die Relation aaaabbbbggggaaaabbbbeeee sieht + jetzt so aus: + + + abgabe relation + + |name |wert |ext | + |----------------------------| + |frank |5.000 |204 | + |harry |4.500 |209 | + |----------------------------| + + + Wir haben zwei Personen in die aaaabbbbggggaaaabbbbeeee -Relation eingegeben. + Doch was ist, wenn wir weitere fu"nfzig einzugeben ha"tten. + Die Verwendung des "append"-Kommandos ist aufgrund der + umfangreichen Angaben fu"r jedes Tupel nicht geeignet. Das + ccccooooppppyyyy -Kommando entspricht besser unseren Anforderungen. + + ccccooooppppyyyy kann Daten von einem regula"ren UNIX -File in ver- + schiedenen Formaten u"bernehmen und sie in die Relation + einfu"gen. Um das "copy"-Kommando zu verwenden, ist vorher + ein UNIX -File (u"blicherweise mit "ed") zu erzeugen, das die + Daten entha"lt. + + Als Beispiel wollen wir fu"nf neue Namen in das File unter + Verwendung des Editor's eintragen. + + + % ed + a + bill,3.50,302 + sam,10.00,410 + susan,,100 + sally,.5,305 + george,4.00,302 + + w newdom + 68 + q + % + + + Das Format des obenstehenden Files ist ein Name gefolgt von + einem Komma, gefolgt von einem Wert (wert), dann ein Komma, + dann die Erweiterung (extension) und schliesslich ein New- + line. Es ist zulaessig, Werte nicht anzugeben, wie zum + Beispiel "wert" bei "susan". Solche Leerwerte werden bei + numerischen Doma"nen zu Null (0) und bei Zeichenketten auf + blanks (Leerzeichen) gesetzt. + + Um zu kopieren, starten wir ING_DB und geben das "copy"- + Kommando. + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 208 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + + copy abgabe (name = c0, wert = c0, ext = c0) + from "/mnt/bob/newdom" + + + Das "copy"-Kommando arbeitet folgendermassen: + + + copy relname (Liste, was zu kopieren ist) from "voller pathname" + + + Obwohl "wert" und "ext" in der Relation als f4 (Gleitkomma) + und i2 (Integer) gespeichert sind, haben wir sie im UNIX + -File aber als Zeichenketten eingegeben. Zur Spezifizierung + des Formats der Doma"ne akzeptiert ccccooooppppyyyy:::: + + domain = format + + wobei ddddoooommmmaaaaiiiinnnn der Doma"nenname und ffffoooorrrrmmmmaaaatttt im UNIX -File einer + der folgenden Werte ist: + + + i1, i2, i4 (Integer der La"nge 1, 2, oder 4) + f4, f8 (Gleitkommazahl der La"nge 4 + oder 8) + c1, c2, c3,...c255 (Zeichenkette mit fester La"nge) + c0 (Zeichenkette mit variabler La"nge, + begrenzt durch Komma, Tabulator oder + Newline) + + + Im Beispiel verwenden wir: + + name = c0, wert = c0, extension = c0 + + Das bedeutet, dass jede Doma"ne im UNIX -File als Zeichen- + kette mit variabler La"nge gespeichert war. ccccooooppppyyyy verwendet + das erste Komma-, Tabulator- oder Newline-Zeichen als Ende + der Zeichenkette. Das ist ungefa"hr die gebra"uchlichste + Nutzung von ccccooooppppyyyy , wenn neue Daten erstmalig in eine Rela- + tion eingebracht werden. + + ccccooooppppyyyy kann auch benutzt werden, um Daten aus einer Relation + in ein UNIX -File zu kopieren. Zum Beispiel: + + + copy abgabe (name = c10, wert = c10, ext = c5) + into "/mnt/bob/data" + + + Folgendes ereignet sich: + + 1. Wenn das File /mnt/bob/data bereits existiert, wird es + zersto"rt. + + 2. Das File wird im Modus 600 (nur read/write-Erlaubnis + fu"r den Nutzer) erzeugt. + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 209 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + 3. "name" wird als ein 10-Zeichenfeld kopiert, unmittelbar + gefolgt von "wert", unmittelbar gefolgt von "ext". + "wert" wird konvertiert in eine Zeichenkette der La"nge + 10. "ext" wird konvertiert in eine Zeichenkette der + La"nge 5. + + Das File ////mmmmnnnntttt////bbbboooobbbb////ddddaaaattttaaaa wird eine Folge von Zeichen, die fol- + gendermassen aussieht: + + + frank``````````5.000``204harry``````````4.500 209bill + ```````````3.500``302sam```````````10.000 410susan``` + ```````0.000``100sally``````````0.500``305george`````` + ```4.000``302 + + + Dabei steht "`" fu"r . Die Ausgabe wurde zur Darstel- + lung entsprechend des vorliegenden Papierformates in vier + Zeilen geteilt. In Wirklichkeit ist das File eine einzige + Zeile. Ein anderes Beispiel: + + + copy (name = c0, colon = d1, ext = c0, comma = d1, + wert = c0, nl = d1) into "/mnt/bob/data" + + + In diesem Beispiel wird cccc0000 interpretiert als "nutze das + festgelegte Zeichenketten-Format". Fu"r Zeichenketten- + Doma"nen ist das die La"nge der Doma"ne. Numerische Doma"nen + werden konvertiert in Zeichenketten entsprechend dem ING_DB + -Standardformat (siehe quel(unix)). + + Die Statements: + + colon = d1 + comma = d1 + nl = d1 + + werden benutzt um einen Doppelpunkt, ein Komma oder ein New- + line in das File einzufu"gen. Das Format dddd1111 wird als + Pseudo-Zeichen (dummy) interpretiert. Wa"hrend des Kopierens + in ein UNIX -File kann eine ausgewa"hlte Menge von Zeichen in + das File unterVerwendung der dddduuuummmmmmmmyyyy ddddoooommmmaaaaiiiinnnn -Spezifikation + eingefu"gt werden. So wu"rde das File "/mnt/bob/data" + aussehen: + + + frank : 204, 5.000 + harry : 209, 4.500 + bill : 302, 3.500 + sam : 410, 10.000 + susan : 100, 0.000 + sally : 305, 0.500 + george : 302, 4.000 + + + + Wenn sie ein File mit der wirklichen Bina"rdarstellung der + Zahlen wu"nschen, ist zu verwenden: + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 210 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + copy (name = c10, wert = f4, ext = i2) into "..." + + Dies wu"rde ein File mit einer exakten Kopie von jedem Tupel, + eins nach dem anderen, erzeugen. Es ist ha"ufig + wu"nschenswert und das wird hier bezweckt, fu"r tempora"re + Backups die Garantie zu haben, dass die Gleitkomma-Doma"nen + exakt abgebildet sind. + + _2._2._3._2. TTTTyyyyppppiiiisssscccchhhheeee FFFFeeeehhhhlllleeeerrrr + + Es gibt 17 verschiedene Fehler die bei "copy" auftreten + ko"nnen. Wir wollen einige der ha"ufigsten durchgehen. + + Angenommen sie haben ein File mit + + bill,3.5,302 + sam,10,410, + susan,3,100 + + und arbeiten das "copy"-Kommando + + + copy abgabe (name = c0, wert = c0, ext = c0) + from "/mnt/bob/data" + + + ab, dann erhalten sie die Fehlermitteilung + + + 5809: COPY: Bad input String for Domain wert. + Input was "susan".There were 2 tuples sucessfully + copied from /mnt/bob/data into abgabe. + + + Folgendes hat sich ereignet: + + Zeile 2 hat ein extra Komma, die ersten beiden Tupel + wurden richtig kopiert, das na"chste Tupel ergibt sich + dann zu + name = "" (blank), wert = "susan", and ext = "3". Aber + "susan" ist keine erlaubte Gleitkommazahl, ein Fehler + wird generiert und der Prozess wird nach zwei Tupel + gestoppt. + + Wenn sie versuchen ein solches File wie + + nancy,5.0,35000 + + zu kopieren erhalten sie die Fehlermitteilung + + 5809: COPY: Bad input String for Domain ext. + Input was "35000". There were 0 Tuples successfully + copied from /mnt/bob/data into abgabe. + + + Hier gilt "ext" als eine i2 (Integer)-Doma"ne, Sie kann den + Wert 32767 nicht u"berschreiten. + + Es gibt weitere "numerische" Fehlermitteilungen, die meisten + sind selbsterkla"rend. + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 211 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + Hinzuzufu"gen sind drei, nicht verha"ngnisvolle Warnungen, die + bei ccccooooppppyyyy ffffrrrroooommmm auftreten ko"nnen. + + Wenn sie von einem File in eine Relation der Art iiiissssaaaammmm oder + hhhhaaaasssshhhh kopieren, wird die Anzahl der doppelten Tupel mit- + geteilt (, sofern welche enthalten sind). Das kann bei hhhheeeeaaaapppp + nicht geschehen, weil auf doppelte Tupel nicht gepru"ft wird. + + ING_DB ist nicht in der Lage ccccoooonnnnttttrrrroooollll cccchhhhaaaarrrraaaacccctttteeeerrrrssss (solche wie + bbbbeeeellllllll etc.) zu speichern. Wenn ccccooooppppyyyy ein ccccoooonnnnttttrrrroooollll cccchhhhaaaarrrraaaacccctttteeeerrrr + liest, konvertiert es dieses in bbbbllllaaaannnnkkkk und teilt die Anzahl + der Doma"nen mit, in denen diese Zeichen enthalten waren. + + Wenn sie mit der c0 -Option kopieren, wird "copy" ihnen mit- + teilen, wieviele Zeichenketten la"nger als ihre zugeho"rigen + Doma"nen waren und geku"rzt werden. Die Zeichenkette wird + abgeschnitten. + + _2._2._3._3. SSSSppppeeeezzzziiiieeeelllllllleeee MMMMoooo""""gggglllliiiicccchhhhkkkkeeeeiiiitttteeeennnn + + Es gibt einige spezielle Funktionen, die ccccooooppppyyyy in der Handha- + bung etwas erleichtern. + + _2._2._3._3._1. PPPPhhhhyyyyssssiiiisssscccchhhheeee KKKKooooppppiiiieeee ((((bbbbuuuullllkkkk ccccooooppppyyyy)))) + + Wenn sie + + copy relname () from "file" + oder + copy relname () into "file" + + geben, erweitert "copy" das Statement in folgender Bedeu- + tung: + + Kopiere jede Doma"ne in ihrer genauen Reihenfolge + entsprechend ihres festgelegten Formats. + + Wenn sie sagen wu"rden + + copy abgabe () into "/mnt/bob/abgabe" + + wa"re es dasselbe wie: + + copy abgabe (name = c10, wert = f4, ext = i2) + into "/mnt/bob/abgabe" + + Dies verschafft ihnen einen bequemen Weg, um ganze Rela- + tionen von und nach ING_DB zu kopieren, bspw. aber auch von + einer Datenbank in die andere. + + _2._2._3._3._2. PPPPsssseeeeuuuuddddooooddddoooommmmaaaa""""nnnneeeennnn ((((DDDDuuuummmmmmmmyyyy DDDDoooommmmaaaaiiiinnnnssss)))) + + Wenn sie Daten von einem anderen Computer oder einem anderen + Programm kopieren wollen, kann es vorkommen, dass ein Teil + der Daten ignoriert werden soll. Das ko"nnen sie unter + Verwendung der dddduuuummmmmmmmyyyy ddddoooommmmaaaaiiiinnnn -Spezifikation d0, d1, d2 ... + d511 realisieren. Zum Beispiel + + copy rel (dom1 = c5, dummy = d2, dom2 = i4, + dumb = d0) from "/mnt/me/data" + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 212 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + Die ersten fu"nf Zeichen werden in dom1 abgelegt, die + na"chsten zwei werden ignoriert. Die na"chsten vier Bytes + geho"ren zum Typ i4 (Integer) und gehen zu dom2, und die ver- + bleibende begrenzte Zeichenkette wird ignoriert. Der Name + der dddduuuummmmmmmmyyyy -Doma"ne wird u"berlesen, die Doma"ne muss nicht + unbedingt dddduuuummmmmmmmyyyy heissen, wie das bei dddduuuummmmbbbb ==== dddd0000 der Fall ist. + + Wie schon erwa"hnt, ko"nnen "dummy"-Doma"nen verwendet werden, + um bei einem "copy into" auf ein UNIX -File Spezialzeichen + ("special characters") einzufu"gen. Die Liste der + zugelassenen Doma"nen entha"lt: + + nl newline + tab tab character + sp space + nul a zero byte + null a zero byte + comma , + dash - + colon : + lparen ( + rparen ) + + + + _2._2._3._3._3. AAAAbbbbsssscccchhhhnnnneeeeiiiiddddeeeennnn ((((TTTTrrrruuuunnnnccccaaaattttiiiioooonnnn)))) + + Es ist nicht ungewo"hnlich, dass nach einem aufgetretenen + Fehler nochmals gestartet werden muss. Der einfachste Weg, + das zu tun, ist das Lo"schen der alten Relation. Es wird mit + dem Kommando + + modify relname to truncated + + realisiert und hat den Effekt des Lo"schens aller Tupel in + rrrreeeellllnnnnaaaammmmeeee , bei gleichzeitiger Freigabe des belegten Platten- + speicherbereichs und der Umwandlung von rrrreeeellllnnnnaaaammmmeeee zuru"ck zu + hhhheeeeaaaapppp . Es ist das logische A"quivalent zum ddddeeeessssttttrrrrooooyyyy gefolgt + von ccccrrrreeeeaaaatttteeee (aber mit etwas weniger Eingabearbeit). + + Da in den verwendeten Files Formatfehler nicht + auszuschliessen sind, ist es im Allgemeinen keine gute Idee + mit ccccooooppppyyyy Daten in eine Relation mit bereits gepru"ften Daten + zu transportieren. Die gu"nstigste Verfahrensweise ist, eine + tempora"re Relation mit den selben Doma"nen zu erzeugen, wie + sie die existierende Relation besitzt. Kopieren sie die + Daten in die tempora"re Relation und dann ha"ngen ("append") + sie diese an die echte Relation an. Zum Beispiel: + + create tempdom(name=c10,wert=f4,ext=i2) + + copy tempdom(name=c0,wert=c0,ext=c0) + from "/mnt/bob/data" + + range of td is tempdom + append to abgabe(td.all) + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 213 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + _2._2._3._3._4. SSSSppppeeeezzzziiiieeeelllllllleeee BBBBeeeeggggrrrreeeennnnzzzzeeeerrrr ((((SSSSppppeeeecccciiiiffffiiiinnnngggg DDDDeeeelllliiiimmmmiiiittttoooorrrrssss)))) + + Manchmal ist es wu"nschenswert das Zeichen zu spezifizieren, + welches die Zeichenfolge bei "copy from file" begrenzen + soll. Das ist mit der Angabe + + domain = c0delim + + mo"glich, wobei ddddeeeelllliiiimmmm ein gu"ltiger Begrenzer (delimitor) aus + der Liste der zugelassenen Namen oder ein beliebiges Zeichen + ist. Diese Liste wurde weiter oben unter dddduuuummmmmmmmyyyy ddddoooommmmaaaaiiiinnnnssss + aufgefu"hrt. Bei den Zeichen muss beachtet werden, dass der + beliebige Delimitor ein Zeichen sein muss, welches der + interaktive Terminal-Monitor annimmt und der Parser nicht + als Operator interpretiert. (Diese Interpretationsart kann + umgangen werden, indem die Angabe cccc0000ddddeeeelllliiiimmmm als String + gequotet wird. Das heisst, der gewu"nschte Delimitor mu"sste + in der Form " cccc0000)))) "geschrieben werden. Zum Beispiel: + + copy abgabe (name = c0nl) from "/mnt/me/data" + + kopiert "name" des Files in die Relation. Nur ein Newline + begrenzt die Namen richtig, weil Kommas oder Tabulatoren + eventuell als Teil eines Namens auftreten ko"nnen. + + Bei ccccooooppppyyyy iiiinnnnttttoooo ffffiiiilllleeee wird ddddeeeelllliiiimmmm immer sofort in das File + geschrieben, so dass bei ccccooooppppyyyy iiiinnnnttttoooo die Spezifikation lautet: + + copy abgabe (name = c0nl) into "/mnt/me/file" + + Genauer gesagt, "name" wird unmittelbar gefolgt von Newline. + + _2._2._3._3._5. AAAAuuuuffffhhhheeeebbbbuuuunnnngggg ddddeeeerrrr BBBBeeeeggggrrrreeeennnnzzzzeeeerrrr ((((QQQQuuuuoooottttiiiinnnngggg)))) + + Soll in einem Wert einer Doma"ne der gu"ltige Begrenzer + Verwendung finden, so muss er kaschiert (aufgehoben) werden. + Dies geschieht durch das Voranstellen eines backslash \\\\ vor + dem Begrenzer. + So kann z.B. das Tupel + + donald\, mc, 6.0, 403 + + korrekt mittels + + copy abgabe (name = c0, wert = c0, ext = c0) + from "/mnt/bob/data" + + kopiert werden, wobei "name" den Wert "donald, mc", "wert" + den Wert "6.0" neu erha"lt. + + _2._2._4. SSSSppppeeeeiiiicccchhhheeeerrrrssssttttrrrruuuukkkkttttuuuurrrreeeennnn ffffuuuu""""rrrr RRRReeeellllaaaattttiiiioooonnnneeeennnn + + + _2._2._4._1. EEEEiiiinnnnffffuuuu""""hhhhrrrruuuunnnngggg + + Wenden wir uns nun den Problemen der Effizienz zu. Haben + sie erst einmal eine Relation erzeugt und Ihre Daten unter + Verwendung von ccccooooppppyyyy oder aaaappppppppeeeennnndddd eingefu"gt, kann ING_DB jede + beliebige Query (Kommando aus QUEL) in der Relation + ausfu"hren. Es gibt mehrere Mo"glichkeiten, zur Erho"hung der + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 214 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + Geschwindigkeit, mit der ING_DB die Query ausfu"hrt. + + ING_DB kann eine Relation in drei verschiedenen internen + Strukturen speichern. Sie werden hhhheeeeaaaapppp , iiiissssaaaammmm und hhhhaaaasssshhhh + genannt. Zuerst wollen wir jede Struktur genauer + beschreiben und spa"ter unsere Betrachtung ausdehnen. + + _2._2._4._2. HHHHeeeeaaaapppp + + Wird eine Relation erstmalig erzeugt, ist sie vom Typ + "heap". Es gibt zwei wichtige Feststellungen zu hhhheeeeaaaapppp:::: dop- + pelte Tupel werden nicht gelo"scht und die Lokalisierung der + Tupel ist unbekannt. Wenn sie die folgende Query ausfu"hren + + range of a is abgabe + retrieve (a.wert) where a.name = "bill" + + muss ING_DB jedes Tupel lesen und pru"fen, ob der Name + "bill" dort auftritt. Bei kleinen Relationen ist das nicht + schlimm, aber bei sehr grossen Relationen kann das Minuten + (oder eben bei Computern mit kleinen Hauptspeichern Stun- + den!) dauern. + + _2._2._4._3. HHHHaaaasssshhhh + + Bei einer Relation, deren Struktur hhhhaaaasssshhhh ist, kann ein + schneller Zugriff auf Tupel gewa"hrt werden, wenn die Suche + (Recherche) durch bestimmte Doma"nen gesteuert wird. Diese + Doma"nen werden gewo"hnlich als kkkkeeeeyyyyeeeedddd ddddoooommmmaaaaiiiinnnnssss (Schlu"ssel bzw. + Schlu"sseldoma"nen) bezeichnet. Weiterhin enthalten, hhhhaaaasssshhhh + -Relationen keine doppelten Tupel. Nehmen wir + beispielsweise an, dass die "abgabe"-Relation als hhhhaaaasssshhhh auf + die Doma"ne "name" gespeichert ist. In der Query + + retrieve (a.wert) where a.name = "bill" + + wird ING_DB schnell herausbekommen, wo sich das Tupel + anna"hernd auf der Platte befindet. Wenn die Relation nur + einige wenige Tupel entha"lt, ko"nnen sie den Unterschied + zwischen hhhheeeeaaaapppp -und hhhhaaaasssshhhh -Struktur nicht bemerken. Aber wenn + die Relation gro"sser wird, ist die Zugriffszeit von + spu"rbarer Bedeutung. + + _2._2._4._4. IIIIssssaaaammmm + + Eine iiiissssaaaammmm -Struktur liegt dann vor, wenn die Relation nach + einer oder mehreren Doma"nen sortiert ist (auch kkkkeeeeyyyyeeeedddd ddddoooommmmaaaaiiiinnnnssss + genannt). Doppelte Tupel treten bei "isam"-Relationen nicht + auf. Wenn ein neues Tupel angefu"gt wird, wird es + "anna"hernd" an der Stelle platziert, die der Sortierposition + in der Relation entspricht. (Das "anna"hernd" wird etwas + spa"ter erla"utert.) + + Angenommen "abgabe" hat die Struktur iiiissssaaaammmm auf die Doma"ne + "name". Die Ausfu"hrung der Query + + retrieve (a.wert) where a.name = "bill" + + wird ING_DB veranlassen, festzustellen, wo in der sortier- + ten Folge der Name "bill" steht und nur dieser Teil der + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 215 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + Relation wird gelesen. + + Wenn die Relation anna"hernd sortiert ist, ist eine iiiissssaaaammmm + -Struktur auch effizient zur Ausfu"hrung der Query: + + retrieve (a.wert) where a.name >= "b" and a.name < "g" + + Diese Query zeigt alle Namen, die mit "b" bis "f" beginnen. + Es ist nicht no"tig, die gesamte Relation zu durchsuchen, da + sie eine isam -Struktur u"ber "name" besitzt. + + _2._2._4._5. SSSSppppeeeezzzziiiiffffiiiizzzziiiieeeerrrruuuunnnngggg ddddeeeerrrr SSSSppppeeeeiiiicccchhhheeeerrrrssssttttrrrruuuukkkkttttuuuurrrr + + Eine von einem Nutzer erzeugte Relation kann durch Anwendung + des mmmmooooddddiiiiffffyyyy -Kommandos in eine der Speicherstrukturen konver- + tiert werden. Zum Beispiel + + modify abgabe to hash on name + oder + modify abgabe to isam on name + oder eben + modify abgabe to heap + + + + _2._2._4._6. HHHHaaaauuuupppptttt----((((pppprrrriiiimmmmaaaarrrryyyy)))) uuuunnnndddd + UUUU""""bbbbeeeerrrrllllaaaauuuuffff----((((oooovvvveeeerrrrfffflllloooowwww)))) SSSSeeeeiiiitttteeeennnn + + An dieser Stelle ist es notwendig auf das Konzept der Haupt- + und U"berlauf-Seiten bei hhhhaaaasssshhhh -und iiiissssaaaammmm -Strukturen ein- + zugehen. Beide, hhhhaaaasssshhhh und iiiissssaaaammmm , sind Techniken der + Zuweisung von Tupeln zu festen Seiten einer Relation, + basierend auf den Schlu"sseldoma"nen der Tupel. So entha"lt + jede Seite nur eine bestimmte Untermenge der Relation. + + Wenn ein neues Tupel in eine hhhhaaaasssshhhh -oder iiiissssaaaammmm -Relation + eingefu"gt wird, stellt ING_DB zuerst fest, in welche Seite + es geho"rt und u"berpru"ft dann den verfu"gbaren Platz dieser + Seite. Wenn dort noch Platz ist, wird das Tupel in dieser + Seite untergebracht. Wenn kein Platz ist, wird eine + U"berlauf-Seite erzeugt und das Tupel dort platziert. + + Die U"berlauf-Seite wird mit der Originalseite verbunden. + Die Originalseite wird als Haupt-Seite bezeichnet. Wenn die + U"berlauf-Seite voll wird, dann ero"ffnet ING_DB eine + U"berlauf-Seite zu dieser. Wir haben dann eine Haupt-Seite, + die mit einer U"berlauf-Seite verbunden ist, welche wiederum + mit einer anderen U"berlauf-Seite verbunden ist. U"berlauf- + Seiten werden dynamisch so hinzugefu"gt, wie sie gebraucht + werden. + + + + _2._2._4._7. SSSSppppeeeezzzziiiiffffiiiizzzziiiieeeerrrruuuunnnngggg ddddeeeessss FFFFrrrreeeeiiiirrrraaaauuuummmmeeeessss + aaaauuuuffff eeeeiiiinnnneeeerrrr SSSSeeeeiiiitttteeee ((((ffffrrrreeeeeeee ssssppppaaaacccceeee)))) + + Beim mmmmooooddddiiiiffffyyyy -Statement ko"nnen sie angeben, wieviel Platz zum + Wachsen der Relation frei gehalten werden soll. Wie schon + erwa"hnt, ist eine Relation in Seiten gegliedert. Der + Fu"llungsfaktor ( ffffiiiillllllllffffaaaaccccttttoooorrrr ) spezifiziert, wie weit jede + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 216 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + Haupt-Seite belegt werden soll. Diese Festlegung sollte + na"herungsweise darauf basieren, wieviele Tupel in die Rela- + tion noch einzufu"gen sind. Zum Beispiel: + + modify abgabe to isam on name where fillfactor = 100 + + Hier wird "modify" mitgeteilt, dass jede Seite mo"glichst mit + 100% gefu"llt werden soll. + + modify abgabe to isam on name where fillfactor = 25 + + bewirkt, dass jede Seite zu 25% gefu"llt, oder mit anderen + Worten, zu 75% leer ist. Wir wu"rden so vorgehen, wenn wir + etwa 1/4 der Daten geladen ha"tten und annehmen, dass sie + gleichma"ssig u"ber das Alphabet verteilt sind. + + Merken sie sich, wenn der ffffiiiillllllllffffaaaaccccttttoooorrrr nicht spezifiziert ist, + wird ING_DB einen vernu"nftigen Standardwert einsetzen. + Auch dann, wenn eine Seite gefu"llt ist, erzeugt ING_DB + automatisch eine U"berlauf-Seite, so dass niemals der Fall + eintritt, dass eine Relation nicht erweitert werden kann. + + Wenn eine Relation zu hhhhaaaasssshhhh modifiziert wird, kann ein Param- + eter mmmmiiiinnnnppppaaaaggggeeeessss (minimale Seitenanzahl) spezifiziert werden. + mmmmooooddddiiiiffffyyyy garantiert, dass mindestens mmmmiiiinnnnppppaaaaggggeeee als Anzahl der + Haupt-Seiten der Relation zugewiesen wird. + + mmmmooooddddiiiiffffyyyy berechnet, wieviele Haupt-Seiten beno"tigt werden, um + die bestehenden Tupel unter Beru"cksichtigung des spezi- + fizierten ffffiiiillllllllffffaaaaccccttttoooorrrr so unterzubringen, dass keine + U"berlauf-Seiten im Original notwendig sind. Wenn die Zahl + kleiner als mmmmiiiinnnnppppaaaaggggeeeessss ist, dann wird mmmmiiiinnnnppppaaaaggggeeeessss statt dieses + Wertes verwendet. + + Zum Beispiel: + + modify abgabe to hash on name where fillfactor = 50, + minpages = 1 + + modify abgabe to hash on name where minpages = 150 + + Im ersten Fall garantieren wir, dass nicht mehr Seiten als + notwendig, bei 50% Belegung, benutzt werden. Der zweite + Fall ist typisch fu"r die Modifizierung einer leeren oder + fast leeren Relation. Wenn na"herungsweise die maximale + Gro"sse einer Relation bei ihrer Erstellung bekannt ist, kann + mmmmiiiinnnnppppaaaaggggeeeessss dazu benutzt werden, von Anfang an die Gro"sse der + Relation auf dem Speicher freizuhalten. + + Es ist noch eine andere Option fu"r hhhhaaaasssshhhh zula"ssig, die + sogenannte mmmmaaaaxxxxppppaaaaggggeeeessss + . Ihre Syntax ist die gleiche, wie fu"r mmmmiiiinnnnppppaaaaggggeeeessss + . Sie kann benutzt werden, um die maximale Anzahl der + Haupt-Seiten festzulegen. + + _2._2._4._8. VVVVeeeerrrrddddiiiicccchhhhttttuuuunnnngggg ((((ccccoooommmmpppprrrreeeessssssssiiiioooonnnn)))) + + Die drei Speicherstrukturen ("heap", "hash", "isam") ko"nnen + zusa"tzlich durch ccccoooommmmpppprrrreeeessssssssiiiioooonnnn erga"nzt werden. Das geschieht, + indem die Speicherstrukturen als cccchhhheeeeaaaapppp , cccchhhhaaaasssshhhh und cccciiiissssaaaammmm + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 217 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + geschrieben werden. Verdichtung reduziert intern den + Speicherplatz fu"r jedes Tupel. Die gegenwa"rtige + "compression"-Technik unterdru"ckt nachlaufende bbbbllllaaaannnnkkkkssss (Leer- + zeichen) in den Zeichenkettten-Doma"nen. Die Verwendung von + ccccoooommmmpppprrrreeeessssssssiiiioooonnnn verlangt niemals mehr Platz und normalerweise + wird Speicherplatz gewonnen und ko"nnen die Ausfu"hrungszeit + verku"rzt. Dazu ein Beispiel: + + modify abgabe to cisam on name where fillfactor = 100 + + Es wird aaaabbbbggggaaaabbbbeeee in eine komprimierte iiiissssaaaammmm -Struktur vera"ndert + und jede Seite so weit als mo"glich gefu"llt. Mit ccccoooommmmpppprrrreeeessssssssiiiioooonnnn + kann jedes Tupel eine verschiedene, komprimierte La"nge + erhalten. Dadurch muss die Zahl der Tupel, die in einer + Seite untergebracht werden ko"nnen, davon abha"ngen, wie + erfolgreich die Verdichtung ausgefu"hrt werden konnte. + + Verdichtete Relationen sind aufwendiger zu aktualisieren. + Wenn ein rrrreeeeppppllllaaaacccceeee auf eine oder mehrere Doma"nen ausgefu"hrt + wird und das komprimierte Tupel war ku"rzer, dann muss ING_DB + einen neuen Platz fu"r das Tupel finden. + + _2._2._4._9. ZZZZwwwweeeeiiii VVVVaaaarrrriiiiaaaannnntttteeeennnn zzzzuuuu eeeeiiiinnnneeeemmmm PPPPrrrroooobbbblllleeeemmmm + + Zur Erinnerung, doppelte Tupel werden bei einer hhhheeeeaaaapppp -Rela- + tion nicht gelo"scht. Verschiedentlich ist es wu"nschenswert, + sie zu lo"schen und eine hhhheeeeaaaapppp -Relation zu sortieren. Ein + Weg dazu ist, die Relation zu iiiissssaaaammmm unter Angabe der + Ordnungsmerkmale ( kkkkeeeeyyyyeeeedddd ddddoooommmmaaaaiiiinnnnssss ) zu modifizieren. Eine + Alternative dazu ist entweder die Verwendung von hhhheeeeaaaappppssssoooorrrrtttt + oder cccchhhheeeeaaaappppssssoooorrrrtttt.... Zum Beispiel: + + modify abgabe to heapsort on name, ext + + + Damit wird die Relation nach "name" und dann nach "ext" sor- + tiert. Die Tupel werden zusa"tzlich nach den restlichen + Doma"nen, in der Reihenfolge ihrer urspru"nglichen Angabe beim + ccccrrrreeeeaaaatttteeee -Statement, sortiert, so dass in diesem Fall die + Relation nach "name", dann "ext" und dann "wert" sortiert + wird. Doppelte Tupel werden entfernt. Die Relation wird + als hhhheeeeaaaapppp verlassen. hhhheeeeaaaappppssssoooorrrrtttt und cccchhhheeeeaaaappppssssoooorrrrtttt sind vorgesehen + zum Sortieren von tempora"ren Relationen, bevor sie gedruckt + und gelo"scht werden. Dies ist wesentlich effektiver, als + die Modifizierung zu "isam", da ING_DB kein "directory" + erzeugt, in dem die Schlu"sselinformationen fu"r jede Seite + enthalten sind. Die Relation wird nnnniiiicccchhhhtttt in der Sortierung + gehalten, wenn anschliessend A"nderungen erfolgen. + + Beispiele: + Hier ist eine Sammlung von Beispielen und Erla"uterungen zur + Abarbeitungseffizienz jeder Query. Die Queries basieren auf + den Relationen: + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 218 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + + teile(tnum, tname, farbe, gewicht, menge) + + lieferung(lnum, pnum, jnum, liefdat, menge) + + range of t is teile + range of l is lieferung + + modify teile to hash on tnum + modify lieferung to hash on lnum,jnum + + retrieve (t.all) where t.tnum = 10 + + + ING_DB erkennt, dassteile auf ttttnnnnuuuummmm via hhhhaaaasssshhhh geschlu"sselt + ist und geht direkt auf die Seite, in der "teile" mit der + Nummer 10 gespeichert ist. + + retrieve (t.all) where t.tname = "magnetband" + + ING_DB liest die vollsta"ndige Relation und sucht den + angegebenen "tname". + + retrieve (t.all) where t.tnum < 10 and t.tnum > 5 + + ING_DB liest die vollsta"ndige Relation, weil kein exakter + Wert fu"r "tnum" gegeben war. + + retrieve (l.liefdat) where l.lnum = 471 and l.jnum = + 1008 + + ING_DB erkennt, dass lllliiiieeeeffffeeeerrrruuuunnnngggg auf die Kombination von llllnnnnuuuummmm + und jjjjnnnnuuuummmm via hhhhaaaasssshhhh geschlu"sselt ist und geht direkt zur + richtigen Seite. + + retrieve (l.liefdat) where l.lnum = 471 + + + ING_DB liest die gesamte Relation. lllliiiieeeeffffeeeerrrruuuunnnngggg ist auf die + Kombination von llllnnnnuuuummmm und jjjjnnnnuuuummmm via hhhhaaaasssshhhh geschlu"sselt. Jedoch + wurde ING_DB nur ein Wert von beiden gegeben, es kann den + Vorteil der Speicherstruktur nicht nutzen. + + retrieve (t.tname, l.liefdat) where + t.tnum = l.tnum and l.lnum = 471 and l.jnum = 1008 + + + ING_DB nutzt den Vorteil beider Speicherstrukturen. Es + findet zuerst alle Tupel llll....ttttnnnnuuuummmm und llll....lllliiiieeeeffffddddaaaatttt , bei denen + l.lnum = 471 und l.jnum = 1008 ist. Danach u"berpru"ft es + alle Tupel t.tname, bei denen t.tnum gleich dem korrekten + Wert ist. + + Dieses Beispiel illustriert, dass es manchmal eine gute Idee + ist, eine Relation mit den Doma"nen auf hhhhaaaasssshhhh zu modifizieren, + die mit einer anderen Relation verbunden ( jjjjooooiiiinnnneeeedddd ) sind. + In diesem Fall wa"re das die Frage nach t.tnum = l.tnum. + + ZZZZuuuussssaaaammmmmmmmeeeennnnggggeeeeffffaaaasssssssstttt:::: + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 219 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + Um den Vorteil einer hhhhaaaasssshhhh -Struktur nutzen zu ko"nnen, + beno"tigt ING_DB einen exakten Wert fu"r jede + Schlu"sseldoma"ne. Ein exakter Wert ist soetwas wie: + + l.lnum = 471 + l.tnum = t.tnum + + Ein exakter Wert ist aber nicht: + + l.lnum >= 471 + (l.lnum = 10 or l.lnum = 20) + + Wir wollen nun unsere Aufmerksamkeit einigen Fa"llen zur + Anwendung von "isam" widmen: + + modify lieferung to isam on lnum,liefdat + retrieve (l.all) where l.lnum = 471 + and l.liefdat > "75-12-31" + and l.liefdat < "77-01-01" + + + Da lllliiiieeeeffffeeeerrrruuuunnnngggg auf llllnnnnuuuummmmuuuunnnndddd dann auf lllliiiieeeeffffddddaaaatttt sortiert ist, kann + ING_DB den ganzen Vorteil einer iiiissssaaaammmm -Struktur zur Lokal- + isierung des Bereichs von lllliiiieeeeffffeeeerrrruuuunnnngggg , der die Query + befriedigt, nutzen. + + retrieve (l.all) where l.lnum = 471 + + Im Gegensatz zu hhhhaaaasssshhhh , kann eine iiiissssaaaammmm -Struktur noch verwen- + det werden, wenn nur der erste Schlu"ssel beschafft wird. + + retrieve (l.all) where l.lnum > 400 and l.lnum < 500 + + Wieder wird ING_DB den Vorteil der Struktur nutzen. + + retrieve (l.all) where l.liefdat >= "75-12-31" and + l.liefdat <= "77-01-01" + + + Hier wird ING_DB die vollsta"ndige Relation lesen. Das + geschieht, weil der erste Schlu"ssel (lnum) nicht in der + Query vorgeschlagen wurde. + + ZZZZuuuussssaaaammmmmmmmeeeennnnggggeeeeffffaaaasssssssstttt:::: + + iiiissssaaaammmm gestattet die Beschleunigung des Zugriffs sowohl zu + exakten Werten, als auch zu Wertebereichen. Das funk- + tioniert solange, wie wenigstens der erste Schlu"ssel vom + Nutzer vorgegeben wird. + + Um festzustellen, wo die Tupel in einer "isam"-Relation + stehen, durchsucht ING_DB das "isam-directory" dieser Rela- + tion. Wenn eine Relation nach iiiissssaaaammmm modifiziert wird, werden + die Tupel zuerst sortiert und dabei die doppelten Tupel + gelo"scht. Als na"chstes wird die Relation (unter Verwendung + des ffffiiiillllllllffffaaaaccccttttoooorrrr ), beginnend mit Block 0, 1, 2... und so + weiter, entsprechend der beno"tigten Seitenanzahl gefu"llt. + + Jetzt wird das ddddiiiirrrreeeeccccttttoooorrrryyyy aufgebaut. Die Schlu"sseldoma"nen + des ersten Tupels jeder Seite werden eingesammelt und in ein + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 220 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + ddddiiiirrrreeeeccccttttoooorrrryyyy (in der Relation auf Platte gespeichert) gebracht. + Das ddddiiiirrrreeeeccccttttoooorrrryyyy wird nicht eher gea"ndert, als bis die na"chste + Modifizierung angewiesen wurde. + + Wann immer ein Tupel zu einer Relation hinzugefu"gt wird, + wird das ddddiiiirrrreeeeccccttttoooorrrryyyy durchsucht, um die Seite zu finden, in + der das neue Tupel untergebracht werden muss. Damit bleiben + in dieser Seite die einzelnen Tupel nnnniiiicccchhhhtttt genau sortiert. + Das ist auch mit der na"herungsweisen ( aaaapppppppprrrrooooxxxxiiiimmmmaaaatttteeeellllyyyy ) Sor- + tierung im obigen Kapitel gemeint. + + _2._2._4._1_0. VVVVeeeerrrrgggglllleeeeiiiicccchhhh vvvvoooonnnn hhhheeeeaaaapppp,,,, hhhhaaaasssshhhh uuuunnnndddd iiiissssaaaammmm + + Wir wollen einmal die Vor- und Nachteile der einzelnen + Speicherstrukturen vergleichen. Eine Relation wird immer + als hhhheeeeaaaapppp erzeugt. hhhheeeeaaaapppp ist die gu"nstigste Struktur fu"r das + erstmalige Auffu"llen einer Relation bei Verwendung von ccccooooppppyyyy + oder aaaappppppppeeeennnndddd.... + + Der Platz von gelo"schten Tupeln bei hhhheeeeaaaapppp wird nur in der + letzten Seite wiederverwendet. Ein Test auf doppelte Tupel + wird bei hhhheeeeaaaapppp -Relationen nicht ausgefu"hrt. + + "hash" ist vorteilhaft fu"r die Lokalisierung von Tupeln, + sofern sie in der Qualifikation ( wwwwhhhheeeerrrreeee -Klausel) durch + einen exakten Wert referenziert werden. Die Haupt-Seite von + Tupeln kann mit einem vorgegebenen Wert leicht ermittelt + werden. + + iiiissssaaaammmm ist gebra"uchlich fu"r exakte Werte und Wertebereiche. + Weil das "isam-directory" durchsucht werden muss, um die + Tupel zu lokalisieren, ist iiiissssaaaammmm nicht so effektiv wie hhhhaaaasssshhhh.... + + _2._2._4._1_1. UUUU""""bbbbeeeerrrrllllaaaauuuuffff----SSSSeeeeiiiitttteeeennnn + + Wenn ein Tupel eingefu"gt wird und sich kein freier Raum mehr + auf der Haupt-Seite einer Relation befindet, dann wird eine + U"berlauf-Seite erzeugt. Wenn mehr Tupel eingefu"gt werden, + als eine U"berlauf-Seite aufnimmt, werden weitere Seiten + angeha"ngt. Obwohl U"berlauf-Seiten notwendig sind, vermin- + dern sie die Geschwindigkeit des Systems bei Ausfu"hrung von + Recherchen und uuuuppppddddaaaatttteeee + + Beispielsweise wollen wir annehmen das "lieferung" auf llllnnnnuuuummmm + via hhhhaaaasssshhhh geschlu"sselt wird und 10 Haupt- Seiten hat. + Angenommen der Wert lnum = 3 fa"llt auf Seite 7. Um alle + Tupel mit lnum = 3 zu finden, bezieht ING_DB in die Suche + die Haupt-Seite 7 und alle zu Seite 7 geho"rigen U"berlauf- + Seiten ein (, sofern es welche gibt). Je mehr U"berlauf- + Seiten einbezogen werden mu"ssen, um so mehr Zeit wird + beno"tigt, um nach lnum = 3 zu recherchieren. Um doppelte + Tupel bei iiiissssaaaammmm und hhhhaaaasssshhhh lo"schen zu ko"nnen, muss ebenfalls + bei aaaappppppppeeeennnndddd und rrrreeeeppppllllaaaacccceeee die Suche u"ber alle Seiten ausgefu"hrt + werden. + + Wenn eine hhhhaaaasssshhhh - oder iiiissssaaaammmm -Relation zu viele U"berlauf- + Seiten hat, empfiehlt es sich, sie erneut zu hhhhaaaasssshhhh oder iiiissssaaaammmm + zu modifizieren. Damit wird die Relation bereinigt und es + werden soviele U"berlauf-Seiten als mo"glich eliminiert. + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + diff --git a/WEGA/contrib/ingres/dbs/ing_doc/teil2/doc2_ac b/WEGA/contrib/ingres/dbs/ing_doc/teil2/doc2_ac new file mode 100644 index 0000000..11a4452 --- /dev/null +++ b/WEGA/contrib/ingres/dbs/ing_doc/teil2/doc2_ac @@ -0,0 +1,2160 @@ + + + + Anwendung - 221 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + _2._2._4._1_2. EEEEiiiinnnnddddeeeeuuuuttttiiiiggggeeee SSSScccchhhhlllluuuu""""sssssssseeeellll + + Bei der Wahl des Schlu"ssels ( kkkkeeeeyyyyeeeedddd ddddoooommmmaaaaiiiinnnn ) einer Relation + ist es wu"nschenswert, weitgehende Eindeutigkeit zu + erreichen. Beispielsweise treten bei Personalnummern keine + doppelten Nummern auf, wa"hrend bei solchen Begriffen, wie + "Farbe" nur einige wenige verschiedene Werte und manchmal, + wie bei "Geschlecht" bekanntermassen nur zwei Werte auf- + treten ko"nnen. + + Wenn eine Relation auf die Doma"ne "geschlecht" via hhhhaaaasssshhhh + geschlu"sselt wird, ko"nnen sie erwarten, dass alle ma"nnlichen + Objekte auf einer Haupt-Seite und dazugeho"rigen U"berlauf- + Seiten untergebracht werden, ebenso auch alle weiblichen. + Mit einer hhhhaaaasssshhhh -Relation gibt es keine Lo"sung dieses Prob- + lems. Es muss ein Kompromiss zwischen den in der Qualifika- + tion am ha"ufigsten verwendeten Schlu"sseln und der Eindeutig- + keit der Schlu"sselwerte gefunden werden. + + Da der Vorteil der iiiissssaaaammmm -Struktur solange genutzt werden + kann, als zumindest der erste Schlu"ssel vorgegeben wird, + ko"nnen unter Umsta"nden weitere Doma"nen zum Schlu"ssel + hinzugefu"gt werden, um die Eindeutigkeit desselben zu + erho"hen. Nehmen wir beispielsweise an, dass die Relation + "lieferung" nur 10 verschiedene Lieferanten, aber tausende + Tupel hat. Die Wahl einer iiiissssaaaammmm -Struktur, mit den + Schlu"sseln llllnnnnuuuummmm und jjjjnnnnuuuummmm wird wahrscheinlich viel mehr ein- + deutige Schlu"ssel ergeben. Wie auch immer, die Gro"sse des + "directories" wird zunehmen und folglich dauert die Suche + immer la"nger. Wenn sie zur Erho"hung der Eindeutigkeit des + Schlu"ssels weitere Doma"nen zu Schlu"ssel hinzufu"gen, ver- + suchen sie mo"glichst die ku"rzesten auszuwa"hlen. + + _2._2._4._1_3. SSSSyyyysssstttteeeemmmmkkkkaaaattttaaaallllooooggggeeee + + ING_DB verwendet sieben Kataloge ( rrrreeeellllaaaattttiiiioooonnnn , rrrreeeeffffeeeerrrreeeennnncccceeeessss , + aaaattttttttrrrriiiibbbbuuuutttteeee , iiiinnnnddddeeeexxxxeeeessss , ttttrrrreeeeeeee , pppprrrrooootttteeeecccctttt und iiiinnnnttttggggrrrriiiittttiiiieeeessss ), um + Datenbanken zu verwalten und zu organisieren. Der rrrreeeellllaaaattttiiiioooonnnn + -Katalog hat ein Tupel fu"r jede Relation in der Datenbank. + Der aaaattttttttrrrriiiibbbbuuuutttteeee -Katalog hat ein Tupel fu"r jedes Attribut in + jeder Relation. Der iiiinnnnddddeeeexxxxeeeessss -Katalog hat ein Tupel fu"r + jeden Sekunda"rindex. + + ING_DB greift auf diese Kataloge in einer bestimmten Art + und Weise zu. Das Programm ssssyyyyssssmmmmoooodddd sollte verwendet werden, + um diese Kataloge auf vordefinierten Doma"nen via hhhhaaaasssshhhh zu + modifizieren. Um ssssyyyyssssmmmmoooodddd anzuwenden, gibt der Datenbankad- + ministrator ein + + % sysmod Datenbankname + + ssssyyyyssssmmmmoooodddd sollte unmittelbar nach der Gru"ndung einer Datenbank + abgearbeitet werden, bzw. nachdem die Relationen erzeugt + wurden. Die Datenbank ist nun aufgebaut. Es ist nicht + ausreichend, ssssyyyyssssmmmmoooodddd einmal zu starten und es dann zu ver- + gessen. Ein wiederholter Start von ssssyyyyssssmmmmoooodddd u"berarbeitet die + Systemkataloge. Durch die Anwendung werden die meisten + U"berlauf-Seiten gelo"scht und die Systemantwortzeit in + vielerlei Hinsicht verbessert. + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 222 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + _2._2._5. SSSSeeeekkkkuuuunnnnddddaaaa""""rrrriiiinnnnddddiiiizzzzeeeessss + + Die Verwendung einer iiiissssaaaammmm - oder hhhhaaaasssshhhh -Struktur gestattet, + schnell die Tupel einer Relation zu finden und die Werte + entsprechend der Schlu"seldoma"nen zu u"bergeben. Manchmal ist + das aber nicht genug. Nehmen wir beispielsweise an, wir + ha"tten die "abgabe"-Relation + + abgabe(name, wert, ext) + + auf nnnnaaaammmmeeee via hhhhaaaasssshhhh geschlu"sselt. Es ergibt sich ein + schneller Zugriff fu"r Queries mit einem exakten Wert fu"r + nnnnaaaammmmeeee in der Qualifikation ( wwwwhhhheeeerrrreeee -Klausel). Doch was ist, + falls wir den Queries einen exakten Wert fu"r eeeexxxxtttt u"bergeben + wollen? + + aaaabbbbggggaaaabbbbeeee kann entweder fu"r nnnnaaaammmmeeee oder eeeexxxxtttt auf hhhhaaaasssshhhh gesetzt wer- + den, wir ko"nnen wa"hlen, was anwendungsfreundlicher ist und + aaaabbbbggggaaaabbbbeeee auf diese Doma"ne setzen. Die andere Doma"ne (sagen + wir "ext") kann einen Sekunda"rindex (secondary index) haben. + Ein Sekunda"rindex ist eine Relation, die die exakte Position + der Tupel zu jedem eeeexxxxtttt in der Relation aaaabbbbggggaaaabbbbeeee entha"lt. + + Das Kommando zur Erzeugung eines Sekunda"rindexes ist: + + index on abgabe is abgext (ext) + + Die allgemeine Form lautet: + + index on relation_name is secondary_index_name (domains) + + Nun beauftragen wir ING_DB , einen Sekunda"rindex in der + Relation aaaabbbbggggaaaabbbbeeee zu erzeugen. Die Doma"ne die indiziert wer- + den soll, ist eeeexxxxtttt.... Indizes werden in drei Schritten gebil- + det: + + 1. aaaabbbbggggeeeexxxxtttt erzeugt ein hhhheeeeaaaapppp.... + + 2. Fu"r jedes Tupel in aaaabbbbggggaaaabbbbeeee , wird ein Tupel mit dem Wert + fu"r eeeexxxxtttt und der genauen Position des korrespondierenden + Tupels in aaaabbbbggggaaaabbbbeeee in aaaabbbbggggeeeexxxxtttt eingefu"gt. + + 3. Standardma"ssig wird aaaabbbbggggeeeexxxxtttt zu iiiissssaaaammmm modifiziert. + + Wenn wir jetzt die Query + + range of a is abgabe + retrieve(a.wert) where a.ext = 207 + + starten, wird ING_DB automatisch zuerst in aaaabbbbggggeeeexxxxtttt + nachsehen, um ext = 207 zu finden. Wenn es dort ein Tupel + findet, geht es direkt zum Tupel in der aaaabbbbggggaaaabbbbeeee -Relation. + Da aaaabbbbggggeeeexxxxtttt auf iiiissssaaaammmm fu"r eeeexxxxtttt gesetzt wurde, wird die Suche + nach ext = 207 natu"rlich ebenfalls schnell erledigt sein. + + Wenn sie die Query + + retrieve(a.wert) where a.name = "frank" + + starten, dann wird ING_DB in der hhhhaaaasssshhhh -Struktur der + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 223 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + Relation aaaabbbbggggaaaabbbbeeee versuchen fortzufahren, um die qualifizier- + ten Tupel zu lokalisieren. + + Da Sekunda"rindizes eigensta"ndige Relationen sind, ko"nnen sie + auch (entweder) hhhhaaaasssshhhh,,,, iiiissssaaaammmm,,,, cccchhhhaaaasssshhhh oder cccciiiissssaaaammmm sein. Es ist + nicht vernu"nftig, einen Sekunda"rindex auf hhhheeeeaaaapppp zu setzen. + + Die Beurteilung, welche Struktur geeignet ist, ergibt sich + aus den Erkenntnissen, die zuvor diskutiert wurden: + + Werden die Doma"nen durch exakte Werte referenziert? + Werden sie durch Wertebereiche referenziert? + etc. + + In dem Fall, wo die eeeexxxxtttt -Doma"ne durch exakte Werte referen- + ziert und die Relation beinahe gefu"llt ist, ko"nnen wir fol- + gendes tun: + + modify abgext to hash on ext where fillfactor = 100 + and minpages = 1 + + Sekunda"rindizes stellen in ING_DB einen Weg dar, u"ber + Doma"nen auf Tupel zuzugreifen, die keine Schlu"ssel sind. + Eine Relation kann eine beliebige Anzahl von Sekunda"rindizes + haben und ausserdem kann jeder Sekunda"rindex ein Index auf + bis zu sechs Doma"nen einer Prima"rrelation sein. + + Wenn ein Tupel in einer Prima"rrelation ersetzt (replaced), + gelo"scht (deleted) oder angeha"ngt (appended) wird, mu"ssen + alle Sekunda"rindizes auch aktualisiert werden, die Indizes + kosten was. Sie erho"hen den Aufwand zur Aktualisierung der + Prima"rrelation, aber sie ko"nnen den Aufwand zum Auffinden + von Tupel in der Prima"rrelation erheblich senken. + + Ob ein Sekunda"rindex die Geschwinigkeit der Recherche erho"ht + oder nicht, ha"ngt von der Eindeutigkeit der Werte der + indizierten Doma"nen ab. Die Hauptfrage bleibt, ob eine + indirekte Suche u"ber den Index effizienter als das Durch- + suchen der gesamten Prima"rrelation ist. Allgemein ist es + effektiver, wenn die Anzahl der Tupel, die die Qualifikation + ( where -Klausel) erfu"llen, kleiner ist, als die Gesamtzahl + der Seiten (Haupt- und U"berlauf-Seiten) der Prima"rrelation. + + Beispielsweise wollen wir ha"ufig alle Personen wissen, die + weniger als fu"nf Mark verdienen, dann beachten sie den + erzeugten Index + + index on abgabe is abgwert (wert) + + Standardma"ssig wird aaaabbbbggggwwwweeeerrrrtttt eine iiiissssaaaammmm -Struktur auf wwwweeeerrrrtttt.... + Wenn ING_DB die Query + + retrieve(a.name) where a.wert < 5.0 + + ausfu"hrt, wird auf a.wert < 5.0 im Sekunda"rindex lokalisiert + und fu"r jedes Tupel das gefunden wird, das korrespondierende + Tupel in aaaabbbbggggaaaabbbbeeee geholt. Die Tupel in aaaabbbbggggwwwweeeerrrrtttt sind nach wert + sortiert, die Tupel in aaaabbbbggggaaaabbbbeeee jedoch nicht. Damit wird im + Allgemeinen jedes Tupel von aaaabbbbggggaaaabbbbeeee u"ber aaaabbbbggggwwwweeeerrrrtttt adressiert, + die sich aber auf verschiedenen Seiten befinden. Solche + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 224 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + Recherchen u"ber einen Sekunda"rindex erfordern mehr Seiten- + leseoperationen (IO's), als wenn die Prima"rrelation aaaabbbbggggaaaabbbbeeee + sequentiell gelesen worden wa"re. In solchen Fa"llen ist die + Erzeugung eines Sekunda"rindex' nicht zu empfehlen. + + _2._2._6. WWWWiiiieeeeddddeeeerrrrhhhheeeerrrrsssstttteeeelllllllluuuunnnngggg ((((RRRReeeeccccoooovvvveeeerrrryyyy)))) uuuunnnndddd + AAAAkkkkttttuuuuaaaalllliiiissssiiiieeeerrrruuuunnnngggg ((((UUUUppppddddaaaatttteeee)))) + + + _2._2._6._1. EEEEiiiinnnnffffuuuu""""hhhhrrrruuuunnnngggg + + ING_DB wurde sorgfa"ltig entworfen, um die Integrita"t der + Datenbank bei bestimmten Arten von Systemfehlern zu + schu"tzen. Um das ING_DB zu ermo"glichen, wird bei der + Ausfu"hrung von Aenderungen mit dem sogenannten ddddeeeeffffeeeerrrrrrrreeeedddd + uuuuppppddddaaaatttteeee (verzo"gerte Aktualisierung) oder bbbbaaaattttcccchhhhffffiiiilllleeee uuuuppppddddaaaatttteeee + (gepufferte Dateiaktualisierung) gearbeitet. Weiterhin gibt + es in ING_DB zwei Programme rrrreeeessssttttoooorrrreeee (wiederherstellen) und + ppppuuuurrrrggggeeee (reinigen), die verwendet werden ko"nnen, um nach auf- + getretenen Systemfehlern die Datenbank zu testen und wieder + in Ordnung zu bringen. Wir wollen zuerst diskutieren, wie + "deferred updates" erzeugt und ausgefu"hrt werden und uns + danach mit der Verwendung von ppppuuuurrrrggggeeee und rrrreeeessssttttoooorrrreeee + bescha"ftigen. + + _2._2._6._2. DDDDeeeeffffeeeerrrrrrrreeeedddd UUUUppppddddaaaatttteeee uuuunnnndddd BBBBaaaattttcccchhhh UUUUppppddddaaaatttteeee + + + _2._2._6._2._1. UUUU""""bbbbeeeerrrrssssiiiicccchhhhtttt + + ddddeeeeffffeeeerrrrrrrreeeedddd uuuuppppddddaaaatttteeee kann man mit verzo"gerter Aktualisierung + u"bersetzen. + + Ein aaaappppppppeeeennnndddd -, rrrreeeeppppllllaaaacccceeee - oder ddddeeeelllleeeetttteeee -Kommando wird in + vier Schritten ausgefu"hrt: + + 1. Ein leeres bbbbaaaattttcccchhhhffffiiiilllleeee (Pufferfile) wird erzeugt. + + 2. Das Kommando wird ausgefu"hrt und jede Aenderung der + Relation wird in das bbbbaaaattttcccchhhhffffiiiilllleeee geschrieben. + + 3. Das bbbbaaaattttcccchhhhffffiiiilllleeee wird gelesen und die Relation und ihre + Sekunda"rindizes (falls vorhanden) werden aktualisiert. + + 4. Das bbbbaaaattttcccchhhhffffiiiilllleeee wird zersto"rt und ING_DB kehrt zum Nutzer + zuru"ck. + + Das ddddeeeeffffeeeerrrrrrrreeeedddd uuuuppppddddaaaatttteeee verzo"gert die wirkliche A"nderung bis zum + tatsa"chlichen Ende der Query. Diese Vorgehensweise hat drei + Vorteile: + + _2._2._6._2._2. BBBBeeeesssseeeeiiiittttiiiigggguuuunnnngggg ddddeeeerrrr AAAAuuuusssswwwwiiiirrrrkkkkuuuunnnngggg vvvvoooonnnn SSSSyyyysssstttteeeemmmmffffeeeehhhhlllleeeerrrrnnnn + + Falls das System wa"hrend einer Aktualisierung zusammenbricht + ( ccccrrrraaaasssshhhh ), kann das ING_DB -Recovery-Programm entscheiden, + entweder die A"nderung zu Ende auszufu"hren oder durch bbbbaaaacccckkkk + oooouuuutttt (Ablehnung) die A"nderung zuru"ckzusetzen und die Relation + in dem Zustand zu belassen, in dem sie sich vorher befand. + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 225 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + _2._2._6._3. DDDDiiiieeee VVVVeeeerrrrhhhhiiiinnnnddddeeeerrrruuuunnnngggg eeeennnnddddlllloooosssseeeerrrr QQQQuuuueeeerrrriiiieeeessss + + Falls aaaabbbbggggaaaabbbbeeee ein hhhheeeeaaaapppp wa"re und die Query + + range of a is abgabe + append to abgabe(a.all) + + wu"rde ohne ddddeeeeffffeeeerrrrrrrreeeedddd uuuuppppddddaaaatttteeee ausgefu"hrt, dann wird die + Ausfu"hrung erst bei U"berlauf des Plattenspeichers bzw. wenn + kein freier Platz mehr vorhanden ist, beendet! Das + geschieht deshalb, weil ING_DB mit dem Lesen der Relation + vorn anfa"ngt und jedes Tupel an das Ende angeha"ngt (append) + wird. Es wu"rde bald beginnen, die Tupel zu lesen, die kurz + vorher angeha"ngt worden sind und unendlich fortsetzen, um + das Ende zu erhaschen, das immer wieder entschwindet. + + Obwohl diese Query sicherlich nicht typisch ist, illustriert + sie das Problem. Es gibt bestimmte Klassen von Queries, bei + denen Probleme durch aktualisierte Ablagen beru"hrt werden, + die nicht pra"zise definiert sind. Mit dem ddddeeeeffffeeeerrrrrrrreeeedddd uuuuppppddddaaaatttteeee + kann garantiert werden, dass die Ergebnisse konsistent und + logisch sind. + + _2._2._6._3._1. BBBBeeeesssscccchhhhlllleeeeuuuunnnniiiigggguuuunnnngggg ddddeeeerrrr AAAA""""nnnnddddeeeerrrruuuunnnnggggsssszzzzeeeeiiiitttteeeennnn + vvvvoooonnnn SSSSeeeekkkkuuuunnnnddddaaaa""""rrrriiiinnnnddddiiiizzzzeeeessss + + Sekunda"rindizes ko"nnen schneller aktualisiert werden, wenn + alle A"nderungen auf einmal ausgefu"hrt werden, anstatt jede + A"nderung einzeln. Das schliesst auch den Schutz ein, dass + der Sekunda"rindex die Uebereinstimmung mit der + Prima"rrelation beha"lt. + + _2._2._6._3._2. AAAAbbbbsssscccchhhhaaaalllltttteeeennnn ddddeeeessss ddddeeeeffffeeeerrrrrrrreeeedddd uuuuppppddddaaaatttteeee + + Wenn sie von diesen Argumenten nicht u"berzeugt wurden, ge- + stattet ING_DB auch, das "deferred update" abzuschalten! + Tatsa"chlich gibt es sicher Fa"lle, wo es angebracht ist (aber + natu"rlich nicht notwendig), die A"nderung direkt auszufu"hren, + d.h. die Relation wird wa"hrend der Query gea"ndert. + + Um die direkte A"nderung anzuwenden, mu"ssen sie die Erlaubnis + des ING_DB - Systemadministrators haben. Wenn sie das ----bbbb + -Flag beim Start von ING_DB verwenden, wird das ddddeeeeffffeeeerrrrrrrreeeedddd + uuuuppppddddaaaatttteeee ausgeschaltet. + + % quel -b meindb + + ING_DB verwendet die direkte A"nderung nur fu"r Relationen + ohne Sekunda"rindizes. Die Anwendung des ddddeeeeffffeeeerrrrrrrreeeedddd uuuuppppddddaaaatttteeee + wird fu"r Relationen mit Sekunda"rindex stillschweigend immer + benutzt. Bei Nutzung des ----bbbb -Flag mu"ssen sie auf die oben + genannten Vorteile der verzichten. In den meisten Fa"llen + sollte man das ----bbbb -Flag nnnniiiicccchhhhtttt aaaannnnwwwweeeennnnddddeeeennnn.... + + Wenn sie ING_DB so benutzen, dass sie interaktiv nur ein + Tupel eingeben oder a"ndern, ist es etwas gu"nstiger das + ddddeeeeffffeeeerrrrrrrreeeedddd uuuuppppddddaaaatttteeee abzuschalten. Wenn das System wa"hrend einer + A"nderung zusammenbricht, ist die eingebende Person in der + Lage, festzustellen, ob das Tupel gea"ndert wurde oder nicht. + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 226 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + _2._2._6._4. RRRReeeessssttttoooorrrreeee + + ING_DB ist so entworfen, dass nach fast allen Typen von + Systemabstu"rzen ein Recovery mo"glich ist, falls das UNIX + -File-System konsistent geblieben ist. Das betrifft die + A"nderungskommandos, das uuuuppppddddaaaatttteeee -, ccccrrrreeeeaaaatttteeee -, ddddeeeessssttttrrrrooooyyyy -, + mmmmooooddddiiiiffffyyyy - und auch das iiiinnnnddddeeeexxxx -Kommando. + + ING_DB wurde auf ppppeeeerrrrffffeeeekkkktttteeee SSSSiiiicccchhhheeeerrrrhhhheeeeiiiitttt entworfen. Wenn + irgendeine Nichtu"bereinstimmung entdeckt oder irgendein + Mangel von UNIX zuru"ckgegeben wurde, generiert ING_DB eine + System-Error-Mitteilung (SYSERR) und bricht ab. + + Wenn UNIX zusammenbricht, wa"hrend ING_DB arbeitet, oder ein + ING_DB -SYSERR auftritt, ist es generell sinnvoll, dass der + Datenbankadministrator das Kommando + + % restore data_base_name + + gibt. Das Restore-Programm erfu"llt folgende Funktionen: + + 1. Es pru"ft die """"bbbbaaaattttcccchhhhffffiiiilllleeeessss"""".... Wenn es eins findet, pru"ft + es jedes, um festzustellen, ob es komplett ist. Wenn + der System-crash auftrat, wa"hrend das bbbbaaaattttcccchhhhffffiiiilllleeee gerade + gelesen und auf die Datenbank ausgegeben wurde, dann + holt rrrreeeessssttttoooorrrreeee die A"nderung nach. Falls andererseits das + bbbbaaaattttcccchhhhffffiiiilllleeee noch nicht vollsta"ndig war, wird es einfach + zersto"rt, damit ist es so, als wa"re die Query noch + nicht ausgefu"hrt. + + 2. Test auf unvollsta"ndige mmmmooooddddiiiiffffyyyy -Kommandos. Dieser + Schritt ist entscheidend. Er garantiert, dass sie + entweder die Relation so vorfinden, wie vor der Modifi- + kation, oder rrrreeeessssttttoooorrrreeee ist in der Lage das mmmmooooddddiiiiffffyyyy -Kom- + mando zu vervollsta"ndigen. mmmmooooddddiiiiffffyyyy arbeitet so, dass es + eine neue Kopie der Relation in der neuen Struktur + erzeugt. Wenn es dann fertig ist, ersetzt es die alte + Relation, es speichert die neuen Informationen in ein + mmmmooooddddiiiiffffyyyy bbbbaaaattttcccchhhhffffiiiilllleeee (modifiziertes Pufferfile). Das + befa"higt rrrreeeessssttttoooorrrreeee den Stand unfertiger Modifizierungen + festzustellen. + + 3. Test auf die Uebereinstimmung der Systemrelationen. + Dieser Test wird verwendet, um ddddeeeessssttttrrrrooooyyyy -Kommandos zu + vervollsta"ndigen, ccccrrrreeeeaaaatttteeee -Kommandos zuru"ckzusetzen und + iiiinnnnddddeeeexxxx -Kommandos zuru"ckzusetzen oder zu + vervollsta"ndigen, die durch einen System-crash unter- + brochen wurden. + + 4. Bereinigung tempora"rer Relationen und Files. rrrreeeessssttttoooorrrreeee + fu"hrt das ppppuuuurrrrggggeeee -Programm aus, um tempora"re Relationen + und tempora"re Files, die vom System erzeugt wurden, zu + lo"schen. ppppuuuurrrrggggeeee wird etwas spa"ter detaillierter disku- + tiert. + + rrrreeeessssttttoooorrrreeee kann dem Nutzer nicht sagen, welche Queries + ausgefu"hrt wurden und welche nicht. Es kann nur die Queries + erkennen, die gerade liefen, als der crash erfolgte. Falls + Queries auch gerettet werden sollen, ist es am besten, sie + in ein File auszugeben. Gegebenenfalls kann der Monitor + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 227 - DDDDaaaatttteeeennnnbbbbaaaannnnkkkk + + + jede Query oder eine Folge von Queries ausgeben und der + Nutzer spa"ter erkennen, welche Queries ausgefu"hrt wurden. + + rrrreeeessssttttoooorrrreeee hat mehrere Optionen zur Erweiterung seiner Anwend- + barkeit, die durch Flags spezifiziert werden. Die Optionen + ermo"glichen: + + -a fragt vor der Ausfu"hrung + + -f verwendet fu"r ppppuuuurrrrggggeeee ; lo"scht tempora"re Files; + + -p verwendet fu"r ppppuuuurrrrggggeeee ; lo"scht verfallene Relationen; + + no_database erneuert alle Datenbanken, fu"r die sie DBA sind; + + Von diesen Optionen ist ----aaaa die wichtigste. Es kann + geschehen, dass durch einen UNIX -crash eine Seite des Sys- + temkataloges bescha"digt wird. Das kann dazu fu"hren, dass + rrrreeeessssttttoooorrrreeee eine Relation austra"gt (zersto"rt). In Wirklichkeit + wollen sie lieber zur Beseitigung des Problems die Systemka- + taloge flicken ( ppppaaaattttcccchhhh ), um korrekt weiterarbeiten zu + ko"nnen. Aber kein rrrreeeessssttttoooorrrreeee -Programm kann fu"r alle + Mo"glichkeiten eingerichtet werden. Es ist deshalb kein + Ersatz (glu"cklicherweise !) fu"r den Menschen. + + Wenn ----aaaa spezifiziert ist, teilt rrrreeeessssttttoooorrrreeee mit, was es tun + wu"rde und fragt dazu nach der Erlaubnis. Es liest von + Standard-Input und akzeptiert yyyy als Anweisung zur Ausfu"hrung + und die u"brigen Zeichen als Ablehnung. Beispielsweise, wenn + bei rrrreeeessssttttoooorrrreeee vor Ausfu"hrung gefragt werden soll, geben sie + + restore -a meindb + + Wenn sie auf alle Fragen nnnneeeeiiiinnnn antworten wollen, so geben sie + + restore -a meindb ) auf 12 Bytes + verla"ngert; + dabei wird das erste in 2. bis 11. Position gefundene + "_" () durch "/" () ersetzt; + + den 12 Bytes werden 2 Bytes als Code des arbeitenden + Nutzers (s. auch -u-Flag bei quel(unix) im Referenz- + Manual) angefu"gt. + + Dadurch wird es mo"glich, dass + + - verschiedene Nutzer private Relationen gleichen Namens + in der gleichen Datenbank anlegen ko"nnen; + + - ein Nutzer durch sinnvolle Verwendung des + im Relationennamen die Verteilung der Relationen auf + das Wurzel-directory dbname oder in sub-directories von + dbname steuern kann. + + + + + + + + + + + + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 238 - MMMMoooonnnniiiittttoooorrrr + + + _2._4. MMMMoooonnnniiiittttoooorrrr ******** + + + + + + + + + + + + + _2._4._1. EEEEiiiinnnnffffuuuu""""hhhhrrrruuuunnnngggg + + Der Monitor realisiert die interaktive Arbeit mit dem DBS + ING_DB . Die Monitor-Kommandos erlauben in Zusammenarbeit + mit einem Editor und dem ING_DB -Makro-Prozessor gewisse + Manipulationen an einem Text von QUEL-Statements, bevor + diese aus dem Monitor-Puffer an den ING_DB -Parser zur + Analyse und zur Veranlassung ihrer Ausfu"hrung u"bergeben wer- + den. Die Monitor-Kommandos erlauben die Steuerung der + Arbeit mit ING_DB aus vorgefertigten Kommandofiles, die + Monitor-Kommandos, Makro-Anweisungen und QUEL-Statements + enthalten ko"nnen. + Der Monitor ist der front_end_process des DBS ING_DB . Er + liest einen Eingabetext - prima"r von standard_input - und + analysiert diesen auf Monitor-Kommandos. Der Monitor fu"hrt + in seinem Eingabetext gefundene Monitor-Kommandos sofort + aus, anderer Text wird in den Monitor-Puffer gestellt. + Beispiele fu"r eine komplexe Anwendung des Monitors sind erst + in Verbindung mit Makros interessant und finden sich in der + "Beschreibung des Makro-Prozessors" und dem Kapitel + "Beispiele fu"r Monitor und Makro-Prozessor". + + _2._4._2. MMMMooooddddiiiiffffiiiikkkkaaaattttiiiioooonnnneeeennnn dddduuuurrrrcccchhhh OOOOppppttttiiiioooonnnneeeennnn + + Der Monitor wird durch folgende Optionen gesteuert: + + -d Unterdru"ckung der Ausgabe des dayfile + (s. Startvorgang und Arbeitszyklus) + -s Unterdru"ckung der Ausgabe von Prompt-Meldungen + (s. Startvorgang und Arbeitszyklus) + -a Unterdru"ckung des automatischen Lo"schens des + Monitor-Puffers + (Ausschalten des autoclear_modus) + (s.Arbeit mit dem Monitor-Puffer) + + + _2._4._3. SSSSttttaaaarrrrttttvvvvoooorrrrggggaaaannnngggg uuuunnnndddd AAAArrrrbbbbeeeeiiiittttsssszzzzyyyykkkklllluuuussss + + Beim Start von ING_DB wird neben dem DBS der Monitor ge- + startet. + + Der Monitor definiert den Makro + + "{pathname}" + + mit dem Pfadnamen des ING_DB -File-Systems. (Folgend wird + in diesem Kapitel ein File_name unter diesem Pfadnamen mit + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 239 - MMMMoooonnnniiiittttoooorrrr + + + + ing_db/ + + symbolisiert.) + + Der Monitor definiert weiter den Makro + + "{usercode}" + + mit dem 2-Byte-\*(yy-Usercode (s. usersfile des arbeitenden + Nutzers. + + Der Monitor meldet sich durch Ausgabe der + + ING_DB + -login-Meldung + + "ing_db version login + " + + + Diese Ausgabe wird durch die Option "-s" unterdru"ckt. + Anschliessend wird das + + ing_db/sys/etc/dayfile + + angelistet, was durch die Option "-d" unterdru"ckt werden + kann. Mit der Ausgabe des dayfile sollen den ING_DB + -Nutzern aktuelle Informationen vermittelt werden. Da es + allen Nutzern angeboten wird, ist es nicht zur Aufnahme + nutzerspezifischer Informationen geeignet. + + Durch den Monitor werden danach nacheinander die Monitor- + Kommandos + + \include ing_db/sys/etc/startup + \include + + automatisch ausgefu"hrt, was zur Abarbeitung von Kommandofol- + gen fu"hren kann, falls generell im startupfile fu"r ING_DB , + oder spezifisch fu"r den Nutzer (Angabe im 7.Feld der Nutzer- + zeile des ing_db/sys/etc/users) solche Files angelegt wurden + (s. auch \include-Kommando). + + Danach geht der Monitor in den Eingabe-Status und beginnt + seinen Arbeitszyklus. + + Zu Beginn des Eingabe-Status meldet sich der Monitor mit den + Prompt-Meldungen + + " ING_db>" + + wenn der Monitor-Puffer leer ist, oder mit + + " ING_db:" + + wenn der Monitor-Puffer nicht leer ist und zeigt seine + Eingabebereitschaft durch das + + Prompt-Symbol "* " + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 240 - MMMMoooonnnniiiittttoooorrrr + + + zu jedem Zeilenanfang. Die Ausgabe der Prompt-Meldungen und + auch des Prompt-Symbols wird durch die Option "-s" + unterdru"ckt. Davon unberu"hrt bleibt die Ausgabe aller + anderen folgend aufgeza"hlten Meldungen zur Fehleranzeige. + + Der Monitor liest den Eingabetext in den Monitor-Puffer, + filtert die Monitor-Kommandos heraus und fu"hrt diese sofort + aus. + + Das spezielle Monitor-Kommando \go (s.dort) u"bergibt den + Monitor-Puffer an den Parser, der die QUEL-Statements + analysiert und ausfu"hren la"sst. Mit U"bernahme dieses Kom- + mendos meldet der Monitor + + "ING_db . . . " + + (diese Meldung unterbleibt, wenn die Option "-s" gesetzt + ist) und versetzt sich in einen Warte-Status. + + Der Monitor wird nach Abschluss der Arbeiten des Parsers und + den, diesen nachgelagerten weiteren ING_DB -Prozessen, + wieder in den Eingabe-Status versetzt und beginnt erneut + seinen Arbeitszyklus. + + Nach Start von ING_DB arbeitet der Monitor von + standard_input (i.d.R. also vom Terminal). Durch ein + \include-Kommando (s. dort) arbeitet er danach file- + gesteuert, sein included_file ist der Eingabetextspender. + Da man die Files hintereinander liegender \include-Kommandos + als Programm-Ebenen betrachten kann, sagen wir, der Monitor + arbeitet nach Start in der Basis-Terminal-Ebene und durch + \include-Kommandos in darunter liegenden Programm-Ebenen. + + Die Ausgaben des Monitor erfolgen immer auf standard_output + (i.d.R. also ebenfalls auf dem Terminal). Die Eingaben der + Funktions-Makros {read...}, {readdefine...} (s.Makro- + Prozessor) erfolgen in allen Programm-Ebenen von + standard_input. + + Der Arbeitszyklus des Monitor und damit auch die ING_DB + -Sitzung wird mit Ausfu"hrung eines \quit-Monitor-Kommandos + (s.dort) oder nach Einlesen eines in der Basis- + Terminal-Ebene (s. \include-Kommando) beendet. + + Bei der Ausfu"hrung von Monitor-Kommandos wird der + Makroprozessor (s. dessen Kapitel) benutzt. Folgend wird + der Output-Text, den der Makroprozessor aus einem Input-Text + erzeugt, als + + < MACRO ( ) > + + symbolisiert. + + _2._4._4. AAAArrrrbbbbeeeeiiiitttt mmmmiiiitttt ddddeeeemmmm MMMMoooonnnniiiittttoooorrrr----PPPPuuuuffffffffeeeerrrr + + Bei der Eingabe vom Terminal wird der Eingabetext vom Moni- + tor erst als vollsta"ndige Zeile (also erst nach Eintasten + des ) u"bernommen. Vorher sind Korrekturen mit + oder mo"glich. Nach U"bernahme der Zeile ko"nnen + Korrekturen im Monitor-Puffer nur noch durch die Monitor- + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 241 - MMMMoooonnnniiiittttoooorrrr + + + Kommandos \reset oder \editor ausgefu"hrt werden. + + Der Monitor lehnt die Eingabe aller Zeichen, deren Codewert + kleiner als oktal 040 ist, ausser , und , + ab. Genauer gesagt, er wandelt sie in ein um und + signalisiert das durch die Meldung + + "Zeichen 0** konvertiert in blanks" + + Die im Monitor-Puffer formulierten QUEL-Statements werden + mit einem \go-Kommando zur Ausfu"hrung angewiesen. Danach + kann der Monitor-Puffer in der Regel gelo"scht werden. Das + passiert auch im sogenannten autoclear_mode. Das Lo"schen + erfolgt nicht, wenn man sich nach Ru"ckkehr in den Eingabe- + Status des Monitor sofort noch einmal fu"r den alten Inhalt + des Monitor-Puffers interessiert. + + Der autoclear_mode wird durch die Option "-a" abgeschaltet. + Mit dieser Option muss man in allen Fa"llen selbsta"ndig - + durch ein \reset-Kommando - den Monitor-Puffer lo"schen. + + Genauer gesagt, la"uft folgendes ab: + Nach einem \go-Kommando ist der Monitor-Puffer zuna"chst noch + unvera"ndert. Er wird jetzt aber zur Lo"schung vorgemerkt. + Diese Vormerkung kann durch die Option "-a" unterdru"ckt wer- + den. Die Ausfu"hrung eines vorgemerkten Lo"schens ha"ngt davon + ab, welches Monitor-Kommando folgt: + Die Kommandos \append, \print, \list, \edit machen die Vor- + merkung ru"ckga"ngig; das Kommando \reset fu"hrt ohnehin ein + Lo"schen aus, alle anderen Kommandos beru"cksichtigen die Vor- + merkung nicht, \eval setzt sie selbst. Die Ausfu"hrung der + vorgemerkten Lo"schung erfolgt unmittelbar vor und anla"sslich + der Eintragung des ersten Nicht-Kommando-Zeichens des Einga- + betextes in den Monitor-Puffer. + + Durch dieses automatische Lo"schen des Monitor-Puffers sollen + die normalen Arbeitszyklen + + + \go + + \go + + oder z.B. + + + \go + \append | \editor + + \go + + unterstu"tzt werden. + + _2._4._5. SSSSyyyynnnncccchhhhrrrroooonnnneeee BBBBeeeeeeeennnnddddiiiigggguuuunnnngggg uuuunnnndddd + aaaassssyyyynnnncccchhhhrrrroooonnnneeee UUUUnnnntttteeeerrrrbbbbrrrreeeecccchhhhuuuunnnngggg + + Durch Abgabe eines Interruptsignals wird der Warte-Status + des Monitor beendet. Das bedeutet, dass die vom Parser ini- + tiierten ING_DB -Prozesse asynchron zum Abbrechen veranlasst + werden (Achtung: Bei QUEL-Statements, die die Datenbasis + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 242 - MMMMoooonnnniiiittttoooorrrr + + + a"ndern, besteht darin eine gewisse Gefahr!). Die Abgabe + eines Interruptsignals, wa"hrend sich der Monitor im + Eingabe-Status befindet, ist wirkungslos. + + Die Abgabe eines Interruptsignals wa"hrend der file- + gesteuerten Arbeit des Monitor fu"hrt zur Ru"ckkehr in die + Basis-Terminal-Ebene. + + Ein in einer, unter der Basis-Terminal-Ebene liegenden + Programmebene (s. \include-Kommando) fu"hrt zur Ru"ckkehr in + die daru"ber liegende Programm-Ebene und die der letzten zur + Beendigung des Monitors ( wie Monitor-quit-Kommandos ). + + + _2._4._6. SSSSttttrrrruuuukkkkttttuuuurrrr ddddeeeerrrr MMMMoooonnnniiiittttoooorrrr----KKKKoooommmmmmmmaaaannnnddddoooossss + + Ein Monitor-Kommando ist eine Zeichenfolge der Form + + "\" {|} [] + + mit + + = + {|} ; + + + und + = + + + + "H" | "help" | + "a" | "append" | + "b" | "branch" | + "cd" | "chdir" | + "e" | "ed" | "edit" | "editor" | + "g" | "go" | + "h" | "help" | + "i" | "include" | "read" | + "k" | "mark" | + "l" | "list" | + "p" | "print" | + "q" | "quit" | + "r" | "reset" | + "s" | "sh" | "shell" | + "d" | "time" | "date" | + "v" | "eval" | + "w" | "write" | + "m" | "monitor"; + + + Das sind die Monitor-Kommando-Namen mit ihren Alias-Namen. + + Die sind abha"ngig vom jeweiligen Kommandotyp und wer- + den dort beschrieben. Es gibt grundsa"tzlich drei Gruppen + von Kommandos: solche, die + keinen haben, + wahlweise einen haben, + unbedingt einen haben mu"ssen. + Da mit abgeschlossen wird, ko"nnen Kommandos der + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 243 - MMMMoooonnnniiiittttoooorrrr + + + letztgenannten beiden Gruppen nur am Ende einer Zeile formu- + liert werden. Das Zeilenende kann fu"r einen Monitor- + Parameter nicht durch kaschiert werden ! + + Eine genaue Darstellung der Verwendung der in den + Monitor-Kommandos ist folgende: + Zur Auswertung des Kommandoparameters wird die Zeichenkette + + < MACRO( ) > + + herangezogen. Input-Text fu"r den Makro-Prozessor ist der, + im Kommando formulierte Text bis zum . Beim \branch- + Kommando mu"ssen beide Parameterteile und + vor dem untergebracht werden. Vom Output-Text des + Makro-Prozessors werden die Zeichen nach den fu"hrenden + oder bis zum Ende, aber maximal nur 100 + Zeichen genommen (beim \branch-Kommando 100 Zeichen fu"r + beide Parameter). + + Bei der Analyse des Eingabetextes versucht der Monitor jede, + einem ("\") folgende Zeichenfolge als Monitor- + Kommando zu interpretieren, unabha"ngig davon, ob dem + Klammern ( (... oder {... ) oder Quoting-Symbole + ( "... oder `... oder /*... ) vorausgegangen sind. Auch die + Formulierung von "\\" fu"hrt nur dazu, dass das erste "\" in + den Monitor-Puffer u"bernommen wird, dann aber die dem + zweiten "\" folgenden Zeichen auf ein Monitor-Kommando + analysiert wu"rden. + + Eine als Monitor-Kommando identifizierte Zeichenfolge + gelangt nicht in den Monitor-Puffer; wohl aber sonst die + gesamte Zeichenfolge einschliesslich des . + + Der Monitor liest seine Kommandos nur aus dem Eingabetext; + er kann nicht dazu gebracht werden, den Monitor-Puffer als + Eingabetext zu lesen. + + _2._4._7. BBBBeeeesssscccchhhhrrrreeeeiiiibbbbuuuunnnngggg ddddeeeerrrr MMMMoooonnnniiiittttoooorrrr----KKKKoooommmmmmmmaaaannnnddddoooossss + + Der folgende Abschnitt beschreibt die einzelnen Monitor- + Kommandos. Die Kommando-Schreibweise in den + Zwischenu"berschriften ist als plausible Abku"rzung der vorn + exakt definierten Notation zu verstehen. + + _2._4._7._1. AAAAppppppppeeeennnndddd + + + \a + \append + + Eine ggf. eingetragene Lo"schvormerkung des Monitor- + Puffers (autoclear_mode) wird ausgetragen, sodass ein + folgender Eingabetext - jedenfalls beginnend als neue + Zeile - dem bisherigen Monitor-Puffer angefu"gt wird. + + _2._4._7._2. BBBBrrrraaaannnncccchhhh + + + \b + \branch + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 244 - MMMMoooonnnniiiittttoooorrrr + + + = + {|} ["?"] + {|} ; + + Durch das Kommando erfolgt ein bedingter oder + unbedingter Sprung im Eingabetext. Die Ausfu"hrung + eines Sprungs wird mit der Meldung + + "Kein Sprung am Terminal" + + abgelehnt, wenn der Eingabetext vom Terminal gelesen + wird. Andernfalls wird im Falle eines auszufu"hrenden + Sprungs im Eingabetext - also im included_file - die + Marke + + \k + + gesucht (s. \k-Kommando), fu"r die + + )> = + + ist. Wird eine solche Marke gefunden, wird + anschliessend die Eingabe des Eingabetextes mit der, + dieser Marke folgenden Textposition fortgesetzt. Wird + keine solche Marke gefunden, wird versucht, einen + Sprung + + \branch {default} + + auszufu"hren. Gelingt auch das nicht (weil der Makro + "{default}" nicht definiert ist, oder im included_file + nicht addressiert), wird darauf mit der Meldung + + " ? Label )>" + " ? Label < MACRO ({default}) > ({default}) " + + hingewiesen und das included_file folgend verlassen + (folgend wird aus dem Eingabetext gelesen (s. + \include-Kommando)). + + Ein unbedingter Sprung ohne die Angabe "?" wird + in jedem Falle auszufu"hren versucht. Bei einem + bedingten Sprung wird der Ausdruck + + )> + + ausgewertet. Dieser Ausdruck darf Operatoren und + Operanden enthalten. Operatoren sind: + + ** Potenzieren + - ! Vorzeichen, logische Negation + * / % Multiplikation, Division, Divisionsrest + + - als zweistellige Operationen + > >= < <= Vergleichsoperatoren + = != Gleichheit, Ungleichheit + & logisches UND + | logisches inclusives ODER + + + Operationen auf gleicher Zeile sind von gleicher + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 245 - MMMMoooonnnniiiittttoooorrrr + + + Bindungssta"rke, sonst gilt absteigende Bindung + entsprechend der Aufza"hlung zur Festlegung der Bindung + von Operationen. + + Der Ausdruck darf als Operanden nur noch ganzzahlig + numerische Werte mit einem Wertebereich zwischen -32768 + bis 32767 enthalten, sonst erfolgt nach entsprechenden + Meldungen (s. unten) ein Abbruch der weiteren Aus- + drucksberechnung. Die Ausdrucksauswertung wird durch + die Zeichen + + , , oder + + beendet. + + Die arithmetischen Operationen werden in u"blicher Ganz- + zahlarithmetik (/: ganzer Teil der Division, %: + Divisionsrest; Division durch 0 ergibt nach Warnung den + Wert 0) berechnet. Die logischen Operationen ( + !,=,>,<,| ) deuten bei ihren Operanden <=0 als FALSE + und >0 als TRUE. Die logischen Operationen und die + Vergleichsoperationen liefern den arithmetischen Wert 0 + fu"r FALSE und 1 fu"r TRUE. Die Ausdrucksberechnung + erfolgt von links nach rechts, entsprechend den Bin- + dungsregeln, geklammerte Teile werden ge- und entkel- + lert. + + Bei der Ausdrucksauswertung (nach Makro-Auflo"sung) wer- + den folgende Fehler im Ausdruck erkannt: + + zusa"tzliche schliessende Klammern + am Ende werden ignoriert + + zusa"tzliche o"ffnende Klammern + am Ende, ergeben 0 als Ausdruckswert + + der Ausdruck ist leer, + sein Wert ist 0 + + der Ausdruck entha"lt nur das + nicht akzeptable Zeichen , + sein Wert wird 0 + + das gefundene ist kein Operator + der Wert wird 0 + + Division durch 0 ergibt den Wert 0 + + Ein bedingter Sprung wird ausgefu"hrt, wenn die Auswer- + tung des Ausdrucks einen Wert > 0 erbringt. Andernfalls + wird die Eingabe des Eingabetextes hinter + folgend fortgesetzt. + + _2._4._7._3. CCCChhhhddddiiiirrrr + + + \cd + \chdir + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 246 - MMMMoooonnnniiiittttoooorrrr + + + Das vom Nutzer bei Start von ING_DB von ihm + eingestellte working_directory bleibt auch wa"hrend der + Arbeit von ING_DB erhalten. Unter diesem Pfadnamen + bestimmte Files werden im Unterschied zu dem, durch + {Pathname} mit "ing_db" symbolisierten Files, in diesem + Kapitel als + + / + + symbolisiert. + + Das fu"r den Nutzer vor Start von ING_DB eingestellte + working_directory wird durch das \chdir-Monitor- + Kommando auf + + = )> + + vera"ndert; u"ber einen Misserfolg dabei informiert die + Meldung + + "cannot access directory )> " + + Der Monitor meldet sich nach Kommando-Ausfu"hrung wieder + mit einer Prompt-Meldung "ING_db>" oder "ING_db:". + + _2._4._7._4. EEEEddddiiiittttoooorrrr + + + \e [] + \ed [] + \edit [] + \editor [] + + Es wird ein Editor aus dem File + + + + zu laden versucht. Ist der Makro nicht definiert, wird + gleich ein installationsabha"ngiger System-Editor, z.B. + eeeedddd,,,, vvvviiii,,,, rrrraaaannnndddd,,,, geladen. Gelingt das nicht, erfolgt eine + Fehlerausschrift. Ausserdem wird der Makro {error- + count} mit dem Wert -1 gefu"llt und der Macro {exectrap} + mit der Meldung + + "edit: exec" + + ausgefu"hrt. + + Der Monitor meldet + + ">> " + + Danach arbeitet man unter Steuerung des geladenen Edi- + tors, ihm wird als Parameter + + )> + + oder falls das Kommando keinen Parameter hatte, der + File-Name des Monitor-Puffers u"bergeben. Das bedeutet, + dass der Editor das File la"dt und als currentfile + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 247 - MMMMoooonnnniiiittttoooorrrr + + + einstellt. + + Im Falle der Arbeit auf dem Monitor-Puffer kommen mit + dem Editor ausgefu"hrte A"nderungen nur dann dort an, + wenn dem Editor ein w-Editor-Kommando vor A"nderung + seines currentfile gegeben wird. Jedenfalls wird bei + Ausfu"hrung eines \e-Monitor-Kommandos eine ggf. + eingetragene Lo"schvormerkung fu"r den Monitor-Puffer + (autoclear_mode) ausgetragen. + + Natu"rlich kann nach der Arbeit auf dem Monitor-Puffer + oder u"berhaupt auch in anderen Files editiert werden. + Beachten sie bei der Formulierung von File-Namen, dass + user_cd als current_directory (s. \chdir-Kommando) + eingestellt ist. + + Nach einem q-Editor-Kommando fu"r den System-Editor oder + einer anderen Beendigung des geladenen Editors erfolgt + die Ru"ckkehr zum ING_DB -Monitor. Der Monitor ruft fu"r + den Fall, dass der Editor einen Ru"ckkehrcode != 0 + lieferte, den Makro {exectrap}. Vorher wird der Makro + {errorcount} mit dem exit-Status des Editors gefu"llt. + Das erfolgt so, als ga"be man selbst das Monitor- + Kommando + + {exectrap}\eval + + + _2._4._7._5. GGGGoooo + + + \g + \go + + Mit diesem Kommando werden QUEL-Statements zur + Ausfu"hrung angewiesen. Der Monitor zeigt die + Kommandou"bernahme mit der Prompt-Meldung + + "I N G - d b . . ." + + an und beendet damit seinen Eingabe-Status fu"r die + Dauer der Arbeit des Parsers und der diesem + nachgelagerter Prozesse. + + Dem Parser wird die vom Makro-Prozessor verarbeitete + Verkettung folgender Texte u"bergeben: + + < MACRO ( , + , + ) > + + Man achte darauf, dass der Monitor-Puffer so bereinigt + wurde, dass dem Parser nur QUEL-Statements u"bergeben + werden, er signalisiert sonst Fehler. + + Nachdem die Arbeit des Parsers und dessen nach- + gelagerter Prozesse bei der Ausfu"hrung der QUEL- + Statements beendet ist, arbeitet der Monitor weiter. + Der Monitor u"bernimmt N als Anzahl der bearbeiteten + Tupel und definiert den Makro {tuplecount} als + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 248 - MMMMoooonnnniiiittttoooorrrr + + + + {define; {tuplecount}; N} + + Der Monitor arbeitet den Makro {continuetrap} ab, als + ha"tte man das Monitor-Kommando + + {continuetrap} \eval + + (s. Makroprozessor) gegeben. Der Monitor zeigt seine + Eingabebereitschaft durch die Prompt-Meldungen + "ING_db>" oder "ING_db:" an. + + Nach einem \go-Kommando ist der Monitor-Puffer zuna"chst + noch unvera"ndert; er ist jetzt aber zur Lo"schung vor- + gemerkt (autoclear_mode). Diese Lo"schvormerkung wird + durch die Option "-a" unterdru"ckt. + + Wenn die Ero"ffnung des Monitor-Puffers fu"r den Makro- + Prozessor nicht gelingt, erfolgt ein Systemabbruch mit + der Meldung + + "go: open 1" + + + _2._4._7._6. HHHHeeeellllpppp + + + \h [] + \help [] + + Der Monitor wa"hlt mit Angabe aus ../sys/ref die + Kurzdokumentation zum ING_DB -Kommando und schreibt auf + "std_out". Ohne wird das Inhaltsverzeichnis + ausgegeben. + + _2._4._7._7. IIIInnnncccclllluuuuddddeeee uuuunnnndddd RRRReeeeaaaadddd + + + \i + \include + \read + + Dem Monitor wird das File + + / )> + + als Eingabetextspender zugeordnet. Das Kommando wirkt + wie ein Sprung an den Anfang dieses File. + + Fehlt oder ist )> leer, wirkt das + Kommando so, dass das folgende Zeichen des dem Monitor + angeschlossenen Eingabetextes wird. Das bedeu- + tet, dass ein included_file folgend verlassen wird; in + der Basis-Terminal-Ebene tritt der Effekt wie nach + einem \quit-Kommando ein. + + Andernfalls wird das durch )> bezeichnete + File zum ku"nftigen Eingabetextspender fu"r den Monitor + (es sei denn die Meldung + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 249 - MMMMoooonnnniiiittttoooorrrr + + + + "open INCLUDE file )> " + + zeigt den Abbruch der Kommandobearbeitung an). Solange + der Monitor "file-gesteuert" arbeitet, werden die + Prompt-Meldungen wie durch die ING_DB -Option "-s" + unterdru"ckt. + + Fu"r die Funktions-Makros {read...}, {readdefine...} (s. + Makro-Prozessor) bleibt auch bei dieser Arbeitsweise + des Monitor das Terminal (genauer standard_input) das + Eingabemedium. + + Das angeschlossene File darf weitere \include-Kommandos + enthalten; diese sind bis zu einer Schachtelungstiefe + von 5 (diese Anzahl ist generierungsfa"hig) hierarchisch + hintereinander liegender \include-Kommandos erlaubt. + Ggf. erfolgt eine Kommandoabweisung durch die Meldung + + "Mehr als 5 INCLUDE'S" + + Liest der Monitor aus dem included_file (nachdem + es sequentiell durchlesen wurde, oder bei Nichterfolg + eines dort enthaltenen Monitor-Kommandos), wird das + File verlassen; die Monitoreingabe wird mit dem Text + des File hinter dem letztwirksamen \include-Kommando + fortgesetzt. + + Bei Ru"ckkehr in die Basis-Terminal-Ebene meldet sich + der Monitor - falls nicht "-s" gesetzt war - wieder mit + einer Prompt-Meldung "ING_db>" oder "ING_db:". Die + Abgabe eines in der Basis-Terminal-Ebene hat die + gleiche Wirkung wie das \quit-Kommando: die ING_DB + -Sitzung wird synchron beendet. + + Ist )> das einzelne Zeichen "-", erfolgt + die Meldung + + "" + + und der ku"nftige Eingabetext fu"r den Monitor wird + wieder vom Terminal (standard_input) gelesen. Das ist + nicht die oben erwa"hnte Basis-Terminal-Ebene; durch + Abgabe eines vom Terminal erfolgt kein Sitzungs- + abbruch, sondern es wird wieder das File zum Einga- + betextspender, aus dem das "\include -" abgesetzt wor- + den war. Das ero"ffnet die Mo"glichkeit, unter + grundsa"tzlicher Steuerung durch ein File, zwischen- + zeitlich in freiem Format vom Terminal zu lesen. Das + Nachrichtenlevel fu"r die Promptmeldungen ("-s" oder + nicht) ist wa"hrend dieser Arbeit am Terminal wieder so, + wie fu"r die ING_DB -Sitzung eingestellt. + + _2._4._7._8. MMMMaaaarrrrkkkk + + + \k + \mark + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 250 - MMMMoooonnnniiiittttoooorrrr + + + Der Eingabetext entha"lt eine Marke als Zielangabe eines + ggf. auszufu"hrenden \branch-Kommandos. Das Kommando + selbst ist wirkungslos. Der Eingabetext wird bis + hinter u"berlesen; der Monitor-Puffer wird fol- + gend jedenfalls mit einer neuen Zeile weiter + beschrieben, der Monitor meldet sich wieder mit einem + Prompt-Symbol. Anla"sslich der Ausfu"hrung eines + \branch-Kommandos wird das included_file von vorn + beginnend nach der zutreffenden Marke abgesucht. + + _2._4._7._9. LLLLiiiisssstttt + + + \l + \list + + Der vom Makro-Prozessor aus dem verketteten Text + erzeugte Text + + < MACRO( , + , + ) > + + wird auf dem Terminal angelistet. Man erha"lt dadurch + Auskunft, welcher Text tatsa"chlich dem Parser mit einem + \go-Kommando angeboten wu"rde. Weiterhin werden durch + die Arbeit des Makro-Prozessors die Funktions-Makros + (s. Makro-Prozessor) bearbeitet. Der Monitor-Puffer + bleibt unvera"ndert. (Achtung: Dadurch, dass bei der + ersten Verwendung des Kommandos ggf. Substitutions- + Makros definiert werden, kann die wiederholte Anwendung + des Kommandos andere Ergebnisse bringen.) + + Eine ggf. eingetragene Lo"schvormerkung fu"r den + Monitor-Puffer wird ausgetragen (autoclear_mode). + + _2._4._7._1_0. MMMMoooonnnniiiittttoooorrrr + + Mit dem Monitor-Kommando la"sst sich das standardma"ssige Kom- + mandokennzeichen """"\\\\"""" umdefinieren. Fehlt das Argument + , wird wieder auf den Standard zuru"ckgeschaltet. + Die Neudefinition des Kommandokennzeichens sollte nur dann + vorgenommen werden, wenn das Zeichen """"\\\\"""" nicht oder nur + umsta"ndlich erreicht werden kann. + Es wird darauf hingewiesen, dass bei Neudefinition des Kom- + mandokennzeichens Monitor-Kommandodateien unter Umsta"nden + nicht mehr abarbeitungsfa"hig sind. + + _2._4._7._1_1. PPPPrrrriiiinnnntttt + + + \p + \print + + Der Inhalt des Monitor-Puffers wird ohne Vera"nderung + durch den Makro-Prozessor auf dem Terminal angelistet. + Eine ggf. eingetragene Lo"schvormerkung fu"r den + Monitor-Puffer wird ausgetragen (autoclear_mode). Der + Monitor meldet sich nach Kommandoausfu"hrung wieder mit + einer Prompt-Meldung "ING_db>" oder "ING_db:". + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + diff --git a/WEGA/contrib/ingres/dbs/ing_doc/teil2/doc2_ad b/WEGA/contrib/ingres/dbs/ing_doc/teil2/doc2_ad new file mode 100644 index 0000000..4dd5ae2 --- /dev/null +++ b/WEGA/contrib/ingres/dbs/ing_doc/teil2/doc2_ad @@ -0,0 +1,2160 @@ + + + + Anwendung - 251 - MMMMoooonnnniiiittttoooorrrr + + + _2._4._7._1_2. QQQQuuuuiiiitttt + + + \q + \quit + + Die ING_DB -Sitzung wird synchron beendet. Falls nicht + die ING_DB 6.3-Option "-s" gesetzt war, erfolgt + abschliessend die + + ING_DB + -logout-Meldung + + "ing_db vers logout + + Auf Wiedersehen [] -- Kommen Sie bald wieder" + + + _2._4._7._1_3. RRRReeeesssseeeetttt + + + \r + \reset + + Der Inhalt des Monitor-Puffers wird gelo"scht. + + _2._4._7._1_4. SSSShhhheeeellllllll + + + \s [] + \sh [] + \shell [] + + Das Kommando dient der Ausfu"hrung von UNIX -Programmen + wa"hrend der ING_DB -Sitzung, insbesondere unter + Steuerung des UNIX -Kommandointerpreters SHELL. Das + Kommando kann weitreichender benutzt werden. + + Es wird ein neuer process "geforkt" (Systemabbruch mit + Meldung "shell: fork", wenn das nicht gelingt), ein + Programm geladen und die Meldung + + ">> " + + gebracht. Das Programm wird als File + + + + zu laden versucht. Ist dieser Makro definiert und ge- + lingt der Ladevorgang nicht, wird der Makro {error- + count} auf -1 gesetzt und der Makro {exetrap} + ausgefu"hrt. + + Gelingt der Ladevorgang, wurde dem gerufenen Programm + als 0.Parameter der Programmname, als 1.Parameter der + File_name des Monitor-Puffers und als 2.Parameter der + Wert des ggf. durch den Makro-Prozessor transformierten + \shell-Kommandoparameters u"bergeben. + + Ist der Makro nicht definiert, wird eine installationsabhan- + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 252 - MMMMoooonnnniiiittttoooorrrr + + + gige SHELL aufgerufen. + + //sh//csh//vsh + + geladen. + Gelingt das nicht, erfolgt ein Systemabbruch mit der Meldung + + "shell: exec" + + + Falls in diesem Falle das \shell-Kommando keinen + hatte, wird die geladene SHELL als interaktive SHELL gestar- + tet; durch Abgabe eines quit-SHELL-Signals kommt man in den + Monitor zuru"ck. Falls das \shell-Kommando hatte, + wird u"ber eine SHELL das, durch MACRO() bezeichnete, + SHELL-Kommando aufgerufen. Man beachte, dass aus + mehreren durch getrennten Wo"rtern bestehen darf + ( reicht bis zum nicht kaschierbaren Zeilenende des + Monitor-Kommandos !). Dadurch ko"nnen dem SHELL-Kommando + Parameter u"bermittelt werden. Die Ru"ckkehr zum Monitor + erfolgt automatisch mit Beendigung des aufgerufenen SHELL- + Kommandos. + + In Auswertung eines Ru"ckkehrcodes des aufgerufenen Pro- + gramms, der interaktiven SHELL oder des SHELL-Kommandos + erfolgt durch den ING_DB -Monitor die Ausfu"hrung des {exec- + trap}, wenn der Ru"ckkehrcode != 0 war. Das erfolgt in einer + Form, als ga"be man selbst das Monitor-Kommando + + {exectrap}\eval + + Nach Ru"ckkehr aus der SHELL ist der Monitor wieder im + vorangehend verlassenen Eingabe-Status. + + _2._4._7._1_5. TTTTiiiimmmmeeee uuuunnnndddd DDDDaaaatttteeee + + + \d + \time + \date + + Die aktuelle Zeit wird auf dem Terminal ausgegeben. Im + Monitor-Puffer wird ein Zeilenwechsel eingetragen. + + _2._4._7._1_6. EEEEvvvvaaaallll + + + \v + \eval + + Dem Makro-Prozessor wird der Monitor-Puffer als Einga- + betext angeboten, wodurch insbesondere die define- + Makros in die Makro-Tabelle u"bernommen (s. Makro- + Prozessor), aber ggf. auch andere Funktions-Makros + abgearbeitet werden. + + Im Unterschied zum \list-Kommando erfolgt keine Einbe- + ziehung von {begintrap} und {endtrap} und keine Anli- + stung des Makro-Ausgabetextes. Es erfolgen aber die + auf standard_output wirkenden Ausgaben der {dump;...}-, + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 253 - MMMMoooonnnniiiittttoooorrrr + + + {type;...}- und {read....}-Makros. Weiterhin wird + anschliessend der Monitor-Puffer zum Lo"schen vorgemerkt + (falls nicht "-a" gesetzt war, autoclear_mode). + + Damit ist das \eval-Kommando das fu"r die Abarbeitung + von Funktions-Makros zu bevorzugende Kommando (s. + Makro-Prozessor) + + Der Monitor meldet sich nach Kommando-Ausfu"hrung mit + einer Prompt-Meldung "ING_db>" oder "ING_db:". + + _2._4._7._1_7. WWWWrrrriiiitttteeee + + + \w + \write + + Der Monitor-Puffer wird auf das File + + / )> + + (s. \chdir-Kommando) ausgeschrieben (das File wird mit + Modus 0644 crei"ert). + + Es ko"nnen folgende Fehlermeldungen den Misserfolg + anzeigen: + + "unakzeptabler file name )>" + "create WRITE-file )>" + + + Nach Ausfu"hrung des Kommandos meldet sich der Monitor + wieder mit einer Prompt-Meldung "ING_db>" oder + "ING_db:". + + + Der Monitor als Programm-Prozess bringt einige Fehlermel- + dungen, die sich auf die Ausgabe von Fehlertexten aus + anderen ING_DB -Prozessen beziehen, wenn die dazu no"tigen + Fehlertext-Files nicht lesbar, oder syntaktisch regelwidrig + sind. + + + + + + + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 254 - AAAAMMMMXXXX + + + _2._5. AAAAMMMMXXXX ******** + + + + + + + + + + + + + _2._5._1. EEEEiiiinnnnlllleeeeiiiittttuuuunnnngggg + + AMX (Access Method - an eXtended interface) ist ein + Werkzeug, das direkt auf die ING_DB Zugriffsmethoden abbil- + det. Es ist leicht erlernbar, einfach anzuwenden und erzeugt + laufzeiteffektive Programme. Gegenu"ber dem Datenbanksystem + ING_DB bzw. der EQUEL Komponente sind AMX-Programme bedeu- + tend schneller. Mit AMX ko"nnen sowohl rekursive Zugriffe zu + Daten programmiert, als auch Recherchen mit A"nderungen frei + gemischt und Abfragen implementiert werden, die die + Ma"chtigkeit der relationalen Abfragesprachen u"bersteigen + (Baum-, Stu"cklistenverarbeitung usw.). + + AMX baut auf dem ING_DB System auf. Es ist mo"glich mit + ING_DB erstellte Daten mit AMX weiterzuverarbeiten und + umgekehrt. Dieser komplexe Ansatz gestattet zwischen AMX, + EQUEL und dem Datenbanksystem ING_DB frei zu wechseln. + + _2._5._2. EEEEnnnnttttwwwwuuuurrrrffff + + AMX ist eine Datenbanksprache, die in eine ho"here + Programmiersprache eingebettet ist. Als Einbettungsstrategie + bietet sich einer der vier klassischen Ansa"tze an: + + (1) prozedurale Einbettung in die ho"here Programmiersprache + u"ber eine call-Schnittstelle: + + call database("database_action as string"); + + Die Datenbankaktion wird zur Laufzeit interpretiert, + eine Modifikation des U"bersetzers der ho"heren Program- + miersprache entfa"llt. Ein besonderes Problem ist die + Verwendung gemeinsamer Variablen und die Pru"fung der + Zula"ssigkeit der Datenbankaktionen. z.B: SYSTEM-R, + ADABAS, IMS + + (2) einfache Erweiterungen der ho"heren Programmiersprache + um Elemente der Datenbanksprache + + Eine Modifikation des U"bersetzers der ho"heren Pro- + grammiersprache ist notwendig, auch wenn der Aufwand + durch Angleichung der Syntax der Datenbanksprache an + die der ho"heren Programmiersprache minimiert werden + kann. Die Zula"ssigkeit der Datenbankaktionen kann bei + diesem Ansatz zur U"bersetzungszeit u"berpru"ft werden. + z.B: COBOL-DML des DBTG Netzwerkdatenmodells + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 255 - AAAAMMMMXXXX + + + (3) syntaktische Erweiterung der ho"heren Programmiersprache + um Elemente der Datenbanksprache ohne Modifikation des + U"bersetzers der ho"heren Programmiersprache + + Die Datenbankaktionen werden in dem Anwendungsprogramm + durch ein besonderes Pra"fixsymbol gekennzeichnet, + die durch einen zu konstruierenden Voru"bersetzer + (Preprozessor) syntaktisch und semantisch u"berpru"ft + und in Prozeduraufrufe der ho"heren Programmiersprache + u"bersetzt werden. Nachteilig erscheint die Verwendung + zweier Semantiken durch den Benutzer. + z.B: EQUEL/INGRES + + (4) Datenbankprogrammiersprache: Erweiterung einer ho"heren + Programmiersprache um das Datenmodell einer Daten- + banksprache + + Dieser Ansatz erfordert eine grundsa"tzliche Modifika- + tion bzw. Neukonstruktion des U"bersetzers der ho"heren + Programmiersprache. + z.B: MODULA-R + + Fu"r AMX wurde der 3. Ansatz gewa"hlt. Er garantiert mit + einem geringen Implementierungsaufwand die Realisierung + aller Forderungen, die an eine Einbettung zu stellen sind. + Der Preprozessor ist in YACC und C implementiert und damit + UNIX portabel. Die Verwendung von YACC als Werkzeug zur + Compilergenerierung bringt einige Probleme in der Meldung + von erkannten Fehlern mit sich. Nach Erkennung eines Fehlers + wird die U"bersetzung erst nach drei als richtig erkannten + syntaktischen Einheiten (Token, Morpheme) fortgesetzt, so + dass eine zweite U"bersetzung Fehler erzeugen kann, die in + der ersten nicht erzeugt 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 wurde. YACC liest immer eine + syntaktische Einheit voraus, wird ein Fehler festgestellt, + ist in dem oben genannten Fall der Zeilenza"hler aber schon + um eins (oder mehr, bei Zeilen ohne syntaktische Einheiten) + hochgeza"hlt. Bei syntaktischen Fehlern, die YACC selbst + generiert, ist eine Angabe der Fehlerursache a"usserst + schwierig. Aufgrund der einfachen Syntax von AMX wurde auf + eine detaillierte Fehlererkennung verzichtet und der + Anwender muss den erzeugten Fehler + + "syntax error" + + selbst deuten. + + Ein Datenbanksystem la"sst sich in zwei grosse Komplexe + gliedern, den logischen Datenbankprozessor ((((LLLLDDDDBBBBPPPP)))) und den + physischen Datenbankprozessor ((((PPPPDDDDBBBBPPPP)))).... Der LDBP ist + zusta"ndig fu"r das U"bersetzen bzw. Parsen ((((PPPP)))) der Datenbank- + aktion und deren Optimierung ((((OOOO)))).... Der PDBP erha"lt eine + Folge von Auftra"gen (query evaluation plan - QQQQEEEEPPPP ) zur Abar- + beitung der Datenbankaktion unter Einbeziehung der Daten der + Datenbank. Unter dem Gesichtspunkt dieser Klassifizierung + la"sst sich die Einbettungsstrategie wie folgt verfeinern: + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 256 - AAAAMMMMXXXX + + + + +---------+----------+ + | L D P B | | + +------+------+ PDBP | + | P | O | | + +------+------+------+ + | | | | + a |####################| + | | | | + b |======|#############| + | | | | + c |=============|######| + | | | | + d |====================| + | | | | + +------+------+------+ + LEGENDE + #: zur Laufzeit + =: zur U"bersetzungszeit + + + a- Die U"bersetzung, Optimierung und interpretative Abar- + beitung der Datenbankaktionen zur Laufzeit ist die + natu"rliche Form der zum Datenbanksystem geho"rigen + Abfragesprache. Sie ist geeignet fu"r ad hoc-Abfragen. + + b- Die U"bersetzung ohne Optimierung ist geeignet fu"r + sta"ndig wiederkehrende datenunabha"ngige Datenbankak- + tionen. + + c- Die U"bersetzung mit Optimierung ist geeignet fu"r + sta"ndig wiederkehrende datenabha"ngige Datenbankak- + tionen, da der QEP fest determiniert ist. + + d- Die Umgehung des PDBP erfordert vom U"bersetzer die Kon- + struktion nicht nur des QEP sondern auch eines speziel- + len PDBP fu"r die konkreten Datenbankaktionen in Form + eines ausfu"hrbaren Programms. Diese Variante ist fu"r + schnelle Anwendungen (Erfassung und A"nderung) bzw. + Massendatenverarbeitung geeignet. + + Fu"r AMX wurde die Variante d) gewa"hlt. Eine wesentliche + Erho"hung der Abarbeitungsgeschwindigkeit fu"r Datenbankak- + tionen in AMX gegenu"ber ING_DB ist eingetreten, die + gewa"hlte Variante hat jedoch auch entscheidende Nachteile. + Die erzeugten AMX Programme sind abha"ngig von der Struktur + der Datenbank, alle verwendeten datenbankspezifischen Namen + (der Datenbank, der Relationen und der Doma"nen) mu"ssen zur + U"bersetzungszeit bekannt also konstant sein. Beispielsweise + kann mit AMX kein allgemeines Druckprogramm konstruiert bzw. + neue Relationen erzeugt werden. Dass ein AMX Programm keine + Relationen erzeugen kann, ist aus Anwendersicht eine schwer + einsehbare Tatsache. Der AMX Compiler holt sich alle Infor- + mationen zu den Relationen und Doma"nen aus den Systemkatalo- + gen der Datenbank und entlastet somit den Anwender von der + Angabe dieser Details und den Fehlern, die an dieser Stelle + gemacht werden ko"nnen. Eventuell beno"tigte permanente oder + tempora"re Relationen mu"ssen vor der U"bersetzung des AMX Pro- + gramms mit dem ING_DB System erzeugt werden (siehe + CREATE(QUEL)). Durch diesen Ansatz ist eine weitgehende + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 257 - AAAAMMMMXXXX + + + Quelltextunabha"ngigkeit von der Struktur der Datenbank gesi- + chert, eine A"nderung der Speicherstruktur einer Relation + erfordert keine A"nderung des AMX Quellprogramms, wohl aber + dessen neue U"bersetzung. + + Fu"r die vorliegende Version von AMX gelten einige + Einschra"nkungen: + + - Das Pufferschema der ING_DB Zugriffsmethoden ordnet + jeder Relation maximal einen Puffer zu. Fu"r die rekur- + sive Verarbeitung einer Relation ist ein solcher Ansatz + ungeeignet, da jede neue Rekursion den Puffer + u"berschreibt und ein sta"ndiges Nachlesen des alten Puf- + ferinhaltes bei Verlassen der Rekursion erforderlich + ist. Die Zuordnung von maximal einem Puffer zu einer + Relation ist ein Entwurfsprinzip der internen Ebene des + Datenbankystems ING_DB , eine A"nderung des Puffersche- + mas ist nicht angebracht. + + - Beschra"nkung der Variablentypen fu"r den Austausch von + Daten zwischen der Datenbanksprache und der ho"heren + Programmiersprache. + + - Die verwendeten Relationen du"rfen keine Sichten (views) + sein und du"rfen keine definierten Integrita"tsbedingun- + gen bzw. anderweitig vergebene Zugriffsrechte besitzen. + + - Konvertierungen zwischen numerischen und Zeichenket- + tenwerten (und umgekehrt) werden nicht unterstu"tzt. + + - Numerische Konvertierungen erfolgen ohne Unter- bzw. + U"berlaufkontrolle. + + - Vergleiche von Zeichenkettenwerten zwischen Doma"nen und + Variablen werden in der La"nge der Doma"ne ausgefu"hrt, + z.B. liefert der Variablenwert "Automat" den Wert + "Auto" fu"r die Datenbankaktion, wenn die zugeho"rige + Doma"ne den ING_DB Typ "c4" hat. + + AMX garantiert die Integrita"t der Datenbank, d.h. die Kon- + sistenz der Systemkataloge und der Indizes. Bei der + Zugriffspfadoptimierung werden die vorhandenen Indizes voll + herangezogen. A"nderungen sind nur in Nutzerrelationen ge- + stattet, die Systemkataloge und Indizes werden durch AMX + aktualisiert. + + Es ist geplant, einen SORT-Operator fu"r die Datenbankak- + tionen bereitzustellen, um in Recherchen doppelte Tupel + auszuschliessen und eine Hilfe fu"r die Verbindung zweier + Relationen (join) zu geben. + + _2._5._3. UUUUmmmmggggeeeebbbbuuuunnnngggg + + AMX ist an die UNIX Programmiersprache C gebunden, es + erzeugt aus dem Input ein gu"ltiges C-Programm, das mit dem + C-Compiler weiter verarbeitet werden muss. Es besteht aus + einem Compiler (Preprozessor) und einer Laufzeitbibliothek + "liba.a". A"hnlich EQUEL werden AMX Anweisungen durch die + Kennzeichnung von zwei Nummernzeichen "##" am Zeilenanfang + in das C-Programm eingebettet. Der AMX Compiler verarbeitet + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 258 - AAAAMMMMXXXX + + + nur solche gekennzeichneten Zeilen, aufgrund dieser + Arbeitsweise is es notwendig, die in AMX Anweisungen verwen- + deteten C-Variablen mit dem Kennzeichen zu deklarieren. In + der vorliegenden Version werden C-Variable vom Typ: + + - short + - int + - long + - float + - double + - char * + - char [] + + unterstu"tzt. Jede Variable ist global zu deklarieren. + + Im AMX Programm muss die Eintrittsfunktion "amx()" benannt + werden, da der AMX Compiler ein "main()" generiert, um die + notwendigen Datenbankinitialisierungen vornehmen zu ko"nnen. + + AMX generiert Code fu"r die Schnittstelle des internen Daten- + bankschemas von ING_DB , d.h. von Seiten des C-Programms + sind einige Konventionen dieser Schnittstelle einzuhalten. + Alle ausfu"hrbaren Programme mu"ssen vom ING_DB Superuser + angeeignet (owner, group) und mit dem Mode "6xxx" + + - "4000" set user id on execution + - "2000" set group id on execution + + versehen sein, um die Datenbankfiles lesen und schreiben zu + ko"nnen. Eine weitere Besonderheit ist das A"ndern des + aktuellen Verzeichnisses (current directory) in das Ver- + zeichnis der Datenbank zur Startzeit des AMX Programms. Zur + Laufzeit ist es nicht gestattet, das aktuelle Verzeichnis zu + a"ndern! Daher sollten alle programmspezifischen Files abso- + lut von der root aus angegeben werden (z.B: "/dir/file", + siehe auch COPY(QUEL)). + + Die Verwendung der C-Bibliotheksfunktionen + + - setjmp() + - longjmp() + + zur Realisierung nichtlokaler Spru"nge (siehe UNIX Manual + SETJMP(3)) sollte vermieden werden. + + Der AMX Compiler hat noch kein eigenes Rela- + tionssperrkonzept, er sperrt die Datenbank fu"r die parallele + Verwendung wa"hrend der gesamten Zeit deren Nutzung durch das + AMX Programm, d.h.: + + 1- zur Startzeit darf die Datenbank nicht in Benutzung + sein und + + 2- zur Laufzeit kann niemand die Datenbank verwenden. + + Das exklusive Sperren der Datenbank erfolgt u"ber das + concurrency-control-Schema von ING_DB . + + Durch die Laufzeitbibliothek werden eine Reihe von Objekten + definiert, die alle mit "AA" beginnen. Durch den + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 259 - AAAAMMMMXXXX + + + Anwendungsprogrammierer ist zu gewa"hrleisten, dass diese + Objekte nicht u"berdefiniert werden. Er sollte Namen, die mit + "AA" beginnen, generell vermeiden. Da die interne Ebene des + Datenbanksystems ING_DB in das AMX Programm gelinkt wird, + sind weitere Objekte mit einer festen Bedeutung definiert, + die im AMX Programm nicht verwendet werden du"rfen. Eine + vollsta"ndige Liste der Namen befindet sich im Anhang des + Kapitel. Fu"r eine na"chste AMX Version ist zumindest die + U"berpru"fung der Verwendung von bereits vergebenen Namen vor- + gesehen. + + _2._5._4. CCCCoooommmmppppiiiillllaaaattttiiiioooonnnn + + AMX Programmnamen mu"ssen mit ".x" beendet sein. Die + U"bersetzung erfolgt durch den Aufruf: + + % amx file.x + + Als Flags sind die des C-Compilers mo"glich. Der AMX Compiler + hinterla"sst sein Ergebnis im "file.o", das in einfachster + Form mit: + + % cc -n file.o -la -o file + oder + % cc -i file.o -la -o file + + weiter verarbeitet wird. Durch die Angabe von "-la" wird die + AMX Laufzeitbibliothek "liba.a" herangezogen. Das AMX Pro- + gramm kann nun durch den Aufruf von: + + % file + + abgearbeitet werden. + + Eine gleichzeitige U"bersetzung mehrerer AMX Programme durch + einen Aufruf des AMX Compilers ist aus internen Gru"nden + nicht zula"ssig. + + Eine separate Compilierung von AMX Moduln ist nicht + mo"glich, sa"mtliche Datenbankaktionen mu"ssen in einem Pro- + gramm zusammengefasst sein. Natu"rlich ko"nnen zu dem compi- + lierten AMX Programm beliebige UNIX -Objektmodule einzeln + bzw. in Bibliotheken zugelinkt werden. + + _2._5._5. BBBBeeeeggggrrrriiiiffffffffeeee + + AMX ist in das relationale Modell von ING_DB integriert. + Durch ein AMX Programm ko"nnen Daten einer ING_DB Datenbank + manipuliert werden. Eine Datenbank ist eine Menge von Rela- + tionen. Die Anzahl der Relationen innerhalb einer Datenbank + ist unbegrenzt. Eine Relation ist eine Menge von Doma"nen und + Tupel, sie hat einen Eigentu"mer (Besitzer). + + Die Anzahl der Doma"nen pro Relation ist auf 49 begrenzt. + Die maximale Tupella"nge ist generierungsabha"ngig und + schwankt zwischen 498 und 1010 Bytes. Eine Ausrichtung der + Doma"nen auf bestimmte Adressen ist nicht zu beachten. + + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 260 - AAAAMMMMXXXX + + + + +-------------------------+ + | Begriffsanalogien | + +--------+-------+--------+ + Relation | Tupel | Doma"ne + Tabelle | Zeile | Spalte + Datei | Satz | Feld + ---------+-------+--------- + + Eine Doma"ne besitzt einen Typ und eine La"nge. Folgende Kom- + binationen sind zula"ssig: + + ---------+---------- + Typ | La"nge + ---------+---------- + integer | 1 + | 2 + | 4 + float | 4 + | 8 + char | 1 .. 255 + ---------+---------- + + Innerhalb einer Datenbank muss ein Nutzer fu"r seine Rela- + tionen unterschiedliche Namen verwenden. Die Namen der Sys- + temkataloge + + "relation" Verwaltung der Relationen + "attribute" Verwaltung der Doma"nen + "indexes" Verwaltung der Indizes + "integrities" Verwaltung der definierten Integrita"ten + "protect" Verwaltung der vergebenen Zugriffsrechte + "tree" Verwaltung der voru"bersetzten Datenbank- + aktionen + + sind als Relationenname gesperrt, ebenso die Namen der Rela- + tionen des Datenbankeigentu"mers (Datenbankadministrator - + DBA). + + Innerhalb einer Relation mu"ssen die Doma"nennamen + eineindeutig sein. Alle Namen (Datenbank, Relationen, + Doma"nen) 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. Der AMX Compiler konvertiert grosse + Buchstaben "[A-Z]" automatisch in kleine "[a-z]". + + Jede Relation muss vor ihrer Verwendung ero"ffnet und kann + nach Beendigung der Verarbeitung geschlossen werden. Sie + besitzt eine Menge von Tupeln (tuplecount) als zugeho"rige + Daten. Wir unterscheiden die Recherche nach einer Menge von + Tupeln (scan) und das A"ndern bzw. Einfu"gen eines einzelnen + Tupel. Die Recherche kann alle Daten der Relation umfassen + (full relation scan) oder durch Bedingungen eingeschra"nkt + werden (limited scan). + + Ein scan setzt sich aus den Komponenten + + - Selektion = scan-Bedingung, + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 261 - AAAAMMMMXXXX + + + - Projektion = Auswahl der Doma"nen, deren Werte fu"r die + Verarbeitung interessieren und + + - Aktion = Verarbeitung, die fu"r jedes gefundene Tupel + angestossen wird, + + zusammen. + + _2._5._6. SSSSyyyynnnnttttaaaakkkkttttiiiisssscccchhhheeee RRRReeeeggggeeeellllnnnn + + | : Alternative. + + [ ] : wahlweiser Ausdruck, kann entfallen. + + { } : mindestens einmalige Wiederholung, + mehrere Elemente werden durch COMMA "," getrennt. + Ausnahme: { amx_stmt } wird nicht separiert. + + {A-Z_}: Schlu"sselwo"rter bzw. terminale Symbole: + ING_DB + = "ing_db" + OPEN = "open" + CLOSE = "close" + TUPLECOUNT = "tuplecount" + APPEND = "append" + OVER = "over" + SCAN = "scan" + PRINT = "print" + DELETE = "delete" + REPLACE = "replace" + LPAREN = "(" + RPAREN = ")" + LBRACE = "{" + RBRACE = "}" + DOLLAR_SIGN = "$" + IS = "=" + | "==" + RELOP = IS + | "<" + | "<=" + | ">" + | ">=" + | "!=" + + {a-z_} : Regelname bzw. nonterminale Symbole. + Mit "(n)" numerierte Regeln sind im Programm + frei verwendbar, die mit "{n}" nur innerhalb + eines scan-Statements. + Alle unterstrichenen Regeln sind nicht weiter + aufgelo"st und besitzen folgende Bedeutung: + xx = ING_DB + -Nutzercode fu"r das + alter-ego-Flag + no_of_bufs = Anzahl der zusa"tzlichen Puffer + fu"r die Zugriffsmethoden + database = Datenbankname + c_code = C-Statement + c_decl = Deklaration einer C-Variablen + rel = Relationsname + c_var = C-Variablenname + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 262 - AAAAMMMMXXXX + + + dom_name = Doma"nenname bzw. Doma"nennummer + const = int-Konstante + | long-Konstante + | double-Konstante + | "string"-Konstante + + + _2._5._7. GGGGrrrraaaammmmmmmmaaaattttiiiikkkk + + ( 1) program : ing_db { amx_stmt } + ; + ( 2) ing_db : ING_DB + flags database + ; -------- + ( 3) flags : [ "-u user_name " ] [ " +no_of_bufs " ] + --------- ---------- + ; + ( 4) amx_stmt : c_code + ------ + ( 5) | c_decl + ------ + ( 6) | OPEN rel + --- + ( 7) | CLOSE rel + --- + ( 8) | TUPLECOUNT rel c_var + --- ----- + ( 9) | APPEND rel target + --- + (10) | [ OVER rel ] SCAN rel + --- --- + (11) [ { qual } ] + + (12) [ LPAREN { var_assign } RPAREN ] + + (13) LBRACE [ { amx_stmt } ] RBRACE + + (14) | PRINT LPAREN [ { dom } ] RPAREN + + (15) | DELETE + + (16) | REPLACE target + + (17) | APPEND target + ; + (18) target : LPAREN { dom_assign } RPAREN + ; + (19) dom_assign : dom IS value + ; + (20) dom : DOLLAR_SIGN dom_name + ; -------- + (21) value : c_var + ----- + (22) | const + ----- + (23) | dom + ; + (24) qual : dom RELOP value + ; + (25) var_assign : c_var IS dom + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 263 - AAAAMMMMXXXX + + + _2._5._8. SSSSpppprrrraaaacccchhhhbbbbeeeesssscccchhhhrrrreeeeiiiibbbbuuuunnnngggg + + Die AMX Sprachbeschreibung orientiert sich an der verein- + fachten AMX Grammatik. Kommentare sind innerhalb von AMX + Statements in der C u"blichen Notation zugelassen: + + ## . . . /* Kommentar */ . . . + + + ( 1) program : ing_db { amx_stmt } + ; + + Ein AMX Programm besteht aus einem einleitenden ing_db- + Statement und einer beliebigen Menge von amx-Statements. + + ( 2) ing_db : ING_DB + flags database + ; -------- + + Das ing_db-Statement adressiert die zu verarbeitende Daten- + bank "database" und gestattet wahlweise die Angabe von + Flags. + + ( 3) flags : [ "-uuser_name" ] [ "+no_of_bufs" ] + ; --------- ---------- + + Das Flag -u"user_name" bewirkt, dass das AMX Programm mit + den Datenbankberechtigungen des ING_DB Nutzer "user_name" + la"uft. Das Flag +"no_of_bufs" fu"gt "no_of_bufs"-Puffer in + das Pufferschema der ING_DB Zugriffsmethoden ein. Nor- + malerweise stehen nur 3 Puffer fu"r die Arbeit mit Relationen + zur Verfu"gung, wobei eine Relation maximal einen Puffer + belegen kann. Bei der parallelen Arbeit mit mehreren Rela- + tionen (Indexrelationen mu"ssen mitgerechnet werden) sollte + jeder Relation ein eigener Puffer zugeordnet werden ko"nnen. + Die zusa"tzlichen Puffer werden im Nutzerstack angelegt. + + ( 4) amx_stmt : c_code + ; ------ + + Ein AMX Statement kann eine Menge von beliebigen C- + Statements sein. Die C-Statements werden nicht durch das + Kennzeichen "##" am Anfang der Zeile eingeleitet. + + ( 5) amx_stmt : c_decl + ; ------ + + C-Variable, die sowohl im AMX als auch im C-Programm verwen- + det werden sollen, mu"ssen mit dem Kennzeichen "##" am Anfang + der Zeile deklariert werden. + + Folgende Typen werden unterstu"tzt: + + - short + - int + - long + - float + - double + - char * + - char [] + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 264 - AAAAMMMMXXXX + + + Folgende Speicherklassen werden unterstu"tzt: + + - auto + - extern + - static + + + ( 6) amx_stmt : OPEN rel + ; --- + + Das open-Statement ero"ffnet die Relation rrrreeeellll fu"r die weitere + Verarbeitung. Die Relation rrrreeeellll muss eine Prima"r bzw. + Basisrelation sein, d.h. es ist nicht mo"glich, explizit + eine Indexrelation zu ero"ffnen. Durch das open- Statement + werden automatisch alle zur Relation geho"rigen Indizes + mitero"ffnet. Die Relation rrrreeeellll darf kein view sein und es + du"rfen keine integrity- bzw. protection- constraints auf ihr + definiert sein. Die Systemkataloge rrrreeeellllaaaattttiiiioooonnnn , aaaattttttttrrrriiiibbbbuuuutttteeee und + iiiinnnnddddeeeexxxxeeeessss werden durch den Start eines AMX Programms automa- + tisch ero"ffnet. + + Recherchen (scan-Statement) sind auf allen Relationen + zugelassen, d.h. auf Basis-, Indexrelationen und Katalogen. + A"nderungen und Einfu"gungen sind nur auf Basisrelationen + zula"ssig, fu"r die das Programm die update-Erlaubnis hat. + + ( 7) amx_stmt : CLOSE rel + ; --- + + Das close-Statement schliesst die Relation rrrreeeellll fu"r die + weitere Verarbeitung. Es ko"nnen nur Relationen geschlossen + werden, die zuvor durch das open-Statement ero"ffnet wurden. + Die Beendigung eines Programms ( eeeexxxxiiiitttt ) schliesst automa- + tisch alle ero"ffneten Relationen und Kataloge. + + ( 8) amx_stmt : TUPLECOUNT rel c_var + ; --- ----- + + Das tuplecount-Statement weist der C-Variable cccc____vvvvaaaarrrr als Wert + die Anzahl der Tupel der Relation rrrreeeellll zu. cccc____vvvvaaaarrrr muss ein + numerischer Typ sein. Die Anzahl der Tupel einer Relation + ist die einzigste verfu"gbare variable Kataloginformation fu"r + das AMX Programm. Auf Umwegen kann so die Anzahl der + A"nderungen in einer Relation bestimmt werden: + + . . . + ## long old, new; + . . . + ## tuplecount rel old + { Neueinfu"gungen } + ## tuplecount rel new + printf("# of updates", new - old); + . . . + + + ( 9) amx_stmt : APPEND rel target + ; --- + + Das append-Statement fu"gt ein neues Tupel in die Relation + rrrreeeellll ein. Durch die Projektion ttttaaaarrrrggggeeeetttt werden den + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 265 - AAAAMMMMXXXX + + + aufgefu"hrten Doma"nen Werte zugewiesen. Alle nicht angebenen + Doma"nen der Relation rrrreeeellll werden mit einem Nullwert initial- + isiert, alle numerischen Doma"nen bekommen den Wert 0 und die + Zeichenkettendoma"nen eine mit Leerzeichen gefu"llte Zeichenk- + ette zugewiesen. Eventuell vorhandene Indizes werden + automatisch aktualisiert. + + (18) target : LPAREN { dom_assign } RPAREN + ; + + Die Projektion wird durch eine o"ffnende "(" und eine + schliessende runde Klammer ")" begrenzt. Sie entha"lt eine + durch Kommas "," getrennte Aufza"hlung von Zuweisungen + ddddoooommmm____aaaassssssssiiiiggggnnnn.... Es muss mindestens einer Doma"ne ein Wert + zugewiesen werden. + + (19) dom_assign : dom IS value + ; + + Eine Zuweisung weist der Doma"ne ddddoooommmm den Wert vvvvaaaalllluuuueeee zu. Bei + den Zuweisungen von numerischen zu numerischen Typen werden + die notwendigen Konvertierungen ohne U"berlauf- bzw. Unter- + laufkontrolle vorgenommen. Zuweisungen von numerischen zu + Zeichenkettenwerten und umgekehrt sind nicht zula"ssig. + + (20) dom : DOLLAR_SIGN dom_name + ; -------- + + Eine Doma"ne wird durch das Kennzeichen "$" und ihren Namen + bzw. ihre Nummer (siehe Doma"ne aaaattttttttiiiidddd des Katalogs aaaattttttttrrrriiiibbbbuuuutttteeee + ) spezifiziert. Durch die explizite Kennzeichnung von + Doma"nennamen durch das Zeichen "$" werden im Gegensatz zu + EQUEL Konflikte mit dem Namen von C-Variablen vermieden. + Die Referenzierung von Doma"nen u"ber ihre interne Nummer + (Reihenfolge vom CREATE(QUEL)) kann sinnvoll bei einer vek- + torisierten Verarbeitung sein. + + (21) value : c_var + ; ----- + + Ein Wert kann der aktuelle Wert der C-Variablen cccc____vvvvaaaarrrr sein. + + (22) value : const + ; ----- + + Ein Wert kann eine in C u"bliche Konstante ccccoooonnnnsssstttt sein. + + (23) value : dom + ; + + Ein Wert kann der aktuelle Wert der Doma"ne ddddoooommmm sein. Diese + Form des Wertes setzt einen u"bergeordneten scan voraus, aus + dem der Wert fu"r die Doma"ne ddddoooommmm geholt werden kann. + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 266 - AAAAMMMMXXXX + + + + (10) amx_stmt : [ OVER over_rel ] SCAN scan_rel + -------- -------- + (11) Selektion [ { qual } ] + + (12) Projektion [ LPAREN { var_assign } RPAREN ] + + (13) Aktion LBRACE [ { amx_stmt } ] RBRACE + ; + + Das scan-Statement ist das ma"chtigste AMX Statement, es + u"bernimmt die Zugriffspfadoptimierung und ermo"glicht eine + rekursive Verarbeitung, da innerhalb eines scans ein + weiterer scan aufgerufen werden kann. + + Die over-Klausel (OVER over_rel) gestattet die Zuweisung des + Zugriffspfades u"ber die Relation oooovvvveeeerrrr____rrrreeeellll fu"r den scan und + damit die Ausschaltung der Zugriffspfadoptimierung im AMX + Compiler. oooovvvveeeerrrr____rrrreeeellll muss die zu scannende Relation selbst + oder ein Index von ssssccccaaaannnn____rrrreeeellll sein. Ist oooovvvveeeerrrr____rrrreeeellll ein Index + und wird durch die Selektion qqqquuuuaaaallll keinem Schlu"ssel von + oooovvvveeeerrrr____rrrreeeellll ein Wert zugewiesen, wird der Zugriffspfad u"ber die + Prima"rrelation ssssccccaaaannnn____rrrreeeellll gewa"hlt, da ein ffffuuuullllllll rrrreeeellllaaaattttiiiioooonnnn ssssccccaaaannnn + u"ber einen Index unsinning ist. Die scan-Klausel (SCAN + scan_rel) adressiert die zu scannende Relation ssssccccaaaannnn____rrrreeeellll.... + + _2._5._9. SSSSeeeelllleeeekkkkttttiiiioooonnnn + + Der scan kann durch die Angabe einer Selektion eingeschra"nkt + werden. Die Selektion ist eine Einschra"nkung des Wer- + tebereichs einzelner (oder aller) Doma"nen. Mehrere + Einschra"nkungen werden durch Komma "," getrennt. Eine Doma"ne + kann maximal zwei Einschra"nkungen erfahren. Alle + zugewiesenen Bedingungen und Werte der angebenen + Einschra"nkungen werden beim Einlauf in den scan gekellert, + so dass z.B. eine A"nderung des Wertes einer verwendeten C- + Variablen keinen Einfluss auf die Selektion hat. + + _2._5._1_0. PPPPrrrroooojjjjeeeekkkkttttiiiioooonnnn + + Die Projektion ist wahlweise, d.h. sie kann entfallen. Die + Projektion wird durch eine o"ffnende "(" und eine + schliessende runde Klammer ")" begrenzt. Sie weist fu"r + jedes, entsprechend der Selektion gefundene Tupel, der ange- + benen Menge von C-Variablen den aktuellen Wert der zugeord- + neten Doma"nen zu. Die einzelnen Zuweisungen werden durch + Komma "," getrennt. + + _2._5._1_1. AAAAkkkkttttiiiioooonnnn + + Die Aktion wird durch eine o"ffnende "{" und eine + schliessende geschweifte Klammer "}" begrenzt. Innerhalb der + Aktion ko"nnen beliebige AMX Statements stehen. Die Aktion + kann leer sein, allerdings mu"ssen die Klammern angegeben + sein. Es ist wichtig zu wissen, dass innerhalb der Aktion + die Doma"nenwerte des gefundenen Tupel immer vorhanden sind + und sich nicht a"ndern. + + BBBBEEEEIIIISSSSPPPPIIIIEEEELLLL + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 267 - AAAAMMMMXXXX + + + + . . . + ## open supply + ## open parts + . . . + ## scan supply $snum = 122 + ## { + ## scan parts /*parts*/$pnum = /*supply*/$pnum + ## { + . . . + ## } + ## } + . . . + ## close supply + ## close parts + . . . + + + Die U"bernahme von Werten aus dem u"bergeordneten scan gestat- + tet die einfache Implementierung von geschachtelten scan's + z.B. zur Zuordnung von Abku"rzungen zu Langformen (Nomenkla- + turen) usw. Bei Zeichenkettendoma"nen gestattet der AMX Com- + piler keine U"bernahme von Werten, wenn die La"nge der Doma"ne + des u"bergeordneten scan's ku"rzer als die La"nge der Doma"ne + des aktuellen scan's ist. Eine Mischung von numerischen + und Zeichenkettenwerten wird grundsa"tzlich nicht + unterstu"tzt. + + (24) qual : dom RELOP value + ; + + ddddoooommmm gibt die einzuschra"nkende Doma"ne und vvvvaaaalllluuuueeee den Wert der + Einschra"nkung an. Als Einschra"nkungen sind die Bedingungen + "RELOP": + + "=", "==", "<", "<=", ">", ">=", "!=" + + zula"ssig. Wird eine Doma"ne doppelt eingeschra"nkt, sind fol- + gende zula"ssige Kombinationen zu beachten: + + "<[=]" und ">[=]" + "<[=]" und "!=" + ">[=]" und "!=" + + Die Reihenfolge der Einschra"nkungen fu"r eine Doma"ne ist in + folgender Art einzuhalten: + + "<[=]" --> ">[=]" --> "!=" + + + (25) var_assign : c_var IS dom + ; ----- + + Eine Zuweisung weist der C-Variablen cccc____vvvvaaaarrrr den aktuellen + Wert der Doma"ne ddddoooommmm zu. Bei den Zuweisungen von numerischen + zu numerischen Typen werden die notwendigen Konver- + tierungen ohne U"berlauf- bzw. Unterlaufkontrolle vorgenom- + men. Zuweisungen von numerischen zu Zeichenkettenwerten und + umgekehrt sind nicht zula"ssig. + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 268 - AAAAMMMMXXXX + + + + (14) amx_stmt : PRINT LPAREN [ { dom } ] RPAREN + ; + + Das print-Statement gibt die Werte der, durch eine o"ffnende + "(" und eine schliessende runde Klammer ")", begrenzten + Liste der Doma"nen in einem Standardformat nach standard out- + put aus. Die Liste entha"lt eine durch Kommas "," getrennte + Aufza"hlung der auszugebenden Doma"nen. Eine leere Liste "()" + gibt die Werte aller Doma"nen aus. Das Standardformat entha"lt + den Namen und den Wert der Doma"ne in folgender Form: + + "%12s: %?\n", domainname, value + ? == Format der auszugebenden Doma"ne + + + (15) amx_stmt : DELETE + ; + + Das delete-Statement lo"scht das innerhalb des laufenden + scan's gefundene aktuelle Tupel aus der Datenbasis. + Innerhalb der Aktion bleibt das aktuelle Tupel mit seinen + Werten erhalten. Eventuell vorhandene Indizes werden + automatisch aktualisiert. + + (16) amx_stmt : REPLACE target + ; + + Das replace-Statement gestattet die A"nderung von Werten + einzelner (oder aller) Doma"nen. Eine Unterscheidung von + Schlu"ssel- und Nichtschlu"sseldoma"nen ist nicht zu beachten. + Die A"nderungen werden durch die Projektion ttttaaaarrrrggggeeeetttt spezi- + fiziert. Es ist zu beachten, dass die A"nderungen in einem + gesondertem Puffer ausgefu"hrt werden, also das aktuell + gefundene Tupel innerhalb des laufenden scan's unvera"ndert + bleibt. Eventuell vorhandene Indizes werden, falls no"tig, + automatisch aktualisiert. Eine Aktualsierung entfa"llt z.B., + wenn eine identische A"nderung (gea"ndertes == Ursprungstupel) + ausgefu"hrt wurde oder wenn die gea"nderten Doma"nen nicht Be- + standteil des Index sind und sich die Tupeladresse TTTTIIIIDDDD nicht + gea"ndert hat. + + (17) amx_stmt : APPEND target + ; + + Das append-Statement fu"gt ein neues Tupel in die aktuell + gescannte Relation ein. Durch die Projektion ttttaaaarrrrggggeeeetttt werden + den aufgefu"hrten Doma"nen Werte zugewiesen. Alle nicht ange- + benen Doma"nen erhalten den Wert aus dem aktuell gefundenen + Tupel des laufenden scan's. Es ist zu beachten, dass die + A"nderung in einem gesondertem Puffer ausgefu"hrt werden, also + das aktuell gefundene Tupel unvera"ndert bleibt. Eventuell + vorhandene Indizes werden automatisch aktualisiert. + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 269 - RRRReeeeppppoooorrrrtttt + + + _2._6. RRRReeeeppppoooorrrrtttt----GGGGeeeennnneeeerrrraaaattttoooorrrr **** + + + + + + + + + + + + + _2._6._1. VVVVoooorrrrbbbbeeeemmmmeeeerrrrkkkkuuuunnnngggg + + Wie jedes andere Werkzeug in UNIX oder auch innerhalb + ING_DB ist der Report-Generator eeeeiiiinnnneeee Alternative zur + Erstellung von Drucklisten. In der praktischen Anwendung + werden Drucklisten einerseits beno"tigt, um periodisch u"ber + lange Zeitra"ume Aussagen u"ber sich a"ndernde Datenbesta"nde zu + liefern, andererseits werden aber auch Aussagen mit einem + gewissen Einmaligkeitscharakter gewu"nscht. + + Im ersten Fall bleibt dem Projektanten in der Regel genug + Zeit, die Listenerstellung gru"ndlich vorzubereiten, sodass + die Erstellung innerhalb eines AMX- oder EQUEL-Programmes + sinnvoll und effektiv ist - vor allem unterliegt hier der + Zugriff zu verschiedenen Relationen keiner praktisch wirksa- + men Begrenzung. Das zu druckende File wird so direkt aus den + Datenbesta"nden der Relationen erzeugt. + + Bei Verwendung des Report-Generators werden die Daten aus + einem Tupelfile gelesen, das vorher aus eeeeiiiinnnneeeerrrr Relation + erzeugt werden muss. Die Erstellung dieser Relation aus den + Doma"nen verschiedener anderer Relationen ist technisch ein- + fach ( ssssccccaaaannnn ((((aaaammmmxxxx)))) oder rrrreeeettttrrrriiiieeeevvvveeee ((((qqqquuuueeeellll)))) ), kann aber gege- + benenfalls Dimensionierungsprobleme verursachen - jedes + Tupel muss der gleichen Struktur zugeordnet werden! + + Wir ko"nnen nicht davon ausgehen, dass alle ING_DB -Nutzer + mit C umgehen ko"nnen oder gerade dann, wenn operativ eine + Druckliste dringend beno"tigt wird, ein Programmierer + da"umchendrehend darauf gewartet hat! Der Umgang mit dem + Report-Generator ist relativ schnell erlernt. Zu Beginn muss + nicht jede Raffinesse eingeordnet werden. + + _2._6._2. AAAArrrrbbbbeeeeiiiittttsssssssscccchhhhrrrriiiitttttttteeee + + Wir verwenden wieder einmal unsere Relation aus "demo". + + + Relation: personal + --------- + Besitzer: ing_db + Tupellaenge: 30 + Verfallsdatum: Tue Apr 26 19:56:39 1988 + Tupelanzahl: 25 + Speicherstruktur: HEAP + Relationentyp: Nutzerrelation + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 270 - RRRReeeeppppoooorrrrtttt + + + + Domaenname Typ Laenge Schluessel + ------------------------------------------- + num i 2 + name c 20 + gehalt i 2 + leiter i 2 + gebdat i 2 + einstdat i 2 + ------------------------------------------- + + + Mit dem Kommando + + rrrrdddd ddddeeeemmmmoooo ppppeeeerrrrssssoooonnnnaaaallll + + wird ein File ddddeeeesssscccc erzeugt. Dieses File la"sst sich mit dem + Kommando + + rrrrpppp____ddddeeeesssscccc ddddeeeesssscccc + + auf dem Bildschirm darstellen. + + I +--------+ + N | Post | REPORT description printer + G | Quick | VERSION 6/3.1 + - | Report | RELEASE Thu Nov 14 00:00:00 1988 + D +--------+ + B ZKI 1988 + + | value | type | len | off | + +-------+-------+-------+-------+ + ! 1 | int | 2 | 0 | + ! 2 | char | 20 | 2 | + ! 3 | int | 2 | 22 | + ! 4 | int | 2 | 24 | + ! 5 | int | 2 | 26 | + ! 6 | int | 2 | 28 | + +-------+-------+-------+-------+ + + Beachten sie, dass der Vorspann auf ssssttttddddeeeerrrrrrrr und die Tabelle + auf ssssttttddddoooouuuutttt ausgegeben wird. + + Die Spalte vvvvaaaalllluuuueeee stellt den Doma"nennamen in Form eines Stel- + lungsparameters dar. + + _2._6._3. TTTTyyyypppp ,,,,LLLLaaaa""""nnnnggggeeee ,,,,OOOOffffffffsssseeeetttt + + Beachten Sie bitte , dass das angebotene Deskriptionfile im + Sinne der Beschreibung mit dem Datenfile identisch ist. + + Ein zweiter Weg zur Erstellung eines Deskriptionfiles ist + die Aufnahme einer Doma"nenbeschreibung in die Report-Quelle. + Bei Reports fu"r Relationen aus Datenbanken kann man mit rrrrdddd + ----rrrr einen leeren Report generieren, der die Beschreibung der + Dama"nen verankert.Der Compiler hat die Aufgabe, die + Doma"nenbeschreibung in das Deskriptionfile zu u"bersetzen. + + Der Variablenname im Report-Programm hat also keine unmit- + telbare Korrespondenz mit der Relation. Zu Beginn wollen + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 271 - RRRReeeeppppoooorrrrtttt + + + wir uns noch auf einige Dinge einigen, die vom Report- + Generator zwar nicht gefordert werden, aber dennoch recht + nu"tzlich sind. In UNIX werden u"blicherweise bestimmte + File-Typen mit einem Postfix versehen, es wird vorgeschlagen + + + Beschreibungsfile desc mit _d (analog Flag bei rg) + Datenfile tuple mit _f (analog Flag bei rg) + Ausgabe output mit _o (analog Flag bei rg) + Report-Quelle Quellcode mit _p (Programm) + r_code mit _r + + + zu benennen. Mit dieser Methode wird eine Gruppierung + erreicht, die garantiert, dass man auch bei mehr als 3 + Report-Programmen im Directory noch weiss, was wohin geho"rt. + Der underscore wurde verwendet, weil rc den Punkt nicht + anerkennt und um Verwechslungen mit dem Pascal Quellcode + bzw. dem C-Objektfile mo"glich wa"ren. + + Folgende Liste soll erstellt werden: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 272 - RRRReeeeppppoooorrrrtttt + + + + -------------------------------------------------- + Gehalt und Geburtsjahr nach Abteilungen 9-Mai-88 + + Abtlg. Name Gehalt Geburtsjahr + -------------------------------------------------- + + Rose, Petra 1206,- M 1931 + Gruene, Peter 1700,- M 1920 + + 10 Mueller, Ernst 700,- M 1950 + + 13 Fleischer, Karl 877,- M 1952 + + 26 Neumann, Inge 1198,- M 1950 + Schmidt, Hermann 1120,- M 1936 + Warnke, Peter 788,- M 1940 + + 32 Loda, Dieter 500,- M 1952 + Baum, Klaus 837,- M 1956 + + 33 Kayser, Helmut 600,- M 1952 + Weber, Franz 1337,- M 1944 + + 55 Maerz, Udo 1116,- M 1947 + Mueller, Petra 1362,- M 1939 + + 129 Moser, Otto 1567,- M 1938 + Schulze, Ernst 1564,- M 1944 + Zeidler, Fritz 1686,- M 1928 + + 199 Rose, Peter 1590,- M 1927 + Wunsch, Peter-Paul 900,- M 1928 + Schneider, Peter 1300,- M 1930 + Heine, Rolf 905,- M 1929 + Ernst, Eva 1010,- M 1931 + Malter, Juergen 1200,- M 1920 + Weise, Juergen 900,- M 1935 + Thoms, Rolf 1000,- M 1941 + Schmidt, Petra 1200,- M 1940 + -------------------------------------------------- + + + Als Ausgangsrelation verwenden wir ppppeeeerrrrssssoooonnnnaaaallll, die allerdings + nach lllleeeeiiiitttteeeerrrr sortiert werden muss. Das Kommando dazu mit der + QUEL: + + mmmmooooddddiiiiffffyyyy ppppeeeerrrrssssoooonnnnaaaallll ttttoooo hhhheeeeaaaappppssssoooorrrrtttt oooonnnn lllleeeeiiiitttteeeerrrr + + Das TTTTuuuuppppeeeellllffffiiiilllleeee erzeugen wir mit + + ccccooooppppyyyy ppppeeeerrrrssssoooonnnnaaaallll(((()))) iiiinnnnttttoooo """"////mmmmnnnntttt////wwwwoooorrrrkkkk////tttteeeexxxxtttt////ppppeeeerrrrssss....ffff"""" .... + + Das Programm dazu sieht so aus (pers_p): + + report pers_r + with + columns 50 + lines 60 + all lines 66 + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 273 - RRRReeeeppppoooorrrrtttt + + + + define p_num = 1 + define p_name = 2 + define p_gehalt = 3 + define p_abt = 4 + define p_gebdat = 5 + + define #p_num = integer 2 + define #p_name = char 20 + define #p_gehalt = integer 2 + define #p_abt = integer 2 + define #p_gebdat = integer 2 + + as + + on pagebegin do + '-' 50 \n + 'Gehalt und Geburtsjahr nach Abteilungen' + \42 date \n2 + 'Abtlg.' + \8 'Name' + \30 'Gehalt' + \40 'Geburtsjahr' + \n + '-' 50 \n2 + end + + for all do + for one do + if groupbegin p_abt then + \n integer @4 #p_abt + end if + \8 char @20 #p_name + \30 integer @5 #p_gehalt ',- M' + \40 integer @9 #p_gebdat + \n + end one + end all + ; + + Zum Programm folgt spa"ter noch eine Erla"uterung. Jetzt wird + aus ppppeeeerrrrssss____pppp der rrrr____ccccooooddddeeee erzeugt. Das Kommando dazu: + + rrrrcccc ppppeeeerrrrssss____pppp + + Durch die erste Zeile im Programm rrrreeeeppppoooorrrrtttt ppppeeeerrrrssss____rrrr weiss der + Report-Compiler wie das File "r_code" zu benennen ist. Mit + dem Aufruf + + rrrrgggg ----ddddppppeeeerrrrssss____dddd ----ffffppppeeeerrrrssss____ffff ----iiiippppeeeerrrrssss____rrrr + + wird die Druckliste auf dem Bildschirm ausgegeben. Fu"gen sie + noch die Option ----ooooppppeeeerrrrssss____oooo hinzu, steht das Ergebnis im File + ppppeeeerrrrssss____oooo.... + + _2._6._4. AAAAuuuuffffbbbbaaaauuuu ddddeeeerrrr LLLLiiiisssstttteeeennnnddddeeeeffffiiiinnnniiiittttiiiioooonnnn + + Jede Listendefinition beginnt mit rrrreeeeppppoooorrrrtttt und wird mit ;;;; + abgeschlossen. Der grundsa"tzliche Aufbau: + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 274 - RRRReeeeppppoooorrrrtttt + + + + [define] report r_code_name [desc_name] + with + formatierung + definitionen + as + kopfangaben + tupelverarbeitung + fussangaben + ; + + + Prozeduren werden mit ccccaaaallllllll aufgerufen, hierzu wurde kein + Symbol eingefu"rt. + + Fu"r die ddddeeeeffffiiiinnnniiiittttiiiioooonnnneeeennnn erfolgt eine Zuordnung mo"glicher Varia- + blen, Prozeduren, Boolescher Variablen zu einer laufenden + Nummer (jeweils mit 0 beginnend) und Doma"nen zu einer + laufenden Nummer (mit 1 beginnend). Die Doma"nendefinition + muss anschliessend durch eine Typzuordnung erga"nzt werden, + wobei dem Doma"nennamen ein '#' voranzustellen ist. Im Pro- + gramm gilt folgende Zuordnung von Bezeichnung und Symbol: + + Boolesche Variable (switch) ^ + Domaene (val) # + Variable (var) $ + + Fu"r die ffffoooorrrrmmmmaaaattttiiiieeeerrrruuuunnnngggg ko"nnen den Bezeichnern + + lines + all lines + columns + from page to page + from tupel to tupel + + Werte zugewiesen und gegebenenfalls mit bbbbiiiigggg eine + Grossbuchstaben-Konvertierung eingeschaltet werden. + + Die Parameter ko"nnen in beliebiger Reihenfolge angegeben + werden. Bei doppelt aufgefu"hrten gilt der zuletzt + definierte Parameter. Werden zum Zeitpunkt des Listenaufbaus + neue Festlegungen getroffen, verlieren die jeweiligen alten + Parameter ihre Gu"ltigkeit. Fu"r alle Parameter gelten Stan- + dardfestlegungen. Die Parameter haben folgende Bedeutung + (die Grossschreibung im Text dient nur der Hervorhebung, + Schlu"sselwo"rter ko"nnen im Programm klein und gross + geschrieben werden ): + + LLLLIIIINNNNEEEESSSS iiiinnnntttt + + La"nge des Informationsteils auf einer Seite (int + Zeilen), Standard: Wert von ALL LINES, wenn definiert, + sonst: 66, + + AAAALLLLLLLL LLLLIIIINNNNEEEESSSS iiiinnnntttt + + La"nge der physischen Druckseite (int Zeilen), Standard: + Wert von LINES, + + CCCCOOOOLLLLUUUUMMMMNNNNSSSS iiiinnnntttt + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 275 - RRRReeeeppppoooorrrrtttt + + + Breite des Informationsteils (int Spalten), Standard: + 132, + + FFFFRRRROOOOMMMM PPPPAAAAGGGGEEEE iiiinnnntttt + + Es werden nur die Seiten in die Liste eingetragen, + deren Seitennummer gro"sser oder gleich der angegebenen + Zahl int ist. Standard: 0; + + TTTTOOOO PPPPAAAAGGGGEEEE iiiinnnntttt + + Es werden nur die Seiten in die Liste eingetragen, + deren Seitennummer kleiner oder gleich der angegebenen + Zahl int ist. Standard: 32767 (Maximum); + + FFFFRRRROOOOMMMM TTTTUUUUPPPPLLLLEEEE iiiinnnntttt + + Es werden nur die Tupel verarbeitet, deren Tupelnummer + gro"sser oder gleich der angegebenen Zahl int ist. + Standard: 0 + + TTTTOOOO TTTTUUUUPPPPLLLLEEEE iiiinnnntttt + + Es werden nur die Tupel verarbeitet, deren Tupelnummer + kleiner oder gleich der angegebenen Zahl int ist. + Standard:32767 (Maximum) + + BBBBIIIIGGGG + + Alle Kleinbuchstaben werden beim Einschreiben in die + Liste automatisch in Grossbuchstaben umgewandelt. + Standard: keine Umwandlung + + Ist der Wert von LINES gro"sser als der von ALL LINES, wird + ALL LINES um ganze Vielfache seines Wertes erho"ht. Dies + bedeutet, dass sich eine Informationsseite u"ber zwei oder + mehr Druckseiten erstreckt. + + In pppprrrroooozzzzeeeedddduuuurrrreeeennnn werden alle in der Listendefinition beno"tigten + Prozeduren notiert. + + Die kkkkooooppppffffaaaannnnggggaaaabbbbeeeennnn enthalten alle Anweisungen zur Gestaltung + des Listenkopfes. In der Regel wird am Beginn der Kopfanga- + ben der Seitenaufbau definiert. Die Ausgabe von Tupelwerten + in den Kopfangaben ist nicht sinnvoll. + + Die llllaaaauuuuffffsssstttteeeeuuuueeeerrrruuuunnnngggg vereinigt in sich alle Mo"glichkeiten zur + Eintragung von Werten und Zeichenketten in die Liste, zur + Arithmetik und zur Seitengestaltung. + + Die Syntax und Semantik der Sprachanweisungen sind in den + angegebenen Kapiteln beschrieben. + + Die ttttuuuuppppeeeellllvvvveeeerrrraaaarrrrbbbbeeeeiiiittttuuuunnnngggg umfasst alle Anweisungen zur + Aufbereitung und Ausgabe der Tupelwerte. Die Beschreibung + der Tupelverarbeitung erfolgt im Abschnitt "Bereitstellung + der Tupelwerte". + + Im abschliessenden Teil ffffuuuussssssssaaaannnnggggaaaabbbbeeeennnn wird die Definition des + Listenfusses beschrieben. In der vorliegenden Version ko"nnen + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 276 - RRRReeeeppppoooorrrrtttt + + + hier die Funktionswerte einer Anfrage ausgewertet werden. + + Viele Anweisungen haben als Parameter die syntaktische Kon- + struktion nnnnuuuummmmbbbbeeeerrrr.... Bei number kann entweder ein Direktwert + int angegeben werden oder aber eine Variable. + + _2._6._5. VVVVoooorrrrsssscccchhhhuuuubbbb uuuunnnndddd PPPPoooossssiiiittttiiiioooonnnniiiieeeerrrrkkkkoooommmmmmmmaaaannnnddddoooossss + + Fu"r die Positionierung der auszugebenden Werte auf den + Seiten gibt es jeweils 2 Varianten, eine fu"r fleissige + Schreiber und eine fu"r diejenigen, die schnell zum Ziel kom- + men wollen! Es ko"nnen folgende Anweisungen gegeben werden: + + NNNNEEEEWWWW PPPPAAAAGGGGEEEE oder \\\\ffff + + Die aktuelle Seite wird abgeschlossen. Es erfolgt der + Vorschub auf eine neue Seite. Aus Sparsamkeitsgru"nden + wird ein mehrfaches NEW PAGE nur einmal ausgefu"hrt. + Es werden nur Seiten ausgegeben, die mindestens ein + Zeichen enthalten. Wird also eine Leerseite gewu"nscht, + muss zwischen den zwei NEW-PAGE-Anweisungen mindestens + ein Leerzeichen ausgegeben werden. + + NNNNEEEEWWWW LLLLIIIINNNNEEEE nnnnuuuummmmbbbbeeeerrrr oder \\\\nnnnnnnnuuuummmmbbbbeeeerrrr + + Es erfolgt der Vorschub auf eine neue Zeile. Die alte + Zeile wird abgeschlossen und number-1 Leerzeilen werden + ausgegeben. Der Standardwert fu"r number ist 1. Wurde + der Wert von LINES erreicht, wird ein Seitenvorschub + ausgefu"hrt. + + CCCCOOOOLLLL nnnnuuuummmmbbbbeeeerrrr oder \\\\nnnnuuuummmmbbbbeeeerrrr + + Es wird auf die Spalte number positioniert. Hat die + aktuelle Schreibposition in der Zeile bereits u"ber die + angegebene Spalte number u"berschritten, erfolgt ein + automatisches NEW LINE und danach die Positionierung. + Wenn bei Variante 2 der Aufwand zum Ausza"hlen zu gross + ist, ko"nnen sie mit \\\\\\\\nnnnuuuummmmbbbbeeeerrrr auch relativ posi- + tionieren. + + SSSSPPPPAAAACCCCEEEE nnnnuuuummmmbbbbeeeerrrr oder \\\\\\\\nnnnuuuummmmbbbbeeeerrrr + + Es werden number Leerzeichen eingefu"gt. + + Bei der Kurzform sollte der Zwischenraum von \ zu number + entfallen, er verwirrt nur. + + Positionierungen auf einer Seite ko"nnen ausserdem durch + Wertzuweisungen erreicht werden (SET LINE..., SET + COLUMN...). Diese Mo"glichkeit ist in Abschnitt "Wert- + zuweisung zu Systemvariablen .." beschrieben. + + BBBBeeeeiiiissssppppiiiieeeellll + + new page + new line 5 + col 11 + + Es wird auf die 11. Spalte der 5. Zeile einer neuen Seite + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 277 - RRRReeeeppppoooorrrrtttt + + + positioniert. In Kurzform + + \f + \n5 + \11 + + + _2._6._6. AAAAuuuussssggggaaaabbbbeeee kkkkoooonnnnssssttttaaaannnntttteeeerrrr ZZZZeeeeiiiicccchhhheeeennnnkkkkeeeetttttttteeeennnn + + Es besteht die Mo"glichkeit, Zeichenketten in der Listende- + finition festzulegen, die unvera"ndert in die Liste + u"bernommen werden. + + 'zeichenkette' BATCH number + 'zeichenkette' number + + Bei zzzzeeeeiiiicccchhhheeeennnnkkkkeeeetttttttteeee nnnnuuuummmmbbbbeeeerrrr wird die zeichenkette number-mal in + die Liste u"bertragen. + + BBBBeeeeiiiissssppppiiiieeeellll + + '=+' 5 + + + Es wird die Zeichenkette '=+=+=+=+=+' in die Liste + eingetragen. + + Die BATCH-Funktion erlaubt das "Stapeln" einer + Zeichenkette. Unter Stapeln wird die Mo"glichkeit verstanden, + eine Zeichenkette in einer bestimmten Breite (number + Zeichen) u"ber mehrere Zeilen auszugeben. Dabei wird durch + den Reportgenerator versucht, nur ganze Worte zu + u"bertragen. Ist ein Wort la"nger als die festgelegte Breite, + muss es auf zwei oder mehr Zeilen verteilt werden. Eine Sil- + bentrennung fu"hrt das System nicht aus. + + Der Aufbau einer BATCH-Zeichenkette erfolgt in zwei Schrit- + ten: + + 1. In die aktuelle Zeile wird der erste Teil der + Zeichenkette in der durch number bestimmten La"nge + eingetragen. Danach werden weitere Anweisungen fu"r die + Zeile bearbeitet. + + 2. Bei Vorschub auf eine neue Zeile wird der Rest der + BATCH-Zeichenkette auf zusa"tzliche Zeilen verteilt, den + sogenannten BATCH-Zeilen. Wenn sie erwarten, dass die + gesamte Zeichenkette ausgegeben und verteilt werden + soll, muss eine La"ngenangabe erfolgen. + + BBBBeeeeiiiissssppppiiiieeeellll + + 'DAS IST ALLES NICHT SO KOMPLIZIERT' batch $breite @35 + + + Folgende Zeichenketten werden eingetragen, wenn die Vari- + able "breite" die Werte + + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 278 - RRRReeeeppppoooorrrrtttt + + + + 12 bzw. 5 hat: + + DAS IST DAS + ALLES NICHT IST + SO ALLES + KOMPLIZIERT NICHT + SO + KOMPL + IZIER + T + + + Die BATCH-Funktion kann fu"r mehrere Zeichenketten in einer + Zeile verwendet werden. Die na"chste regula"re Zeile folgt + dann unmittelbar nach dem la"ngsten aller Stapel. + + Um auch BATCH-Zeilen gestalten zu ko"nnen, z. B. Tabellen- + striche weiter zu fu"hren oder auch Werte auszugeben, wird + eine spezielle Anweisung zur Verfu"gung gestellt. + + SSSSyyyynnnnttttaaaaxxxx + + + ON BATCHLINE [DO] [laufsteuerung] ENDO + + + Sie definiert den Grundaufbau ("Hintergrund") einer BATCH- + Zeile. Beim Auftreten dieser Anweisung wird eine solche + Zeile noch nicht aufgebaut. Dies erfolgt erst nach dem + Abschluss der regula"ren Zeile vor dem Aufbau einer BATCH- + Zeile. Die BATCH-Zeichenketten werden dann in die vor- + bereiteten BATCH-Zeilen eingetragen. + + BBBBeeeeiiiissssppppiiiieeeellll + + on batchline do + 'I' + \15 'I' + \29 'I' + endo + \n2 + + + I DAS IST I WIE ES I + I ALLES NICHT I SCHEINT I + I SO I I + I KOMPLIZIERT I I + + + _2._6._7. EEEEiiiinnnnggggaaaabbbbeeee vvvvoooonnnn ZZZZeeeeiiiicccchhhheeeennnnkkkkeeeetttttttteeeennnn uuuu""""bbbbeeeerrrr TTTTeeeerrrrmmmmiiiinnnnaaaallll + + Fu"r die Gestaltung variabler Texte in der Liste, die nicht + Teil der Tupeldatei sind, steht die Bedienereingabe von + Zeichenketten zur Verfu"gung. + + SSSSyyyynnnnttttaaaaxxxx + + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 279 - RRRReeeeppppoooorrrrtttt + + + + + TERMINAL zeichenkette [BATCH number] + + + Die Bearbeitung der Anweisung vollzieht sich in folgenden + Schritten: + + + 1. Der Text von 'zeichenkette' wird auf dem Terminal unter + Anfu"gung des Zeichens ">" ausgegeben. + + 2. Die Eingabe der, in die Liste einzutragenden Zeichen- + kette, vom Terminal wird erwartet. + + 3. Die eingelesene Zeichenkette wird nun genauso behan- + delt, wie eine Zeichenkette, die direkt in der Listen- + definition angegeben wurde. Die Bearbeitung eines + Wiederholungsfaktors ist nicht mo"glich. + + Zu beachten ist, dass die eingelesenen Zeichenketten nicht + abgespeichert werden. Dies bedeutet, dass die Eingabe + wiederholt vorgenommen werden muss, wenn die Anweisung TER- + MINAL in einem Zyklus steht. + + BBBBeeeeiiiissssppppiiiieeeellll + + terminal 'NAME DES KUNDEN' \n2 + + Bei der Abarbeitung dieser Anweisungen erscheint auf dem + Terminal die Ausschrift: + + NAME DES KUNDEN> + + Wird als Name "Mueller" angegeben, steht in der Liste + dann: + Werter Herr Mueller! + + + _2._6._8. BBBBeeeerrrreeeeiiiittttsssstttteeeelllllllluuuunnnngggg ddddeeeerrrr TTTTuuuuppppeeeellllwwwweeeerrrrtttteeee + + Die Bereitstellung der Tupelwerte erfolgt im Teil ttttuuuuppppeeeellll---- + vvvveeeerrrraaaarrrrbbbbeeeeiiiittttuuuunnnngggg.... + + SSSSyyyynnnnttttaaaaxxxx + + FOR ALL [DO] [laufsteuerung] + + FOR [ONE] [DO] [laufsteuerung] END [ONE] | ENDO + [laufsteuerung] END ALL | ENDA + + Die Tupelverarbeitung hat also folgendes Aussehen: + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 280 - RRRReeeeppppoooorrrrtttt + + + + FOR ALL DO + . + . + . + FOR ONE DO + . + . + . + END ONE + . + . + . + END ALL + + + Erreicht die Abarbeitung die Anweisung FOR ALL DO, wird das + jeweils na"chste Tupel gelesen. Zwischen FOR ONE DO und END + ONE kann das Tupel verarbeitet werden. Wird festgestellt, + dass alle Tupel gelesen wurden, erfolgt die weitere Abar- + beitung der Listendefinition ab der ersten Anweisung nach + END ALL. + + Die Konstruktion FOR ALL DO ... END ALL kann als Zyklus + betrachtet werden, der verlassen wird, wenn alle Tupel der + Eingabedatei verarbeitet wurden. + + Der Zugriff auf die Werte eines Tupels wird durch das + Schlu"sselwort VALUE oder das Schlu"sselzeichen # und + die Nummer der Doma"ne realisiert. Sicherlich hat sich die + vermeintliche Doppeldefinition im Einfu"hrungsbeispiel etwas + umsta"ndlich ausgenommen. + + define p_num = 1 + . + . + define #p_num = integer 2 + + Das spart aber viel Arbeit, weil sie nicht unbedingt #p_num + schreiben mu"ssen, um den Wert dieser Doma"ne zu erreichen - + es genu"gt auch #1. Sie haben zu entscheiden, ob die + U"bersicht mit der zweiten Variante noch gewahrt bleibt. + + Der Reportgenerator fu"r ING_DB ermo"glicht nicht nur den + Zugriff zum aktuellen Tupel, sondern auch zum unmittelbar + vorhergehenden und nachfolgenden durch die Schlu"sselwo"rter + LAST und NEXT. + + SSSSyyyynnnnttttaaaaxxxx + + LAST number + NEXT number + + + LAST und NEXT ko"nnen u"berall dort verwendet werden, wo auch + # mo"glich ist. Das heisst, dass gleichzeitig drei Tupel aus- + gewertet werden ko"nnen und ermo"glicht beispielsweise die + Ausgabe von drei Tupeln nebeneinander u"ber mehrere Zeilen. + + Wird mit number auf ein Attribut zugegriffen, das im Tupel + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + diff --git a/WEGA/contrib/ingres/dbs/ing_doc/teil2/doc2_ae b/WEGA/contrib/ingres/dbs/ing_doc/teil2/doc2_ae new file mode 100644 index 0000000..dda23ef --- /dev/null +++ b/WEGA/contrib/ingres/dbs/ing_doc/teil2/doc2_ae @@ -0,0 +1,2160 @@ + + + + Anwendung - 281 - RRRReeeeppppoooorrrrtttt + + + gar nicht existiert, wird eine Warnung auf dem Bedientermi- + nal ausgegeben und die Doma"ne Null verwendet. Wird auf ein + Tupel zugegriffen, welches nicht existiert, z. B. bei der + erstmaligen Abarbeitung von FOR ONE DO auf das Tupel "LAST", + haben alle Tupelattribute einen NULL-Wert. + + Der NULL-Wert kennzeichnet ein Attribut als nicht definiert. + Er kann auch innerhalb von Tupeln auftreten. Intern ist der + NULL-Wert durch eine bestimmte Bitkombination verschlu"sselt. + + Bevor wir mit der Theorie fortfahren, versuchen wir ein + etwas umfangreicheres Beispiel, das zwar teilweise ein Vor- + griff auf Kommendes ist - im Wesentlichen aber Bekanntes + benutzt. Sie kopieren die Relation "personal" aus "demo" zu + "perskomp" auf folgende Form: + + + Relation: perskomp + + + |name |qual |pkz |lohn |abt |gruppe| + |---------------------------------------------------------------| + |Gruene, Peter |Dipl.Ing|301220433447| 1700| 0| 1| + |Rose, Petra |Oekonom |270531327326| 1206| 0| 1| + |Mueller, Ernst |Kaufmann|110450423412| 700| 10| 12| + |Fleischer, Karl |Kraftf. |200652456768| 877| 13| 23| + |Schmidt, Hermann |Ing.Oek.|130536487246| 1120| 26| 10| + |Neumann, Inge |Ing. |120950366789| 1198| 26| 23| + |Warnke, Peter |FA |120740423408| 788| 26| 23| + |Baum, Klaus |FA |191156423577| 837| 32| 10| + |Loda, Dieter |FA |040352433406| 500| 32| 10| + |Weber, Franz |Dipl.Ing|261044466201| 1337| 33| 2| + |Kayser, Helmut |TFA |200652434556| 600| 33| 11| + |Maerz, Udo |Ing. |120947434566| 1116| 55| 2| + |Mueller, Petra |Dipl.Ing|111139334464| 1362| 55| 3| + |Schulze, Ernst |Dipl.Ing|221144434043| 1564| 129| 1| + |Zeidler, Fritz |Dipl.Oek|310328434035| 1686| 129| 1| + |Moser, Otto |Dipl.Ing|241238434052| 1567| 129| 3| + |Weise, Juergen |FA |131235435334| 900| 199| 4| + |Malter, Juergen |Ing. |180620435662| 1200| 199| 5| + |Rose, Peter |Dipl.Oek|200227435046| 1590| 199| 5| + |Ernst, Eva |Dipl.Ma.|130431334667| 1010| 199| 6| + |Heine, Rolf |Oek. |220829435672| 905| 199| 6| + |Schmidt, Petra |Dipl.Ma.|101040334223| 1200| 199| 6| + |Thoms, Rolf |Oek. |100341434221| 1000| 199| 6| + |Schneider, Peter |Oek. |130730434446| 1300| 199| 7| + |Wunsch, Peter-Paul |Ing. |050428433078| 900| 199| 7| + |---------------------------------------------------------------| + + + Mit ccccooooppppyyyy ppppeeeerrrrssssccccoooommmmpppp(((()))) iiiinnnnttttoooo """"mmmmnnnntttt////wwwwoooorrrrkkkk////tttteeeexxxxtttt////kkkkoooommmmpppp....ffff"""" erstellen + sie das Tupelfile und anschliessend das Deskription-File. + Das Programm kkkkoooommmmppppllll____pppp soll eine stark vereinfachte FZR- + Beitragsu"bersicht erstellen: + + report kompl_r + with + /* page layout */ + columns 60 + lines 36 + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 282 - RRRReeeeppppoooorrrrtttt + + + all lines 48 + + /* procedures */ + define p_fzr = 1 + define p_pgw = 2 + + /* switches */ + define last_page = 1 + + /* variables */ + define next_page = 0 + define fzr = 1 + define grp_lohn = 2 + define grp_fzr = 3 + define grp_cnt = 4 + define abt_lohn = 5 + define abt_fzr = 6 + define abt_cnt = 7 + + /* domains */ + define d_name = 1 + define d_qual = 2 + define d_pkz = 3 + define d_lohn = 4 + define d_abt = 5 + define d_gruppe = 6 + + define #d_name = char 20 + define #d_qual = char 8 + define #d_pkz = char 12 + define #d_lohn = integer 2 + define #d_abt = integer 2 + define #d_gruppe = integer 2 + as + + proc p_fzr + set $fzr = ($fzr - 600) / 10 + if $fzr > 60 then set $fzr = 60 end if + return + + proc p_pgw + if line < 47 then 'I' end if + return + + on pagebegin do + '-' 60 \n + 'VEB Generatorwerke' + \50 date \n + '1234 Berlin' + \50 time \n + 'Beispielstr. 13' + \28 'Seite: ' integer page \n + '-' 60 \n2 + if ! page == 1 then + \20 'Liste der Abteilung ' integer #d_abt + end if + \n2 + end + + on pageend do + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 283 - RRRReeeeppppoooorrrrtttt + + + if ! ^last_page then + set $next_page = page + 1 + \36 'Es folgt Seite: ' integer $next_page + end if + \n + '-' 60 \n3 + end + + on lineend do call p_pgw end + on linebegin do call p_pgw end + + on batchline do + \18 + if #d_pkz from 7 to 7 == '4' + then 'maennl' + else 'weibl' + end if + end + + set line = 10 + \\20 'Liste der Abteilungen ' new page + + for all do + for one do + if groupbegin d_abt then new page end if + if groupbegin d_gruppe then + '**** Gruppe ' integer @3 #d_gruppe + ' ****' \n2 + 'Name' + \15 'Qualifikation' + \32 'Geb.-Datum' + \45 'Lohn' + \55 'FZR' \n + \15 'maennl/weibl' \n2 + end if + + set $fzr = #d_lohn + call p_fzr + char batch 10 @20 #d_name + \18 char #d_qual + \33 char to 2 #d_pkz '.' + char from 3 to 4 #d_pkz '.' + char from 5 to 6 #d_pkz + \44 integer @4 #d_lohn ',-M' + \54 integer @3 $fzr ',-M' \n + set $grp_lohn += #d_lohn + set $grp_fzr += $fzr + set $grp_cnt += 1 + if groupend d_gruppe then + set $abt_lohn += $grp_lohn + set $abt_fzr += $grp_fzr + set $abt_cnt += $grp_cnt + if $grp_cnt > 0 then + set $grp_lohn := $grp_cnt + set $grp_fzr := $grp_cnt + end if + \28 'Durchschnitt: ' + \44 integer @4 $grp_lohn ',-M' + \54 integer @3 $grp_fzr ',-M' \n2 + set $grp_lohn = 0 + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 284 - RRRReeeeppppoooorrrrtttt + + + set $grp_fzr = 0 + set $grp_cnt = 0 + '-' 60 \n + end if + if groupend d_abt then + if $abt_cnt > 0 then + set $abt_lohn := $abt_cnt + set $abt_fzr := $abt_cnt + end if + 'Durchschnitt der Abteilung: ' + \44 integer @4 $abt_lohn ',-M' + \54 integer @3 $abt_fzr ',-M' \n2 + set $abt_lohn = 0 + set $abt_fzr = 0 + set $abt_cnt = 0 + '=' 60 \n + end if + end one + end all + + set ^last_page; + + Als Ausgabegera"t wurde ein Seriendrucker mit 48 Zeilen + Seitenla"nge gewa"hlt, der softwareseitig keinen Seiten- + vorschub realisieren kann (Ausgabe von Zeilenvorschub). Da + jeweils am Zeilenanfang und -ende mit 'I' gerahmt werden + soll, ist durch die Prozedur pppp____ppppggggwwww die Abfrage nach den + Zeilennummern 1..46 eingeordnet, um zu verhindern, dass auf + den Zeilen 47 und 48 (Seitenfalz) ebenfalls ein 'I' + erscheint. Bei Druckern (Paralleldrucker), die diese + Einschra"nkung nicht kennen, kann die Prozedur p_pgw entfal- + len. + + Die Rolle von lllliiiinnnneeeessss und aaaallllllll lllliiiinnnneeeessss soll am Beispiel nochein- + mal erkla"rt werden. Die Differenz zwischen beiden betra"gt + 12, also die Summe der nnnneeeewwww lllliiiinnnneeeessss,,,, die fu"r die Abschnitte oooonnnn + ppppaaaaggggeeeebbbbeeeeggggiiiinnnn ddddoooo und oooonnnn ppppaaaaggggeeeeeeeennnndddd ddddoooo verwendet wurden. Damit + stehen fu"r den Informationsteil tatsa"chlich nur 36 Zeilen + zur Verfu"gung. Bei einem Drucker mit 72 Zeilen mu"ssten + entsprechend fu"r lllliiiinnnneeeessss 60 Zeilen und aaaallllllll lllliiiinnnneeeessss 72 Zeilen + geschrieben werden. Falls sie sich hierbei verza"hlen, + erhalten sie in der Regel unbrauchbare Seitenformatierungen. + Bevor weitere Erla"uterungen folgen, einige Auszu"ge aus dem + tatsa"chlichen Druckbild: + + + + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 285 - RRRReeeeppppoooorrrrtttt + + + + I------------------------------------------------------------I + IVEB Generatorwerke 19-May-88 I + I1234 Berlin 11:18:42 I + IBeispielstr. 13 Seite: 2 I + I------------------------------------------------------------I + I I + I Liste der Abteilung 0 I + I I + I**** Gruppe 1 **** I + I I + IName Qualifikation Geb.-Datum Lohn FZR I + I maennl/weibl I + I I + IGruene, Dipl.Ing 30.12.20 1700,-M 60,-M I + IPeter maennl I + IRose, Oekonom 27.05.31 1206,-M 60,-M I + IPetra weibl I + I Durchschnitt: 1453,-M 60,-M I + I I + I------------------------------------------------------------I + IDurchschnitt der Abteilung: 1453,-M 60,-M I + I I + I============================================================I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I Es folgt Seite: 3 I + I------------------------------------------------------------I + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 286 - RRRReeeeppppoooorrrrtttt + + + + I------------------------------------------------------------I + IVEB Generatorwerke 19-May-88 I + I1234 Berlin 11:19:29 I + IBeispielstr. 13 Seite: 10 I + I------------------------------------------------------------I + I I + I Liste der Abteilung 199 I + I I + I**** Gruppe 4 **** I + I I + IName Qualifikation Geb.-Datum Lohn FZR I + I maennl/weibl I + I I + IWeise, FA 13.12.35 900,-M 30,-M I + IJuergen maennl I + I Durchschnitt: 900,-M 30,-M I + I I + I------------------------------------------------------------I + I**** Gruppe 5 **** I + I I + IName Qualifikation Geb.-Datum Lohn FZR I + I maennl/weibl I + I I + IMalter, Ing. 18.06.20 1200,-M 60,-M I + IJuergen maennl I + IRose, Dipl.Oek 20.02.27 1590,-M 60,-M I + IPeter maennl I + I Durchschnitt: 1395,-M 60,-M I + I I + I------------------------------------------------------------I + I**** Gruppe 6 **** I + I I + IName Qualifikation Geb.-Datum Lohn FZR I + I maennl/weibl I + I I + IErnst, Eva Dipl.Ma. 13.04.31 1010,-M 41,-M I + I weibl I + IHeine, Oek. 22.08.29 905,-M 30,-M I + IRolf maennl I + ISchmidt, Dipl.Ma. 10.10.40 1200,-M 60,-M I + IPetra weibl I + IThoms, Oek. 10.03.41 1000,-M 40,-M I + IRolf maennl I + I Durchschnitt: 1029,-M 43,-M I + I Es folgt Seite: 11 I + I------------------------------------------------------------I + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 287 - RRRReeeeppppoooorrrrtttt + + + + I------------------------------------------------------------I + IVEB Generatorwerke 19-May-88 I + I1234 Berlin 11:19:41 I + IBeispielstr. 13 Seite: 11 I + I------------------------------------------------------------I + I I + I Liste der Abteilung 199 I + I I + I I + I------------------------------------------------------------I + I**** Gruppe 7 **** I + I I + IName Qualifikation Geb.-Datum Lohn FZR I + I maennl/weibl I + I I + ISchneider, Oek. 13.07.30 1300,-M 60,-M I + IPeter maennl I + IWunsch, Ing. 05.04.28 900,-M 30,-M I + IPeter-Paul maennl I + I Durchschnitt: 1100,-M 45,-M I + I I + I------------------------------------------------------------I + IDurchschnitt der Abteilung: 1112,-M 46,-M I + I I + I============================================================I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I------------------------------------------------------------I + + + + + Sofern sie die Liste auf einem Paralleldrucker mit einer + Seitenla"nge von 66 Zeilen ausgeben wollen, kann die Prozedur + p_pgw, wie ereits erwa"hnt, weggelassen werden. Die Kopfin- + formationen sehen dann so aus: + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 288 - RRRReeeeppppoooorrrrtttt + + + + /* page layout */ + columns 60 + lines 56 + all lines 66 + big + + Die Behandlung des Seitenendes muss entsprechend obiger + Definition auf + + on pageend do + if ! ^last_page then + set $next_page = page + 1 + \36 'Es folgt Seite: ' integer $next_page + end if + '-' 60 \n + end + + gea"ndert werden und die Zeilenende und -anfangsbehandlung + sieht jetzt so aus: + + on lineend do 'I' end + on linebegin do 'I' end + + + Falls sie in der Zeile + + char batch 10 @20 #d_name + + die La"ngenangabe @20 vergessen, werden in der 2. Zeile exakt + soviele Zeichen nicht ausgegeben, wie in der 1. gespart wur- + den. Es steht dann beispielsweise: + + Thoms, + R + Schmidt, + Petr + + + _2._6._9. SSSSyyyysssstttteeeemmmmvvvvaaaarrrriiiiaaaabbbblllleeee + + Systemvariable werden automatisch dem Nutzer zur Verfu"gung + gestellt. Sie besitzen einen definierten Anfangswert und + ko"nnen durch den Nutzer beliebige Werte zugewiesen bekommen. + + Die Variablen haben folgende Bedeutung: + + PPPPAAAAGGGGEEEE + + Nummer der aktuellen Seite + Mit 1 beginnend, wird bei jedem Vorschub auf eine neue + Seite der Wert PAGE um eins erho"ht. PAGE kann vom + Nutzer ein beliebiger Wert zwischen 0 und 32767 + zugewiesen werden. + + TTTTUUUUPPPPLLLLEEEE + + Nummer des aktuellen Tupels + Mit 1 beginnend, wird bei jedem Einlesen eines neuen + Tupels dieser Wert um eins erho"ht. TUPLE kann vom + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 289 - RRRReeeeppppoooorrrrtttt + + + Nutzer ein beliebiger Wert zwischen 0 und 32767 + zugewiesen werden. + + LLLLIIIINNNNEEEE + + aktuelle Zeilennummer auf der Seite + Ist LINE das Ziel einer Wertzuweisung, wird nicht nur + die neue Zeilennummer in LINE eingetragen, sondern + tatsa"chlich auch die angegebene Zeile der Seite posi- + tioniert. Ist die aktuelle Zeilennummer bereits + gro"sser oder gleich der berechneten, erfolgt automa- + tisch der Vorschub auf eine neue Seite und danach die + Positionierung auf die gewu"nschte Zeile. + + CCCCOOOOLLLLUUUUMMMMNNNN + + aktuelle Schreibposition (Spalte, mit 1 beginnend) in + der Zeile + Ist COLUMN Ziel einer Wertzuweisung, wird der + gewu"nschte Wert in COLUMN eingetragen und auf die + Spalte positioniert. + + VVVVAAAARRRR + + allgemeine Variable + Dem Nutzer stehen 126 Variable (VAR0 - VAR125) zur + freien Verfu"gung Der Nummer kann mit ddddeeeeffffiiiinnnneeee ein + entsprechender Name zugeordnet werden. Sie werden im + Gegensatz zu Doma"nenwerten (#) mit $NAME oder $number + (mit 0 beginnend) gerufen. Den verfu"gbaren Variablen + ko"nnen Integer- und Realwerte zugewiesen werden. Am + Anfang sind alle Variablen mit dem Wert 0 initial- + isiert. + Die allgemeinen Variablen sollten nicht mit den Bool- + schen Variablen verwechselt werden, hier sind ebenfalls + 126 Variable verfu"gbar, die den Wert TRUE oder FALSE + annehmen ko"nnen (s. Abschnitt "Boolsche Variable"). + + Alle Systemvariablen beinhalten numerische Werte und ko"nnen + als solche in die Liste eingetragen werden. + + Zeichenkettenvariablen gibt es im Reportgenerator nicht. + + _2._6._1_0. SSSSyyyysssstttteeeemmmmkkkkoooonnnnssssttttaaaannnntttteeee,,,, DDDDaaaattttuuuummmm,,,, UUUUhhhhrrrrzzzzeeeeiiiitttt + + Die Systemkonstanten werden dem Nutzer fu"r die Ausgabe und + Verwendung in arithmetischen Ausdru"cken zur Verfu"gung + gestellt. Sie ko"nnen nicht Ziel einer Wertzuweisung sein: + + + YEAR aktuelles Jahr (0 bis 99 als Jahr - 99) + MONTH aktueller Monat (0 bis 11) + DAY aktueller Tag (1 bis 31) + M_DAY aktueller Tag im Monat (1 bis 31) + W_DAY aktueller Tag der Woche (0 = Sonntag bis 6) + Y_DAY aktueller Tag im Jahr (0 bis 365) + HOUR aktuelle Stunde (0 bis 23) + MINUTE aktuelle Minute (0 bis 59) + SECOND aktuelle Sekunde (0 bis 59). + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 290 - RRRReeeeppppoooorrrrtttt + + + Die Konstanten werden beim Start des Report-Generators neu + aus der Systemzeit des Rechners ermittelt. + + Der Reportgenerator fu"r ING_DB stellt zwei spezielle Funk- + tionen fu"r die Ausgabe von Datum und Uhrzeit zur Verfu"gung: + + + DATE in der Form tt-mmm-jj + TIME in der Form hh:mm:ss. + + + BBBBeeeeiiiissssppppiiiieeeellll + + 'DATUM UND UHRZEIT:' date ' ' time + + erzeugt den Text + + DATUM UND UHRZEIT: 27-JAN-86 11:13:25 + + + _2._6._1_1. AAAAuuuussssggggaaaabbbbeeee vvvvoooonnnn nnnnuuuummmmeeeerrrriiiisssscccchhhheeeennnn WWWWeeeerrrrtttteeeennnn + + In diesem Abschnitt werden die Ausgabemo"glichkeiten von + numerischen Werten vorgestellt. Dafu"r stehen die drei Funk- + tionen + + - INTEGER + - REAL + - GRAPHIC + + zur Verfu"gung. Welche numerische Wertart die auszugebenden + Werte intern besitzen, ist fu"r die Funktionen ohne Bedeu- + tung. Welcher Wert ausgegeben werden soll, wird unmittelbar + hinter der Funktion angegeben. + + Der erste Parameter dieser Funktionen ist die llllaaaaeeeennnnggggeeee .... + + [LENGTH number] + oder + [@number] + + "laenge" legt die Anzahl der Zeichen fest, die fu"r die + Ausgabe des Wertes in der Listenzeile zur Verfu"gung gestellt + werden. Diese Anzahl kann den Funktionen mit Angabe von + Number vorgegeben werden. Die Zahlen werden dann + rechtsbu"ndig in den bereitgestellten Platz eingetragen. + Fehlt die La"ngenangabe, wird genau so viel Platz in der + Zeile beansprucht, wie fu"r die Darstellung des Wertes + notwendig ist. Die Zahl wird also linksbu"ndig ab der aktuel- + len Schreibposition eingetragen. Die na"chste Ausgabe erfolgt + dann unmittelbar hinter dem Wert. + + _2._6._1_1._1. AAAAuuuussssggggaaaabbbbeeee aaaallllssss IIIInnnntttteeeeggggeeeerrrr----ZZZZaaaahhhhllll + + Die Darstellung eines Wertes erfolgt als ganze Zahl. + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 291 - RRRReeeeppppoooorrrrtttt + + + + _ _ + | | + INTEGER laenge | SCALE real | num daten + | PIC zeichenkette | + ~ ~ + + + Wahlweise kann ein Skalierungsfaktor und eine + Druckaufbereitungsmaske spezifiziert werden. + + Der Wert wird mit dem Skalierungsfaktor multipliziert. Damit + lassen sich bequem Massstabsvera"nderungen, Zinsberechnungen, + Prozentrechnungen u.a. realisieren. Der auszugebende Wert + wird eventuell gerundet. + + BBBBeeeeiiiissssppppiiiieeeellll + + integer @18 + scale 0.0325 + pic 'ZINSEN: 00009.99 M' + #p_guthab + + Hat #p_guthab den Wert 20000, wird in die Liste + eingetragen: + + ZINSEN: 6.50 M + + Die Symbole einer Druckaufbereitungsmaske PIC haben fest + zugeordnete Bedeutungen. Diese sind im einzelnen: + + < linksbu"ndiges Eintragen der aufbereiteten Maske in die + verfu"gbare Spalte + + > rechtsbu"ndiges Eintragen der aufbereiteten Maske in die + verfu"gbare Spalte + + = zentriertes Eintragen der aufbereiteten Maske in die + verfu"gbare Spalte + + 9 Eintragen einer Ziffer + + 0 Eintragen einer Ziffer, falls es sich nicht um eine + Vornull handelt. Bei Vornullen wird ein Leerzeichen + bzw. das Vorzeichen (falls gewu"nscht) eingetragen. + + + unbedingte Darstellung des Vorzeichens unmittelbar + vor der ersten Ziffer; + + - Darstellung nur des negativen Vorzeichens unmittelbar + vor der ersten Ziffer (Standard); + sonst unvera"nderte U"bernahme in das Ausgabebild. Um die + Symbole fu"r die Druckaufbereitung als normale Zeichen + verwenden zu ko"nnen, mu"ssen sie mit dem Zeichen '\' + kaschiert (geschu"tzt) werden. Das Zeichen '\' ist durch die + Umschreibung '\\' verfu"gbar. + + Die Symbole fu"r die Positionierung der + Druckaufbereitungsmaske ko"nnen an beliebiger Stelle stehen, + das zuletzt gegebene Symbol wird fu"r die Druckaufbereitung + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 292 - RRRReeeeppppoooorrrrtttt + + + verwendet, alle anderen werden "verschluckt". + + Das Symbol fu"r das Vorzeichen kann an drei Stellen angegeben + werden: + + - vor dem ersten '0'-Symbol + Darstellung des Vorzeichens an dieser Position; + + - vor dem ersten '9'-Symbol + Darstellung des Vorzeichens unmittelbar vor der ersten + Ziffer; + + - nach dem letzten '9'-Symbol + Darstellung des Vorzeichens nach der letzten Ziffer + + BBBBeeeeaaaacccchhhhtttteeee:::: Das zuletzt verwendete Vorzeichensymbol wird fu"r + die Aufbereitung verwendet. + + _2._6._1_1._2. AAAAuuuussssggggaaaabbbbeeee aaaallllssss RRRReeeeaaaallll----ZZZZaaaahhhhllll + + Die Darstellung eines Wertes erfolgt als Gleitkommazahl. + + _ _ + | | + | SCALE real | + | BEFORE number | + REAL laenge | POINT number | num daten + | NORM number | + | IGNORE | + | EXP zeichenkette | + ~ ~ + + + Die wahlweise anzugebenden Parameter haben folgende Bedeu- + tung: + + SSSSCCCCAAAALLLLEEEE rrrreeeeaaaallll + + Der Attributwert wird vor der Aufbereitung mit dem + Skalierungsfaktor multipliziert. + + BBBBEEEEFFFFOOOORRRREEEE nnnnuuuummmmbbbbeeeerrrr + + Anzahl der Stellen vor dem Komma + Standard: 0 + + PPPPOOOOIIIINNNNTTTT nnnnuuuummmmbbbbeeeerrrr + + Anzahl der Stellen nach dem Komma + Die letzte Stelle ist gerundet. + Standard: 6 + + NNNNOOOORRRRMMMM nnnnuuuummmmbbbbeeeerrrr + + Die Zahl soll mit einem bestimmten Exponenten dar- + gestellt werden. Beispielsweise wird bei NORM 5 + die Zahl mit dem Exponenten E+05 dargestellt. Der + Parameter BEFORE wird dabei unwirksam. + + IIIIGGGGNNNNOOOORRRREEEE + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 293 - RRRReeeeppppoooorrrrtttt + + + Die Angabe des Exponenten soll unterdru"ckt werden. Der + Parameter BEFORE wird dabei unwirksam. Ist die Darstel- + lung des Wertes ohne Exponenten nicht mo"glich, gelten + die anderen Parameter. + + EEEEXXXXPPPP zzzzeeeeiiiicccchhhheeeennnnkkkkeeeetttttttteeee + + Es wird die Zeichenkette vor dem Exponentenwert + definiert. + Standard: 'E' + + BBBBeeeeiiiissssppppiiiieeeellll + + Es sollen verschiedene Darstellungsmo"glichkeiten der Varia- + blen $1 mit dem Wert 123.45 veranschaulicht werden: + + + 1) real $1 + 0.123450E 03 + + 2) real length 20 scale 2000 before 3 point 2 exp 'EXP' $1 + 246.90 EXP 03 + 3) real length 20 scale 2000 before 3 point 2 + exp 'EXP' ignore $1 + 246900.00 + 4) real length 20 norm -2 $1 + 12345.000000E-02 + 5) real length 15 exp '*10**' point 1 $1 + 0.1*10** 03 + + Die Darstellung nocheinmal zum besseren Vergleich: + + 1) 0.123450E 03 + 2) 246.90 EXP 03 + 3) 246900.00 + 4) 12345.000000E-02 + 5) 0.1*10** 03 + + + _2._6._1_1._3. PPPPsssseeeeuuuuddddooooggggrrrraaaapppphhhhiiiisssscccchhhheeee AAAAuuuussssggggaaaabbbbeeee + + Der Reportgenerator ermo"glicht die einfache Darstellung + von Diagrammen. + + _ _ + |_ _ _ _ | + || | | | | + || FROM | | VAR int| | + GRAPHIC laenge || TO | | real | | num daten + |~ ~ ~ ~ | + | WITH zeichenkette | + ~ ~ + + + Der durch die Grenzen FROM und TO definierte Wertebereich + wird auf den mit 'laenge' angegebenen Darstellungsbereich + abgebildet. Die Abbildung erfolgt mit dem bei WITH angege- + benen Zeichen. Ist FROM < TO erfolgt eine linksbu"ndige und + ist FROM > TO eine rechtsbu"ndige Darstellung der Pseudo- + grafik in der Spalte. + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 294 - RRRReeeeppppoooorrrrtttt + + + + Standards: laenge = 50 + FROM 0 + TO 0 + WITH '*' + + BBBBeeeeiiiissssppppiiiieeeellll + + Es soll das Attribut "menge" grafisch dargestellt werden. + Vor der grafischen Darstellung soll der Wert als Integer- + Zahl ausgegeben werden. + + for one do + integer @3 #menge + \6 + graphic @20 from 0 to 10 with '+' #menge + \n + end one + + + Darstellung: + + 7 ++++++++++++++ + 3 ++++++ + 4 ++++++++ + 8 ++++++++++++++++ + 1 ++ + 0 + 11 ++++++++++++++++++++ + + + _2._6._1_2. AAAAuuuussssggggaaaabbbbeeee vvvvoooonnnn ZZZZeeeeiiiicccchhhheeeennnnkkkkeeeetttttttteeeennnnwwwweeeerrrrtttteeeennnn + + Fu"r die Ausgabe von Zeichenkettenwerten steht die Funktion + CHAR zur Verfu"gung: + + + _ _ + | _ _ | _ _ + | | FROM | | | LAST | + CHAR laenge | | TO | number| | VALUE | number + | | BATCH | | | NEXT | + ~ ~ ~ ~ ~ ~ + + + Ist die La"nge angegeben, wird die Zeichenkette linksbu"ndig + in den bereitgestellten Platz eingetragen. Sollte die + Zeichenkette la"nger sein, wird rechts abgeschnitten. Mit + FROM und TO kann die auszugebende Zeichenkette eingeschra"nkt + werden. Ist keine La"nge angegeben, wird die Zeichenkette in + ihrer Originalla"nge eingetragen. Die Tupelwerte du"rfen nicht + numerischer Wertart sein. + + Die Zeichenketten ko"nnen mit der Funktion BATCH u"ber mehrere + Zeilen verteilt werden. Zu beachten ist, dass eine + La"ngenangabe nicht die La"nge der auszugebenden Zeichenkette + bestimmt, sondern den bereitgestellten Platz in der Liste. + Dieser Unterschied existiert, da die Zeichenketten + u"berwiegend in ganzen Worten ausgegeben werden und dadurch + Platz verloren geht. Mit CHAR 110 BATCH 20 werden zum + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 295 - RRRReeeeppppoooorrrrtttt + + + Beispiel genau 5 Zeilen zu 20 und eine Zeile mit 10 Zeichen + gefu"llt, unabha"ngig davon, wie lang die Zeichenkette ist. + + BBBBeeeeiiiissssppppiiiieeeellll + + char from 3 #text + \n + char from 5 to 12 #text + + Hat #text die Zeichenkette + + 'PLATSCH BATCH', + + erzeugen die Anweisungen die Zeichenketten + + ATSCH BATCH + SCH BATC + + + _2._6._1_3. AAAAuuuussssggggaaaabbbbeeee vvvvoooonnnn WWWWeeeerrrrtttteeeennnn aaaallllssss BBBBiiiinnnnaaaa""""rrrr----,,,, OOOOkkkkttttaaaallll---- + ooooddddeeeerrrr HHHHeeeexxxxaaaaddddeeeezzzziiiimmmmaaaallllzzzzaaaahhhhllll iiiimmmm BBBByyyytttteeee---- ooooddddeeeerrrr WWWWoooorrrrttttffffoooorrrrmmmmaaaatttt + + Der Reportgenerator fu"r ING_DB bietet die Mo"glichkeit, + Werte in einem anderen Zahlensystem darzustellen. Die Werte + werden unabha"ngig von der Wertart als Bitketten interpre- + tiert und in das gewu"nschte Zahlensystem umgewandelt. + + SSSSyyyynnnnttttaaaaxxxx + + + _ _ + | | + | Systemvariable | + _ _ | Systemkonstante | + | BIT | _ _ |_ _ | + | OCT | | BYTE | laenge || LAST | | + | HEX | | WORD | || VALUE | number | + | DEC | ~ ~ || NEXT | | + ~ ~ ~~ ~ ~ + + + + BYTE ist Standard, fu"hrende Nullen werden unterdru"ckt. + + Ist die La"nge angegeben, wird der Wert entweder vollsta"ndig + oder rechts verku"rzt linksbu"ndig in den bereitgestellten + Platz eingetragen. Fehlt die La"ngenangabe, wird der Wert + vollsta"ndig in der tatsa"chlichen La"nge ausgegeben. + + BBBBeeeeiiiissssppppiiiieeeellll + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 296 - RRRReeeeppppoooorrrrtttt + + + + BIT LENGTH 10 VALUE 1 '*' + OCT VALUE 1 '*' + HEX VALUE 1 + NEW LINE + + Wert von VALUE 1: + + a) 71 =i2 + b) 30 =i1 + c) 'ABC' string =c3 + + Darstellung: + + BIT OCT HEX + + a) 0001000111 * 000000 000107 * 0000 0047 + b) 00011110 * 036 * 1E + c) 0100000101 * 101 102 103 * 41 42 43 + + + _2._6._1_4. WWWWeeeerrrrttttzzzzuuuuwwwweeeeiiiissssuuuunnnnggggeeeennnn zzzzuuuu SSSSyyyysssstttteeeemmmmvvvvaaaarrrriiiiaaaabbbblllleeeennnn ---- + aaaarrrriiiitttthhhhmmmmeeeettttiiiisssscccchhhheeee AAAAuuuussssddddrrrruuuu""""cccckkkkeeee + + Fu"r die Berechnung nicht in der Relation enthaltener Werte + steht im Reportgenerator eine umfangreiche Arithmetik zur + Verfu"gung. Dem an C gewo"hnten Nutzer wird zusa"tzlich die + Notation arithmetischer Zuweisungen gema"ss C gestattet. + + SSSSyyyynnnnttttaaaaxxxx + + + SET systemvariable = arithm ausdruck + + + Durch die SET-Anweisung wird einer Systemvariablen das + Ergebnis eines arithmetischen Ausdrucks zugewiesen. Bei + den Variablen COLUMN und LINE ist die Wertzuweisung mit + Ausgabeoperationen verbunden. Im arithmetischen Ausdruck + ko"nnen beliebige numerische Werte mit den Operationen + + + + oder += Addition + - oder -= Subtration + * oder *= Multiplikation + : oder := Division + / oder /= ganzzahlige Division + % oder %= Modulodivision (Divisionsrest) + + + verknu"pft werden. Die Klammerung von Teilausdru"cken und die + Negation von Werten ist mo"glich. Die Syntax eines arith- + metischen Ausdruckes entspricht der allgemein u"blichen Nota- + tion mathematischer Formeln. + + BBBBeeeeiiiissssppppiiiieeeelllleeee + + 1. allgemeiner Ausdruck + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 297 - RRRReeeeppppoooorrrrtttt + + + + SET VAR 30 = ( - VALUE 10 * VAR 3 + 27.12E-7 ) + : ( VAR 7 % 19 / 7.2 ) + + + 2. Es soll die durchschnittliche Planerfu"llung einer + Plankennziffer VALUE 4 mit den Istwerten VALUE 5 bis 7 + ausgegeben werden: + + SET VAR 1 = ( VALUE 5 + VALUE 6 + VALUE 7 ) / 3 + INTEGER SCALE 100 PIC 'DURCHSCHNITT: 009.99 %' VAR 1 + + + 3. Es soll auf die 30. Zeile der Seite positioniert wer- + den: + + SET LINE = 30 + + + Tritt wa"hrend der Bearbeitung eines arithmetischen Ausdrucks + ein Fehler auf, wenn z. B. ein Zeichenkettenwert beteiligt + ist, wird die Berechnung abgebrochen. Der Variablen wird + kein Wert zugewiesen, sie bleibt unvera"ndert. + + _2._6._1_5. BBBBoooooooolllleeeesssscccchhhheeee VVVVaaaarrrriiiiaaaabbbblllleeeennnn uuuunnnndddd AAAAuuuussssddddrrrruuuu""""cccckkkkeeee + + Fu"r die wertabha"ngige Programmabarbeitung stehen + Mo"glichkeiten zur Formulierung Boolescher Ausdru"cke sowie + 101 logische Variable zur Verfu"gung. + + Die Schalter + + SWITCH 0 bis SWITCH 125 + + ko"nnen die zwei Zusta"nde "ein" und "aus" bzw. TTTTRRRRUUUUEEEE und + FFFFAAAALLLLSSSSEEEE annehmen. + + Initialisiert sind die Variablen bei Programmbeginn mit + FALSE. Fu"r ihre A"nderung stehen vier Mo"glichkeiten zur + Auswahl. + + SSSSyyyynnnnttttaaaaxxxx + + + _ _ + | CLEAR | + | COMPLEMENT | SWITCH number + | SET | + ~ ~ + SET SWITCH number = boolean + + + Mit CCCCLLLLEEEEAAAARRRR,,,, CCCCOOOOMMMMPPPPLLLLEEEEMMMMEEEENNNNTTTT und SSSSEEEETTTT kann ein bestimmter Schalter + gelo"scht (FALSE), umgekehrt (TRUE-->FALSE, FALSE-->TRUE) + bzw. gesetzt (TRUE) werden. Die Wertzuweisung erlaubt das + Eintragen des Ergebnisses eines Booleschen Ausdrucks. Dieser + wird durch die Verknu"pfung von Boole-Werten (TRUE/FALSE) + gebildet. Verknu"pfungsoperatoren sind + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 298 - RRRReeeeppppoooorrrrtttt + + + + OR || bzw. | logisches "oder" (Disjunktion) + AND && bzw. & logisches "und" (Konjunktion). + + + Die Negation erfolgt mit einem vorgestellten NNNNOOOOTTTT oder !!!!.... + Eine Klammerung von Teilausdru"cken ist mo"glich. + + Boole-Werte ko"nnen logische Variablen (SWITCH number) mit + den Werten TRUE oder FALSE sowie die Ergebnisse von + Vergleichsoperatoren sein. Als Vergleichsoperanden sind alle + numerischen und Zeichenkettenwerte, arithmetische Ausdru"cke + sowie NULL (Vergleich auf NULL-Wert) zugelassen. + + Die Operanden ko"nnen miteinander verglichen werden durch: + + + < kleiner + > gro"sser + != ungleich + <> ungleich + <= kleiner gleich + >= gro"sser gleich + = gleich. + == gleich + + + Zeichenkettenwerte ko"nnen nicht mit numerischen Werten ver- + glichen werden. Ein NULL-Wert ist grundsa"tzlich kleiner als + ein beliebiger anderer Wert. Zwei NULL-Werte sind gleich. + + Die Abarbeitungsfolge eines Booleschen Ausdrucks wird durch + die Priorita"t der Operatoren bestimmt. Die ho"chste + Priorita"t hat die numerische Negation, die kleinste OR: + + + ^ ! (Negationszeichen) + | * / : % + | + - + Priorita"t < > <> != <= >= = == + | NOT ! + | AND && & + | OR || | + ^ + + + Bei gleicher Priorita"t erfolgt die Bearbeitung von links + nach rechts. + + BBBBeeeeiiiissssppppiiiieeeelllleeee + + SET SWITCH 10 + COMPLEMENT SWITCH 10 + + Mit SET wird die logische Variable 10 TRUE gesetzt und durch + COMPLEMENT umgekehrt, d.h. FALSE + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 299 - RRRReeeeppppoooorrrrtttt + + + + SET SWITCH 5 = VALUE 3 + 5 < VAR 7 AND + (SWITCH 5 OR SWITCH 10) AND + (VALUE 2 <> NULL OR + NOT VALUE 3 + 100 = VAR 8) + + Der logischen Variablen 5 wird das Ergebnis des Booleschen + Ausdrucks zugewiesen. + + Tritt wa"hrend der Bearbeitung eines Booleschen Ausdrucks ein + Fehler auf, wird diese abgebrochen und das Ergebnis FALSE + gesetzt. + + _2._6._1_6. SSSStttteeeeuuuueeeerrrruuuunnnngggg ddddeeeerrrr PPPPrrrrooooggggrrrraaaammmmmmmmaaaabbbbaaaarrrrbbbbeeeeiiiittttuuuunnnngggg + + _2._6._1_6._1. VVVVeeeerrrrzzzzwwwweeeeiiiigggguuuunnnngggg + + Die Verzweigung ermo"glicht die Abarbeitung von Anweisungen + in Abha"ngigkeit von einer Bedingung (Boolescher Ausdruck). + + SSSSyyyynnnnttttaaaaxxxx + + IF boolean THEN laufsteuerung [ELSE laufsteuerung] + ENDIF / ENDI + + Hat der Boolesche Ausdruck den Wert TRUE, wird der THEN- + Zweig abgearbeitet, bei FALSE, wenn angegeben, der ELSE- + Zweig. Abgeschlossen wird die Anweisung durch ENDI. + Anstelle ENDI kann auch END IF stehen. Die Verschachtelung + von IF-Anweisungen ist mo"glich. + + BBBBeeeeiiiissssppppiiiieeeellll + + Es soll das Quartal ermittelt und ausgegeben werden: + + IF MONTH < 6 + THEN IF MONTH < 3 + THEN 'I' + ELSE 'II' + ENDI + ELSE IF MONTH < 9 + THEN 'III' + ELSE 'IV' + ENDI + ENDI + '. QUARTAL' + + + Im Dezember wird zum Beispiel IV. QUARTAL ausgegeben. + + HHHHiiiinnnnwwwweeeeiiiissss:::: Die Werte der Systemvariablen MONTH haben den + Bereich 0...11 ! + + _2._6._1_6._2. ZZZZyyyykkkklllluuuussss + + Fu"r die Programmierung von Zyklen stehen zwei Anweisungen + bereit. + + SSSSyyyynnnnttttaaaaxxxx + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 300 - RRRReeeeppppoooorrrrtttt + + + + + REPEAT number laufsteuerung ENDREPEAT/ENDR + WHILE boolean DO laufsteuerung ENDWHILE/ENDW + + + Bei REPEAT wird der Zyklus in einer vorher festgelegten + Anzahl (number), jedoch mindestens einmal, durchlaufen. Ist + number ein reeller Wert, wird er durch Abrunden zu einem + ganzzahligen umgewandelt. Der WHILE-Zyklus wird ausgefu"hrt, + solange der Boolesche Ausdruck den Wert TRUE liefert. + + BBBBeeeeiiiissssppppiiiieeeellll + + In VALUE 1 bis VALUE 10 stehen Werte zwischen 0 und 100. Die + Werte sollen, wenn sie kleiner als 50 sind, als ro"mische + Zahlen ausgegeben werden: + + + SET VAR 1 = 1 + REPEAT 10 + IF VALUE VAR 1 < 50 + THEN + SET VAR 2 = VALUE VAR 1 + WHILE VAR 2 >= 10 + DO 'X' SET VAR 2 -= 10 + ENDW + IF VAR 2 >= 5 + THEN 'V' SET VAR 2 -= 5 + ENDI + IF VAR 2 > 0 + THEN REPEAT VAR 2 'I' ENDR + ENDI + SPACE 3 + ENDI + SET VAR 1 += 1 + ENDR + + + Sind im Tupel die ersten 10 Werte + 1, 30, 60, 12, 77, 3, 90, 17, 22, 33 + wird in die Liste eingetragen: + I XXX XII III XVII XXII XXXIII + + _2._6._1_6._3. FFFFaaaallllllllaaaauuuusssswwwwaaaahhhhllll + + Die Fallauswahl ist eine Mehrfachverzweigung, die durch + eine Variable gesteuert wird. + + SSSSyyyynnnnttttaaaaxxxx + + CASE VAR number [IN] [DO laufsteuerung] + [OUT laufsteuerung]ENDCASE/ENDC + + + VAR number entha"lt einen ganzzahligen Wert. Ist er 0, werden + die Anweisungen nach dem 1. DO abgearbeitet, ist er 2, die + nach dem 2. DO usw. Ist fu"r den Wert keine DO-Konstruktion + mehr da, oder ist der Wert kleiner als 1, werden die + Anweisungen von OUT abgearbeitet, vorausgesetzt, OUT ist + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 301 - RRRReeeeppppoooorrrrtttt + + + definiert. Ist VAR number reell, wird durch Abrunden ein + ganzzahliger Wert erzeugt. Die CASE-Klausel wird mit ENDC + abgeschlossen. Die Angabe von IN kann entfallen. + + AAAAcccchhhhttttuuuunnnngggg + + Die direkte Verschachtelung von CASE-Klauseln ist nicht + mo"glich! Wird eine CASE-Klausel jedoch in einer Prozedur + vereinbart, ist deren Aufruf innerhalb einer anderen CASE- + Klausel realisierbar. + + BBBBeeeeiiiissssppppiiiieeeellll + + Im Kopf einer Monatsabrechnung soll der Name des Monats + ausgegeben werden: + + 'ABRECHNUNG FUER DEN MONAT ' + SET VAR 1 = MONTH + CASE VAR 1 + DO 'JANUAR' + DO 'FEBRUAR' + DO 'MAERZ' + DO 'APRIL' + DO 'MAI' + DO 'JUNI' + DO 'JULI' + DO 'AUGUST' + DO 'SEPTEMBER' + DO 'OKTOBER' + DO 'NOVEMBER' + DO 'DEZEMBER' + OUT '(DER MONAT MUSS ERST ERFUNDEN WERDEN)' + ENDC + + Im September wird in den Report eingetragen: + ABRECHNUNG FUER DEN MONAT SEPTEMBER + + _2._6._1_6._4. PPPPrrrroooozzzzeeeedddduuuurrrreeeennnn + + Oft verwendete gleichartige Programmteile ko"nnen in + Prozeduren vereinbart werden. + + SSSSyyyynnnnttttaaaaxxxx + + PROC int laufsteuerung RETURN + + + Der Wert fu"r int beginnt mit 1. Es sind maximal 50 Werte + vorgesehen. Als Identifikator der Prozedur wird eine Nummer + int festgelegt. Die Definition der Prozeduren muss im Teil + ddddeeeeffffiiiinnnniiiittttiiiioooonnnneeeennnn,,,, die Notierung der Prozedur selbst im Teil + pppprrrroooozzzzeeeedddduuuurrrreeeennnn unmittelbar hinter AS erfolgen. + + Beim Aufruf einer Prozedur werden alle Anweisungen bis + RETURN abgearbeitet. + + SSSSyyyynnnnttttaaaaxxxx + + CALL [PROC] int + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 302 - RRRReeeeppppoooorrrrtttt + + + Der Parameter PROC kann ohne Bedeutungsverlust weggelassen + werden. int bestimmt die Nummer der gerufenen Prozedur. Es + gilt der Grundsatz, dass eine Prozedur vor dem ersten + Aufruf definiert sein muss. Das ist insbesondere bei der + Definition mehrerer Prozeduren zu beachten. Nicht erlaubt + ist z.B. folgende Konstruktion: + + PROC 1 CALL 5 RETURN + PROC 5 .... RETURN + + BBBBeeeeiiiissssppppiiiieeeellll + + Es soll eine Prozedur fu"r die Potenz X^Y definiert werden + (Y = natu"rliche Zahl). X wird in VAR 1, Y in VAR 2 erwar- + tet, das Ergebnis steht in VAR 0. + + PROC 1 + SET VAR 0 = 1 + REPEAT VAR 2 + SET VAR 0 = VAR 0 * VAR 1 + ENDR + RETURN + + + Die Berechnung von 13^11 wird realisiert mit: + + SET VAR 1 = 13 + SET VAR 2 = 11 + CALL 1 + REAL VAR 0 + + + _2._6._1_6._5. SSSSeeeeiiiitttteeeennnnggggeeeessssttttaaaallllttttuuuunnnngggg + + Eine Seite hat im Reportgenerator fu"r ING_DB fol- + gende Gestalt: + + + COLUMNS + |<----------------->| + ________|___________________|______________ + /|\ | | PAGEBEGIN | | /|\ | + | | L |___________________| L | A | | + | | I | | I | L | | + | | N | Informationsteil | N | L | | + L| | E | | E | | | + I| | B | | E | L | | + N| | E | | N | I | | + E| | G | | D | N | | + S| | I | | | E | | + \|/ | N | | | S | | + ________|___________________| | | | + | | PAGEEND | | | | + | |___________________|___| | | + |________________________________\ /__| + + + Die Gro"sse einer Seite wird durch die Parameter COLUMNS, + LINES und ALL LINES bestimmt. Der Seitenrahmen mit Seiten- + kopf (PAGEBEGIN), Seitenfuss (PAGEEND), linkem Seitenrand + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 303 - RRRReeeeppppoooorrrrtttt + + + (LINEBEGIN) und rechtem Seitenrand (LINEEND) wird, wenn die + Teile vom Nutzer definiert wurden, vom Reportgenerator + automatisch fu"r jede Seite aufgebaut. + + SSSSyyyynnnnttttaaaaxxxx + + _ _ + | LINEBEGIN | + | LINEEND | + ON | PAGEBEGIN | [DO] [laufsteuerung] END/ENDO + | PAGEEND | + ~ ~ + + + Ist die Laufsteuerung nicht angegeben, gilt der Rahmenteil + als nicht definiert, d. h. eine existierende Definition wird + gelo"scht. Sind im Programm mehrere Definitionen fu"r einen + Rahmenteil angegeben, gilt immer die aktuellste. + + In PAGEBEGIN und PAGEEND werden Informationen vereinbart, + die auf jeder Seite erscheinen sollen. Das ko"nnen die + aktuelle Seitennummer, U"berschriften, Fussnoten und + Tupelwerte sein. Aber auch Berechnungen ko"nnen ausgefu"hrt + werden. Soll zum Beispiel die Seitennummerierung in 10er + Schritten erfolgen, muss in PAGEBEGIN die Wertzuweisung SET + PAGE = PAGE + 9 enthalten sein, da bei Seitenwechsel automa- + tisch um 1 erho"ht wird. Mit LINEBEGIN und LINEEND ko"nnen + "Begrenzungen", Zeilennummerierungen u.a. vereinbart werden. + + Der Aufbau eines Rahmenteils wird vorzeitig abgebrochen, + wenn bei PAGEBEGIN und PAGEEND ein unerlaubter Seitenwechsel + veranlasst wird bzw. bei LINEBEGIN und LINEEND ein Zeilen- + vorschub. + + Der Informationsteil nimmt den eigentlichen Inhalt der Seite + auf. Ist eine Zeile la"nger als mit COLUMNS festgelegt, wer- + den u"berstehende Zeichen auf eine neue Zeile u"bertragen. + Ist eine Seite voll, wird automatisch ein Seitenwechsel + ausgelo"st. + + Die La"nge von PAGEBEGIN und PAGEEND ist beliebig und kann + auch von Seite zu Seite unterschiedlich sein. Reicht die + physische Seite nicht aus, wird eine zweite hinzugezogen. + + Auch bei LINEBEGIN und LINEEND ist die La"nge zuna"chst + unerheblich. Allerdings sollte darauf geachtet werden, dass + diese zusammen mit COLUMNS nicht gro"sser als die maximale + Druckbreite wird. Werden die Seitenra"nder bis zum physischen + Blattende gewu"nscht, muss PAGEEND um die entsprechende + Anzahl Leerzeilen erweitert werden. + + Die Variable LINE bezieht sich in PAGEBEGIN und PAGEEND auf + die physische Seite, ebenso COLUMN in LINEBEGIN und LINEEND. + + Ansonsten geben diese Variablen die Position bezu"glich des + Informationsteils an. + + BBBBeeeeiiiissssppppiiiieeeellll + + Die Funktionsweise der Seitendefinition soll im folgenden an + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 304 - RRRReeeeppppoooorrrrtttt + + + einer "Mini"-Seite mit 12 Spalten und 7 Zeilen gezeigt wer- + den. Die physische Seite habe eine La"nge von 12 Zeilen: + report kompl1_r + with + columns 12 + lines 7 + all lines 12 + big + + /* switches */ + define last_page = 1 + + /* domains */ + define d_name = 1 + define d_qual = 2 + define d_pkz = 3 + define d_lohn = 4 + define d_abt = 5 + define d_gruppe = 6 + + define #d_name = char 20 + define #d_qual = char 8 + define #d_pkz = char 12 + define #d_lohn = integer 2 + define #d_abt = integer 2 + define #d_gruppe = integer 2 + + as + + on pagebegin do + '-' 12 + \n + ' Seite: ' + integer @2 page + \n + \2 date + \n + end + + on pageend do + if ! ^last_page then + \6 'b.w.' + \n + end if + '-' 12 + \n + end + + on linebegin do 'I' end + on lineend do 'I' end + + \n2 + \f + + for all do + for one do + if #5 = 26 then + \2 + char #1 batch 10 @20 + \n3 + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 305 - RRRReeeeppppoooorrrrtttt + + + end if + end one + end all + + set ^last_page + \5 'Ende' ; + + Als Tupelfile wird die Datenmenge des Beispiels kkkkoooommmmppppllll____pppp + verwendet. Mit dem Programm wird folgende Liste generiert: + + Erla"uterung: + + I------------I Seitenkopf + I SEITE: 1 I mit Seitennummer + I 20-MAY-88 I und Datum + I I + I I + I DECKBLATT I Listenkopf + I I + I I + I I + I I + I B.W. I Seitenfuss + I------------I + I------------I + I SEITE: 2 I + I 20-MAY-88 I + I SCHMIDT, I automatischer Zeichenketten- + I HERMANN I umbruch (batch) + I I Zeilenvorschub + I I + I NEUMANN, I + I INGE I + I I Seitenvorschub, da Seite 2 + I B.W. I gefu"llt ist + I------------I + I------------I + I SEITE: 3 I + I 20-MAY-88 I + I I + I WARNKE, I + I PETER I + I I + I I + I ENDE I Listenende + I I kein Seitenfuss + I------------I + + + + Bei kurzen Programmen steht der Aufwand zur + Doma"nendefinition in einem ungu"nstigen Verha"ltnis zur + Gesamtbeschreibung. Auch wenn diese Definition im Programm + nicht komplett gebraucht wird, muss sie vollsta"ndig sein + (Identita"t zum Deskription-File). + + _2._6._1_6._6. GGGGrrrruuuuppppppppeeeennnnwwwweeeecccchhhhsssseeeellllpppprrrrooooggggrrrraaaammmmmmmmiiiieeeerrrruuuunnnngggg + + In diesem Abschnitt sollen Hinweise zur Gruppenwechselpro- + grammierung gegeben werden. Diese erfolgt innerhalb der + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 306 - RRRReeeeppppoooorrrrtttt + + + Anweisung + + FOR ONE DO ... ENDONE + + wa"hrend der Bearbeitung eines Tupels. Unterschieden wird in + Gruppenbeginn und -ende. Ein Gruppenbeginn liegt vor, wenn + das Gruppenattribut im aktuellen Tupel verschieden ist von + dem im vorhergehenden Tupel. Das bedeutet natu"rlich, dass + ein zum Gruppenattribut sortiertes Tupelfile vorliegen muss. + In einem Booleschen Ausdruck la"sst sich das durch den Ver- + gleich VALUE x <> LAST x fu"r das Tupelattribut x abtesten. + Verku"rzend kann dafu"r auch geschrieben werden + + GROUPBEGIN x. + + + Diese Anweisung liefert einen Boole-Wert. Liegt ein Gruppen- + beginn vor, ist er TRUE. + + Das Gruppenende la"sst sich durch einen Vergleich mit dem + na"chsten Tupel feststellen. A"ndert sich das Gruppenattri- + but, bedeutet das das Ende der Gruppe. Abtesten la"sst sich + das mit der Konstruktion VALUE x <> NEXT x oder verku"rzend + + GROUPEND x. + + + Liegt das Gruppenende fu"r das Gruppenattribut x vor, liefert + die Anweisung den Wert TRUE. + + Im einfu"hrenden Beispiel ((((ppppeeeerrrrssss____pppp)))) ist ein sehr einfacher + Fall der Gruppenwechselprogrammierung angefu"hrt. Der Grup- + penname pppp____aaaabbbbtttt wird jeweils nur einmal am Beginn einer Gruppe + ausgegeben. Realisiert wurde das durch die Anweisungen + + IF GROUPBEGIN p_abt THEN + INTEGER @4 #p_abt + END IF + + + Ein komplizierteres Beispiel ist im Programm kkkkoooommmmppppllll____pppp + angefu"hrt. Um eventuell mehr Klarheit zu schaffen, soll nun + noch ein relativ u"bersichtliches Beispiel folgen. Fu"r die + Relation ppppeeeerrrrsssskkkkoooommmmpppp ist fu"r jede Abteilung und jede Gruppe + sowie fu"r alle Mitarbeiter die Summe der Lo"hne zu berechnen + und auszugeben: + report kompl2_r + with + columns 35 + lines 20 + all lines 24 + big + + /* variables */ + define grp_lohn = 1 + define abt_lohn = 2 + define all_lohn = 3 + + /* domains */ + define d_name = 1 + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 307 - RRRReeeeppppoooorrrrtttt + + + define d_qual = 2 + define d_pkz = 3 + define d_lohn = 4 + define d_abt = 5 + define d_gruppe = 6 + + define #d_name = char 20 + define #d_qual = char 8 + define #d_pkz = char 12 + define #d_lohn = integer 2 + define #d_abt = integer 2 + define #d_gruppe = integer 2 + + as + + on pagebegin do + '-' 35 + \n + ' Seite: ' + integer @2 page + \\15 + date + \n + '-' 35 + \n + end + + on pageend do + '-' 35 + \n + end + + on linebegin do 'I' end + on lineend do 'I' end + + \n2 + \f + set $1 = 0 + set $2 = 0 + set $3 = 0 + + for all do + for one do + set $1 += #4 + set $2 += #4 + set $3 += #4 + if groupend d_gruppe then + \5 'Gruppe' + \15 + integer @4 #d_gruppe + \20 integer @8 $1 ',- M' + \n + set $1 = 0 + end if + if groupend d_abt then + \5 'Abteilung' + \15 + integer @4 #d_abt + \20 integer @8 $2 ',- M ' + \n2 + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 308 - RRRReeeeppppoooorrrrtttt + + + set $2 = 0 + '-' 35 \n + end if + end one + end all + + \5 'Gesamt' + \20 integer @8 $3 ',- M' + \n + \5 'Listenende' ; + + Bei Abarbeitung wird folgende Liste generiert: + + I-----------------------------------I + I SEITE: 1 20-MAY-88 I + I-----------------------------------I + I I + I I + I DECKBLATT I + I LOHN NACH ABTEILUNGEN UND GRUPPEN I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I-----------------------------------I + + + + + + + + + + + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 309 - RRRReeeeppppoooorrrrtttt + + + + I-----------------------------------I + I SEITE: 2 20-MAY-88 I + I-----------------------------------I + I GRUPPE 1 2906,- M I + I ABTEILUNG 0 2906,- M I + I I + I-----------------------------------I + I GRUPPE 12 700,- M I + I ABTEILUNG 10 700,- M I + I I + I-----------------------------------I + I GRUPPE 23 877,- M I + I ABTEILUNG 13 877,- M I + I I + I-----------------------------------I + I GRUPPE 10 1120,- M I + I GRUPPE 23 1986,- M I + I ABTEILUNG 26 3106,- M I + I I + I-----------------------------------I + I GRUPPE 10 1337,- M I + I ABTEILUNG 32 1337,- M I + I I + I-----------------------------------I + + + I-----------------------------------I + I SEITE: 3 20-MAY-88 I + I-----------------------------------I + I-----------------------------------I + I GRUPPE 2 1337,- M I + I GRUPPE 11 600,- M I + I ABTEILUNG 33 1937,- M I + I I + I-----------------------------------I + I GRUPPE 2 1116,- M I + I GRUPPE 3 1362,- M I + I ABTEILUNG 55 2478,- M I + I I + I-----------------------------------I + I GRUPPE 1 3250,- M I + I GRUPPE 3 1567,- M I + I ABTEILUNG 129 4817,- M I + I I + I-----------------------------------I + I GRUPPE 4 900,- M I + I GRUPPE 5 2790,- M I + I GRUPPE 6 4115,- M I + I GRUPPE 7 2200,- M I + I-----------------------------------I + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 310 - RRRReeeeppppoooorrrrtttt + + + + I-----------------------------------I + I SEITE: 4 20-MAY-88 I + I-----------------------------------I + I ABTEILUNG 199 10005,- M I + I I + I-----------------------------------I + I-----------------------------------I + I GESAMT 28163,- M I + I===================================I + I I + I I + I LISTENENDE I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I I + I-----------------------------------I + + + Gruppen ko"nnen auf verschiedenen Ebenen gebildet werden. Im + Beispiel-Tupelfile kann nach der Abteilung gruppiert werden + und innerhalb dieser nach den Gruppen. Die Liste wurde so + definiert, dass eine seitenweise Ausgabe auf dem Bildschirm + erfolgt (HOLD-MODUS). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + diff --git a/WEGA/contrib/ingres/dbs/ing_doc/teil2/doc2_af b/WEGA/contrib/ingres/dbs/ing_doc/teil2/doc2_af new file mode 100644 index 0000000..88d9086 --- /dev/null +++ b/WEGA/contrib/ingres/dbs/ing_doc/teil2/doc2_af @@ -0,0 +1,648 @@ + + + + Anwendung - 311 - RRRReeeeppppoooorrrrtttt + + + _2._6._1_7. SSSScccchhhhlllluuuu""""sssssssseeeellllwwwwoooorrrrtttteeee + + + all end linebegin repeat + and enda lineend report + as endc lines return + batch endi m_day scale + batchline endo minut second + before endr mod set + big endw month space + bit exp new switch + byte false next terminal + call for norm then + case from not time + char graphic null to + clear groupbegin oct true + col groupend on tuple + column hex one value + columns hour or var + complement if out w_day + date ignore page while + day in pagebegin with + dec integer pageend word + default is_dst pic y_day + define last point year + do length proc + else line real + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 312 - ZZZZIIIIPPPP + + + _2._7. EEEEiiiinnnnggggaaaabbbbeeeeggggeeeennnneeeerrrraaaattttoooorrrr ZZZZIIIIPPPP + ---- VVVVeeeerrrrssss.... 2222....1111 **** + + + + + + + + + + + + + _2._7._1. EEEEiiiinnnnlllleeeeiiiittttuuuunnnngggg + + Der vorliegende Eingabegenerator ist den Bedingungen von + UNIX -Versionen angepasst, fu"r die eine tttteeeerrrrmmmmccccaaaapppp und das + Softwarepaket ccccuuuurrrrsssseeeessss verfu"gbar sind. Da ZIP als Hilfe fu"r + die Eingabe und Anzeige von Daten in der Umgebung von AMX- + und EQUEL-Programmen entworfen wurde, soll nachfolgend die + Anwendung auch an solchen Beispielen gezeigt werden. + + Die Erstellung einer ZIP-Prozedur erfolgt in drei Schritten: + + 1. Mit dem Editor wird eine Maske entworfen, die deckungs- + gleich spa"ter auf dem Bildschirm abzubilden ist. Varia- + blenfelder werden durch # eingeleitet, die Anzahl der + nachfolgenden Zeichen bis zum Leerzeichen bzw. Newline + (auch EOF) oder einem beliebigen Begrenzungszeichen + legt die Stelligkeit fest (einschliesslich #). Bei + Gleitkommazahlen bestimmt der Punkt die Konver- + tierungsvorschrift. + + 2. Die Textmaske (Filename: vorgeschlagenes Postfix _m) + wird einschliesslich mo"glicher steuernder Flags als + Argument fu"r das Kommando zzzziiiipppp angegeben und ein C- + Quellfile generiert. + + 3. Die Verbindung zwischen Maske und Variablen ergibt sich + aus dem Dialog. Die Flags -hp ziehen zusa"tzliche Fragen + fu"r Hilfen bzw. Pru"fungen nach sich. Der C-Compiler + wird automatisch gerufen, bei Flag -l erfolgt die + Einordnung in eine Arbeitsbibliothek. + + Bei Verwendung des Flag -z wird ein Zeilenoffset ausgegeben. + Er berechnet sich aus der Anzahl der Newlines + EOF im Aus- + gangsfile. Mit diesem Offset soll der Entwurf des Gesamt- + bildes auf dem Schirm kontrolliert werden. + + Bevor eine ZIP-Prozedur im Programm genutzt werden kann, ist + die Initialisierungsprozedur iiiinnnniiiittttzzzziiiipppp(((()))) zu rufen - sie ini- + tialisiert auch die Verwendbarkeit der ccccuuuurrrrsssseeeessss -Makros bzw. + Prozeduren. Die u"blichen Ausgaben zu stdout (printf, write, + putchar usw.) du"rfen innerhalb des Gu"ltigkeitsbereiches des + sogenannten "Standard-Screen" (stdscr) nicht verwendet wer- + den, weil dann Konsistenzprobleme auftreten. Dafu"r stehen + die curses-Makros (addstr(), addch()) zur Verfu"gung. + AAAAnnnnmmmmeeeerrrrkkkkuuuunnnngggg:::: Zum Binden des gesamten Programmes (AMX, EQC + u.a.) sind die Bibliotheken libcurses.a und libzip.a einzu- + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 313 - ZZZZIIIIPPPP + + + ziehen. + + Die direkte Einordnung des Generators in das Datenbanksystem + unter Nutzung der System-Relation "attribute" ist vorla"ufig + nicht geplant. Die Praxis zeigt, dass die Eingabe und + Korrektur aller Doma"nen in einem Menue die Ausnahme ist - + als weiteres Problem steht dann, in welcher Reihenfolge die + Fu"hrungstexte den Spalten zugeordnet werden sollten. Hierzu + wa"re wieder ein Dialog oder eine Zuordnung in der Phase des + Editierens der Maske notwendig. Es ist in der Regel so, + dass erst in Abha"ngigkeit vom Wert des Schlu"ssels entweder + vom Programm oder vom Bedienenden entschieden wird, wie sich + der weitere Ablauf gestaltet ("append", "replace" oder + "delete") bzw. die Doma"nen anderer Relationen einzubeziehen + sind. + + _2._7._2. RRRReeeeaaaalllliiiissssiiiieeeerrrruuuunnnngggg + + ZIP wird durch "make all" im Directory "../../src/zip" + installiert. Das Kommando zip wird in "../../bin" eingeord- + net. Ruft man zip ohne Parameter, wird eine Kurzinformation + zur Anwendung gegeben (in "../../man/zip"). Im Directory + "../src/zip" ist ein Directory "tut" enthalten, an dem man + sich analog dieser Dokumentation orientieren kann. + + Die verwendete Relation "anschrift" hat folgende Struktur: + + + Relation: anschrift + --------- + Besitzer: ing_db + Tupellaenge: 199 + Verfallsdatum: Wed Mar 30 15:21:36 1988 + Tupelanzahl: 99 + Speicherstruktur: ISAM + Relationentyp: Nutzerrelation + + + + Domaenname Typ Laenge Schluessel + ------------------------------------------- + bn i 4 1 + ans1 c 40 + ans2 c 40 + ans3 c 30 + ort c 30 + plz c 5 + kubez c 48 + bezirk i 2 + ------------------------------------------- + + + Zur Veranschaulichung der Verfahrensweise folgendes AMX- + Programm: + ------------------------------------------------------------- + + ## shared hardsoft + + /* Eingabe und Korrektur von Anschriften */ + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 314 - ZZZZIIIIPPPP + + + ## long BN; + ## char ANS1[40]; /* 1.Zeile Anschrift */ + ## char ANS2[40]; /* 2.Zeile Anschrift */ + ## char ANS3[30]; /* 3.Zeile Anschrift, Strasse/Psf. */ + ## char ORT[30]; /* Ort */ + ## char PLZ[5]; /* Postleitzahl */ + ## char KUBEZ[48]; /* Kurzbezeichnung Anschrift */ + ## int BEZIRK; /* individueller Bezirksschluessel */ + + amx() + { + int flag; + int clr; + int zl; + + initzip(); /*Initialisierung von curses und zip*/ + + ## open anschrift + + do + { + BN = 0; + ANS1[0] = ANS2[0] = ANS3[0] = ORT[0] = '\0'; + PLZ[0] = '\0'; + KUBEZ[0] = '\0'; + clr = 0; + if (!ansbn(clr++, 0)) break; /*Schirm wird gloescht,*/ + if (!BN) break; /*dr anschliessend erhoeht*/ + flag = 0; + ## scan anschrift $bn=BN (ANS1=$ans1,ANS2=$ans2,ANS3=$ans3, + ## ORT=$ort,PLZ=$plz,KUBEZ=$kubez,BEZIRK=$bezirk) + ## { + ++flag; + if (!ansein(clr, 1)) break; /*kein Schirm loeschen,*/ + /*alle Variablen erst anzeigen*/ + ## replace ($bn=BN,$ans1=ANS1,$ans2=ANS2,$ans3=ANS3, + ## $ort=ORT,$plz=PLZ,$kubez=KUBEZ,$bezirk=BEZIRK) + ## } + if (!flag) + { + if (!ansein(clr, 1)) continue; + ## append anschrift ($bn=BN,$ans1=ANS1,$ans2=ANS2, + ## $ans3=ANS3,$ort=ORT,$plz=PLZ,$kubez=KUBEZ,$bezirk=BEZIRK) + } + } + while (BN); + + ## commit + ## close anschrift + } + ------------------------------------------------------------- + + Als Eingabe- bzw. Korrekturprozeduren kommen ansbn() und + ansein() vor. Mit der Trennung in zwei Masken bzw. + Prozeduren wird vermieden, dass ansein() bei BN = 0 noch + Werte abfordert und das gleiche Programm zum Anfu"gen neuer + Tupel bzw. zum A"ndern vorhandener Verwendung findet. Im + ersten Schritt werden die Masken aaaannnnssssbbbbnnnn____mmmm und aaaannnnsssseeeeiiiinnnn____mmmm mit + dem Editor aufgestellt, dabei ist zu beachten, dass in den + Zeilen, bei denen mit Fu"hrungstexten begonnen wird, ganz + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 315 - ZZZZIIIIPPPP + + + links kein Leerzeichen steht - fu"hrende Leerzeichen werden + nicht ausgegeben: + + MMMMaaaasssskkkkeeee aaaannnnssssbbbbnnnn____mmmm:::: + + Erfassg./Korr. von Anschriften ==> Abbruch: Betriebsnummer = 0 + + Betriebsnummer(8-St.): #9999999< + + + + MMMMaaaasssskkkkeeee aaaannnnsssseeeeiiiinnnn____mmmm:::: + + Anschrift-Betriebsbezeichnung1: #aaaaaaaaaaaaaaaaaaaaaaaaa..a< + ..........Betriebsbezeichnung2: #aaaaaaaaaaaaaaaaaaaaaaaaa..a< + ..........Strasse/Nr. : #aaaaaaaaaaaaaaaaaaaaaaaaaaaa< + ..........Ort : #aaaaaaaaaaaaaaaaaaaaaaaaaaaa< + ..........Postleitzahl : #aaa< + Kurzbezeichnung: #aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa< + Bezirk : #9< + + + In den ersten beiden Zeilen wurden, um eine bessere Darstel- + lung zu erreichen, einige a ausgeblendet (entspricht ..). + + AAAAbbbbllllaaaauuuuffff:::: + + Der Eingabe-Generator wird mit + zzzziiiipppp -pl LIBTUT ansbn + gerufen. + Darstellung des Dialogs: + + ------------------------------------------------------------- + + + +--------------------------------+ + | EINGABE-GENERATOR >>> ZIP <<< | + | Version 2.1 (curses) 01.02.89 | + | EVK Olbernhau | + +--------------------------------+ + + Der Abfragezyklus bezieht sich jeweils auf eine Variable! + Zur Orientierung werden die Texte der Maske mit ausgegeben. + + Erfassg./Korr. von Anschriften ==> Abbruch: Betriebsnummer = 0 + + Betriebsnummer(8-St.): + >>>Datentyp (i/l/c/f/d) > l + + >>>vereinbarter Name (Feld mit []) > BN + + >>>mit Korrekturmoeglichkeit?(j/n) > j + + >>>Name Pruefprozedur mit () u.Arg.> przk() + + >>>Pruef-Art:Zei.=z/Wort=w > w + + >>>Hilfe einordnen? (j/n) > j + + >>>Hilfe-Art: Text=t / Prozedur=p > t + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 316 - ZZZZIIIIPPPP + + + >>>Name File f. Hilfe-Text m. (z,s) > bnhlp(3,15) + 9999999< + + + Okay? >j + + ------------------------------------------------------------- + + Zur Orientierung im Dialog gibt ZIP alle Fu"hrungstexte + entsprechend der Textmaske mit aus. + + Parallel zum Dialog wird das File ansbn_i angelegt: + + -pl LIBTUT ansbn + long BN j przk() w bnhlp(3,15) t + + + Die Pru"fung der Statistik-Betriebsnummer erledigt die + Prozedur przk(): + + ------------------------------------------------------------- + + /* Pruefziffernkontrolle Modul 11 (8-stellig) */ + + przk(pn) long *pn; + { + long nr; + int bew[8]; + int erg, sg, i, divr, anr, pz, p; + + nr = *pn; + bew[0] = 0; + bew[1] = 4; + bew[2] = 8; + bew[3] = 5; + bew[4] = 10; + bew[5] = 9; + bew[6] = 7; + bew[7] = 3; + + p = nr % 10; + sg = 0; + + for (i = 0; i < 8; i++ ) + { + anr = nr % 10; + erg = anr * bew[i]; + sg = sg + erg; + nr = nr / 10; + } + divr = sg % 11; + switch(divr) + { + case 0 : pz = 5; + break; + case 2 : pz = 4; + break; + case 3 : pz = 9; + break; + case 4 : pz = 3; + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 317 - ZZZZIIIIPPPP + + + break; + case 5 : pz = 8; + break; + case 6 : pz = 2; + break; + case 7 : pz = 7; + break; + case 8 : pz = 1; + break; + case 9 : pz = 6; + break; + default: pz = 0; + + } + if (p == pz) return(1); + else return(0); + } + ------------------------------------------------------------- + + Der Ru"ckkehrcode dieser Prozedur, die ebenfalls in LIBTUT + steht, wird ausgewertet (1 ist TRUE, 0 ist FALSE). Der + Return-Code 0 veranlasst nach einem Hupton zur erneuten + Eingabe (Kursor auf Feldanfang), die Eingabe von + Fragezeichen (?) fu"hrt zur Ausgabe der Hilfe "pruefzif- + ferngesichert" - der Text dazu steht im File bnhlp, das bei + der Generierung eingezogen wird. Die Prozedur ansein() wird + mit + zip -a 3 -hl LIBTUT ansein + generiert. Der Dialog la"uft wie folgt ab: + + ------------------------------------------------------------- + + +--------------------------------+ + | EINGABE-GENERATOR >>> ZIP <<< | + | Version 2.1 (curses) 01.02.89 | + | EVK Olbernhau | + +--------------------------------+ + + Der Abfragezyklus bezieht sich jeweils auf eine Variable! + Zur Orientierung werden die Texte der Maske mit ausgegeben. + + Anschrift-Betriebsbezeichnung1: + >>>Datentyp (i/l/c/f/d) > c + + >>>vereinbarter Name (Feld mit []) > ANS1[40] + + >>>mit Korrekturmoeglichkeit?(j/n) > j + + >>>Hilfe einordnen? (j/n) > n + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa< + >>>Datentyp (i/l/c/f/d) > c + + >>>vereinbarter Name (Feld mit []) > ANS2[40] + + >>>mit Korrekturmoeglichkeit?(j/n) > j + + >>>Hilfe einordnen? (j/n) > n + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa< + >>>Datentyp (i/l/c/f/d) > c + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 318 - ZZZZIIIIPPPP + + + >>>vereinbarter Name (Feld mit []) > ANS3[30] + + >>>mit Korrekturmoeglichkeit?(j/n) > j + + >>>Hilfe einordnen? (j/n) > n + aaaaaaaaaaaaaaaaaaaaaaaaaaaa< + >>>Datentyp (i/l/c/f/d) > c + + >>>vereinbarter Name (Feld mit []) > ORT[30] + + >>>mit Korrekturmoeglichkeit?(j/n) > j + + >>>Hilfe einordnen? (j/n) > n + aaaaaaaaaaaaaaaaaaaaaaaaaaaa< + >>>Datentyp (i/l/c/f/d) > c + + >>>vereinbarter Name (Feld mit []) > PLZ[5] + + >>>mit Korrekturmoeglichkeit?(j/n) > j + + >>>Hilfe einordnen? (j/n) > n + aaa< + Kurzbezeichnung: + >>>Datentyp (i/l/c/f/d) > c + + >>>vereinbarter Name (Feld mit []) > KUBEZ[48] + + >>>mit Korrekturmoeglichkeit?(j/n) > j + + >>>Hilfe einordnen? (j/n) > n + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa< + + >>>Datentyp (i/l/c/f/d) > i + + >>>vereinbarter Name (Feld mit []) > BEZIRK + + >>>mit Korrekturmoeglichkeit?(j/n) > j + + >>>Hilfe einordnen? (j/n) > j + + >>>Hilfe-Art: Text=t / Prozedur=p > t + + >>>Name File f. Hilfe-Text m.(z,s) > bezhlp(15,3) + 9< + + Okay? >>j + ------------------------------------------------------------- + + Die nach > stehenden Eingaben sind jeweils mit (Car- + riage Return) abzuschliessen. + + Folgendes i-File entsteht: + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + Anwendung - 319 - ZZZZIIIIPPPP + + + + -a 3 -hl LIBTUT ansein + char ANS1[40] j n n + char ANS2[40] j n n + char ANS3[30] j n n + char ORT[30] j n n + char PLZ[5] j n n + char KUBEZ[48] j n n + int BEZIRK j n bezhlp(15,3) t + + + Es wa"re denkbar, die PLZ mit "isdigit()" zu pru"fen, in + Abweichung zu oben entstu"nde das i-File: + + -a 3 -phl LIBTUT ansein + char ANS1[40] j n n + char ANS2[40] j n n + char ANS3[30] j n n + char ORT[30] j n n + char PLZ[5] j isdigit() z + char KUBEZ[48] j n n + int BEZIRK j n bezhlp(15,3) t + + + Beachten sie, dass \t als Trennzeichen steht. Bei + A"nderungen im *_i-File du"rfen die Trennzeichen nicht ver- + sehentlich gelo"scht werden! + + Es wird bei der Erzeugung der Ein-/Ausgabe-Prozedur davon + ausgegangen, dass die C-Variablen an Spalten bestimmter + Relationen u"bergeben bzw. von diesen u"bernommen werden. + Deshalb sind die C-Variablen grundsa"tzlich global dekla- + riert, entsprechend erwartet die erzeugte Prozedur eine glo- + bale Deklaration zur Wert-U"bergabe/-U"bernahme. Fu"r alle zu + realisierenden Konvertierungen werden die Prozeduren (im + Sinne von Parameter-Prozeduren) aus /usr/lib/libzip.a + verwendet. Die manuelle Ersetzung der Funktionsprozeduren + aus der Standard-Bibliothek von C (libc.a) fu"hrt zu Fehlern. + + Die Reihenfolge der Objekte in der Arbeits-Bibliothek (hier + LIBTUT) spielt eine Rolle, sofern Pru"fprozeduren verwendet + werden (nach der ZIP-Prozedur !). Die Arbeits-Bibliothek + muss im Bindekommando vor /usr/lib/libzip.a stehen. + + Pruefprozeduren werden in Anlehnung an die Funktionen aus + "ctype" (isdigit(), isascii() usw.) so gestaltet, dass der + Rueckkehrcode 1 fuer TRUE und 0 fu"r FALSE liefert. Das gilt + sowohl fu"er Prozeduren die zeichenweise (z) als auch fu"r + solche, die wortweise (w) pru"fen. Das header-File + wird fu"r ZIP-Prozeduren standardma"ssig eingezogen. + + Als kleine zusa"tzliche Hilfe von ZIP steht eine Menue- + Prozedur mmmmeeeennnnzzzziiiipppp(((()))) zur Verfu"gung, die ein im main() verein- + bartes Zeichenkettenfeld auf wa"hlbaren Positionen invers + ausgibt und die angeklickte Zeile (1..n) als Ru"ckkehrwert + liefert (s. Teil III, Beispiel "Terminkontrolle"). + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + diff --git a/WEGA/contrib/ingres/dbs/ing_doc/teil2/inhalt2 b/WEGA/contrib/ingres/dbs/ing_doc/teil2/inhalt2 new file mode 100644 index 0000000..2f58e7c --- /dev/null +++ b/WEGA/contrib/ingres/dbs/ing_doc/teil2/inhalt2 @@ -0,0 +1,288 @@ + + + + + + + IIIInnnnhhhhaaaallllttttssssvvvveeeerrrrzzzzeeeeiiiicccchhhhnnnniiiissss TTTTeeeeiiiillll2222 + + 1. ......................................................... 1 + + 2. Anwenderdokumentation + ING_DB 6.3/3 - Teil II .................... 162 + + 2.1. Anwendung der QUEL * .................................. 163 + + 2.2. Arbeit mit Datenbanken * .............................. 203 + + 2.2.1. Vorbemerkung * ...................................... 203 + + 2.2.2. Erzeugung neuer Relationen mit QUEL ................. 204 + + 2.2.3. Das Kopieren von Daten aus und in eine + Datenbank ...................................... 206 + + 2.2.3.2. Typische Fehler ................................... 210 + + 2.2.3.3. Spezielle Mo"glichkeiten ........................... 211 + + 2.2.3.3.1. Physische Kopie (bulk copy) ..................... 211 + + 2.2.3.3.2. Pseudodoma"nen (Dummy Domains) ................... 211 + + 2.2.3.3.3. Abschneiden (Truncation) ........................ 212 + + 2.2.3.3.4. Spezielle Begrenzer (Specifing Delimitors) ...... 213 + + 2.2.3.3.5. Aufhebung der Begrenzer (Quoting) ............... 213 + + 2.2.4. Speicherstrukturen fu"r Relationen ................... 213 + + 2.2.4.2. Heap .............................................. 214 + + 2.2.4.3. Hash .............................................. 214 + + 2.2.4.4. Isam .............................................. 214 + + 2.2.4.5. Spezifizierung der Speicherstruktur ............... 215 + + 2.2.4.6. Haupt-(primary) und + U"berlauf-(overflow) Seiten .................... 215 + + 2.2.4.7. Spezifizierung des Freiraumes + auf einer Seite (free space) ................. 215 + + 2.2.4.8. Verdichtung (compression) ......................... 216 + + 2.2.4.9. Zwei Varianten zu einem Problem ................... 217 + + 2.2.4.10. Vergleich von heap, hash und isam ................ 220 + + 2.2.4.11. U"berlauf-Seiten .................................. 220 + + 2.2.4.12. Eindeutige Schlu"ssel ............................. 221 + + 2.2.4.13. Systemkataloge ................................... 221 + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + + + + 2.2.5. Sekunda"rindizes ..................................... 222 + + 2.2.6. Wiederherstellung (Recovery) und + Aktualisierung (Update) ....................... 224 + + 2.2.6.2. Deferred Update und Batch Update .................. 224 + + 2.2.6.2.2. Beseitigung der Auswirkung von Systemfehlern .... 224 + + 2.2.6.3. Die Verhinderung endloser Queries ................. 225 + + 2.2.6.3.1. Beschleunigung der A"nderungszeiten + von Sekunda"rindizes .......................... 225 + + 2.2.6.3.2. Abschalten des deferred update .................. 225 + + 2.2.6.4. Restore ........................................... 226 + + 2.2.6.5. Purge ............................................. 227 + + 2.3. Zugriffsmethoden und ** + Datenlokalisierung .......................... 229 + + 2.3.1. Einleitung .......................................... 229 + + 2.3.2. Grundkonzepte von ING_DB ............................ 229 + + 2.3.2.2. Schlu"sselbegriff von ING_DB ....................... 230 + + 2.3.2.3. Seitenketten ...................................... 231 + + 2.3.3. Zugriffstechniken von ING_DB ........................ 232 + + 2.3.3.2. Heapsort .......................................... 232 + + 2.3.3.3. Hash .............................................. 233 + + 2.3.3.4. Isam .............................................. 234 + + 2.3.4. Die Gestaltung des Datenbankfilesystems + fu"r ING_DB ......................................... 236 + + 2.3.4.2. Bewertung des Relationennamens .................... 237 + + 2.4. Monitor ** ............................................ 238 + + 2.4.1. Einfu"hrung .......................................... 238 + + 2.4.2. Modifikationen durch Optionen ....................... 238 + + 2.4.3. Startvorgang und Arbeitszyklus ...................... 238 + + 2.4.4. Arbeit mit dem Monitor-Puffer ....................... 240 + + 2.4.5. Synchrone Beendigung und + asynchrone Unterbrechung .................... 241 + + 2.4.6. Struktur der Monitor-Kommandos ...................... 242 + + 2.4.7. Beschreibung der Monitor-Kommandos .................. 243 + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + - 2 - IIIINNNNHHHHAAAALLLLTTTT + + + 2.4.7.1. Append ............................................ 243 + + 2.4.7.2. Branch ............................................ 243 + + 2.4.7.3. Chdir ............................................. 245 + + 2.4.7.4. Editor ............................................ 246 + + 2.4.7.5. Go ................................................ 247 + + 2.4.7.6. Help .............................................. 248 + + 2.4.7.7. Include und Read .................................. 248 + + 2.4.7.8. Mark .............................................. 249 + + 2.4.7.9. List .............................................. 250 + + 2.4.7.10. Monitor .......................................... 250 + + 2.4.7.11. Print ............................................ 250 + + 2.4.7.12. Quit ............................................. 251 + + 2.4.7.13. Reset ............................................ 251 + + 2.4.7.14. Shell ............................................ 251 + + 2.4.7.15. Time und Date .................................... 252 + + 2.4.7.16. Eval ............................................. 252 + + 2.4.7.17. Write ............................................ 253 + + 2.5. AMX ** ................................................ 254 + + 2.5.1. Einleitung .......................................... 254 + + 2.5.2. Entwurf ............................................. 254 + + 2.5.3. Umgebung ............................................ 257 + + 2.5.4. Compilation ......................................... 259 + + 2.5.5. Begriffe ............................................ 259 + + 2.5.6. Syntaktische Regeln ................................. 261 + + 2.5.7. Grammatik ........................................... 262 + + 2.5.8. Sprachbeschreibung .................................. 263 + + 2.5.9. Selektion ........................................... 266 + + 2.5.10. Projektion ......................................... 266 + + 2.5.11. Aktion ............................................. 266 + + 2.6. Report-Generator * .................................... 269 + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + + + + + + - 3 - IIIINNNNHHHHAAAALLLLTTTT + + + 2.6.1. Vorbemerkung ........................................ 269 + + 2.6.2. Arbeitsschritte ..................................... 269 + + 2.6.3. Typ ,La"nge ,Offset .................................. 270 + + 2.6.4. Aufbau der Listendefinition ......................... 273 + + 2.6.5. Vorschub und Positionierkommandos ................... 276 + + 2.6.6. Ausgabe konstanter Zeichenketten .................... 277 + + 2.6.7. Eingabe von Zeichenketten u"ber Terminal ............. 278 + + 2.6.8. Bereitstellung der Tupelwerte ....................... 279 + + 2.6.9. Systemvariable ...................................... 288 + + 2.6.10. Systemkonstante, Datum, Uhrzeit .................... 289 + + 2.6.11. Ausgabe von numerischen Werten ..................... 290 + + 2.6.11.1. Ausgabe als Integer-Zahl ......................... 290 + + 2.6.11.2. Ausgabe als Real-Zahl ............................ 292 + + 2.6.11.3. Pseudographische Ausgabe ......................... 293 + + 2.6.12. Ausgabe von Zeichenkettenwerten .................... 294 + + 2.6.13. Ausgabe von Werten als Bina"r-, Oktal- + oder Hexadezimalzahl im Byte- oder Wortformat . 295 + + 2.6.14. Wertzuweisungen zu Systemvariablen - + arithmetische Ausdru"cke ....................... 296 + + 2.6.15. Boolesche Variablen und Ausdru"cke .................. 297 + + 2.6.16. Steuerung der Programmabarbeitung .................. 299 + + 2.6.16.2. Zyklus ........................................... 299 + + 2.6.16.3. Fallauswahl ...................................... 300 + + 2.6.16.4. Prozeduren ....................................... 301 + + 2.6.16.5. Seitengestaltung ................................. 302 + + 2.6.16.6. Gruppenwechselprogrammierung ..................... 305 + + 2.6.17. Schlu"sselworte ..................................... 311 + + 2.7. Eingabegenerator ZIP + - Vers. 2.1 * ................................. 312 + + 2.7.1. Einleitung .......................................... 312 + + 2.7.2. Realisierung ........................................ 313 + + + + + + ING_DB 6.3/3 Juni 16, 1989 UUUUNNNNIIIIXXXX + +