P8000/WEGA/contrib/ingres/dbs/src/redabas/CL.nr

576 lines
15 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

.th CL \*(RR 3.10.89 4
.sh UEBERSICHT
Die Abbildung von \*(RR Da\%ten\%banken
auf Relationen in \*(II Da\%ten\%banken
und umgekehrt wird formal durch
die Da\%ten\%bank\%ver\%bindungssprache
CL (Connection Language) definiert.
Die CL Syntax ist einfach
und schnell zu erlernen.
Die Da\%ten\%bankverbindungssprache CL
ist eine zei\%len\%orientierte Spra\%che,
die formal (Syntax)
und informal (Semantik) ein\%ge\%f\*uhrt wird.
.br
CL Pro\%gram\%me werden in DBI
(Data Bases Interface)
Textfiles ab\%ge\%legt,
die interpretierend von
CDB(\*(RR),
RDB(\*(RR) und
WDB(\*(RR) abgearbeitet werden.
.br
DBI-Textfiles k\*onnen mit einem
\*(UU Texteditor erstellt bzw. ge\*andert werden.
Bei der Erstellung kann
DB(\*(RR) eine zeitersparende Hilfe sein.
.sh SYNTAX
Die formale Beschreibung erfolgt in Form von Regeln (R).
Die rechte Seite der Regel gibt den Regelname an
und die linke Seite die Regelaufl\*osung.
Beide Seiten werden durch das Zeichen : getrennt.
Regelnamen werden immer mit klei\%nen,
nicht weiter aufgel\*oste Konstanten
immer mit gro\*sen Buch\%sta\%ben geschrieben.
Alle Regeln (und Alternativen) wer\%den durchnummeriert,
um einfache Bez\*uge herstellen zu k\*on\%nen.
.s1
.lp +8 8
(R\ 1) CL\ \ \ \ \ \ \ \ \ \ \ :\ {line}
.i0
.s1
R1 besagt,
da\*s die CL aus einer nicht leeren Menge ({})
von Zeilen (line) besteht.
Die geschweiften Klammern sind syn\%tak\%tische Metasymbole,
die eine 1 bis n-malige Wie\%der\%holung angeben.
Der Name line ist ein Regelname,
also durch wei\%te\%re Regeln noch aufzul\*osen.
.s1
.lp +8 8
(R\ 2) line\ \ \ \ \ \ \ \ \ :\ NL
.lp +8 8
(R\ 3) \ \ \ \ \ \ \ \ \ \ \ \ \ |\ dbi_line
.i0
.s1
Eine Zeile kann leer sein
(R2: nur aus dem Zeichen NL be\%ste\%hend;
NL ist eine Konstante,
die das Zeilenendezeichen (newline) repr\*asentiert)
oder eine Schnitt\%stel\%len\%de\%fi\%ni\%tions\%zeile
(R3: dbi_line) sein.
Die Alternative wird durch das syntaktische Metazeichen |
am Anfang von R3 dargestellt.
Leerzeilen k\*onnen \*uberall stehen
und sollen daher nicht weiter betrachtet werden.
Schnittstellendefinitioszeilen wer\%den der Einfachheit halber
im folgendem Zeilen genannt.
Alle Zeilen haben einen allgemeinen Aufbau.
Sie d\*urfen maximal 255 Zeichen lang sein
und beginnen mit einem Zei\%len\%kennzeichen
gefolgt von einer Menge von Fel\%dern,
die durch ei\%nen Seperator (sep)
voneinander getrennt sind.
.s1
.lp +8 8
(R\ 4) sep\ \ \ \ \ \ \ \ \ \ :\ {space}
.lp +8 8
(R\ 5) space\ \ \ \ \ \ \ \ :\ TAB\ |\ BLANK
.i0
.s1
Ein Seperator kann aus vielen (R4)
Tabulatoren oder Leer\%zei\%chen (R5)
in beliebiger Reihenfolge gebildet werden.
.s1
Es werden 8 verschiedene Zeilentypen unterschieden:
.s1
.lp +8 8
(R\ 6) dbi_line\ \ \ \ \ :\ comment_line
.lp +8 8
(R\ 7) \ \ \ \ \ \ \ \ \ \ \ \ \ |\ dbd_line
.lp +8 8
(R\ 8) \ \ \ \ \ \ \ \ \ \ \ \ \ |\ field_line
.lp +8 8
(R\ 9) \ \ \ \ \ \ \ \ \ \ \ \ \ |\ db_line
.lp +8 8
(R10) \ \ \ \ \ \ \ \ \ \ \ \ \ |\ tab_line
.lp +8 8
(R11) \ \ \ \ \ \ \ \ \ \ \ \ \ |\ dom_line
.lp +8 8
(R12) \ \ \ \ \ \ \ \ \ \ \ \ \ |\ ref_line
.lp +8 8
(R13) \ \ \ \ \ \ \ \ \ \ \ \ \ |\ cmd_line
.i0
.s1
.lp +8 8
(R14) comment_line\ :\ ':'\ sep\ COMMENT\ NL
.i0
.s1
Die Konstante ':' stellt das Zeichen : dar,
sie ist das Zei\%len\%kenn\%zei\%chen der Kommentarzeile
(R14: comment_line).
Die Konstante COM\%MENT ist ein beliebiger Kommentartext,
der durch den Seperator sep vom Zeilenkennzeichen zu trennen ist
und durch das Zeilenendezeichen NL beendet wird.
Kom\%men\%tar\%zeilen k\*onnen \*uberall stehen
und sollen daher nicht weiter betrachtet werden.
.s1
.lp +8 8
(R15) dbd_line\ \ \ \ \ :\ '2'\ |\ '3'\ sep\ DBD_NAME\ NL
.i0
.s1
Eine \*(RR Da\%ten\%bank\%zeile
(R15: dbd_line)
wird durch die \*(RR Versionsnummer
(2 f\*ur \*(R2
bzw. 3 f\*ur \*(R3/4)
als Zeilenkennzeichen eingeleitet,
sie hat ein Feld.
.br
Das Feld DBD_NAME ist der
\*(UU Filename der \*(RR Da\%ten\%bank.
.s1
Die angegebene Da\%ten\%bank mu\*s
zur Abarbeitungszeit von DB(\*(RR) und RDB(\*(RR)
im \*(UU Filesystem existieren.
.s1
.lp +8 8
(R16) field_line\ \ \ :\ 'F'\ sep\ F_NO\ sep\ F_NAME\ sep\ F_TYP
.lp +8 8
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ [sep\ F_DEC]\ NL
.i0
.s1
Eine (\*(RR) Feldzeile
(R16: field_line)
wird durch das Zeilenkennzeichen F eingeleitet,
sie hat 3 oder 4 Felder.
.br
Das Feld F_NO ist die Nummer des \*(RR Feldes,
sie darf zwischen 0 .. Feldanzahl-1 der Da\%ten\%bank liegen.
.br
Das Feld F_NAME ist der Name des \*(RR Feldes,
er darf aus dem Zei\%chen\%satz [A-Z:0-9] gebildet werden
und maximal 10 Zeichen lang sein.
.br
Das Feld F_TYP ist die Typ-/L\*angenangabe des \*(RR Feldes.
.br
Das Feld F_DEC ist die Anzahl der Dezimalstellen des \*(RR Feldes.
Ist F_DEC==0,
kann die Angabe des Feldes entfallen
(die Metazeichen [] geben die wahlweise Verwendung
der syn\%tak\%tischen Konstruktion an).
.s1
Folgende Wer\%te f\*ur F_TYP und F_DEC sind zul\*assig:
.s1
.in 13
.nf
F_TYP F_DEC
-------------------------------------------
Cl 0 0 < l < 255
D8 0
I4 0 nur f\*ur \*(RR Satznummer
L1 0
M10 0 nur \*(R3/4
Nl d 0 <= d < l < 21
.fi
.i0
.s1
Das Feld F_NO==0 ist die \*(RR Satznummer,
ein Feld das we\%der im \*(RR Datensatz
noch in den \*(RR Feld\%de\%fi\%ni\%tionen erscheint.
Dieses Feld mu\*s den Namen F_NAME==#
und den in\%ter\%nen Da\%ten\%typ F_TYP==I4
(32-bit Integer) erhalten.
.br
Das Feld F_NO==1 ist die \*(RR L\*oschmarkierung,
ein Feld das im \*(RR Datensatz,
nicht aber in den \*(RR Feld\%de\%fi\%ni\%tionen erscheint.
Dieses Feld mu\*s den Namen F_NAME==*
und den Da\%ten\%typ F_TYP==C1 erhalten.
.br
Beide Felder sind imagin\*are Felder,
die aber in beiden Rich\%tun\%gen \*ubernommen werden k\*onnen.
Die eigentlichen \*(RR Felder beginnen
also mit der Nummer F_NO==2.
.s1
Das angegebene Feld mu\*s
zur Abarbeitungszeit von DB(\*(RR) und RDB(\*(RR)
in der \*(RR Da\%ten\%bank
mit den gleichen Werten f\*ur F_NO, F_TYP und F_DEC existieren.
.s1
.lp +8 8
(R17) db_line\ \ \ \ \ \ :\ 'I'\ sep\ DB_NAME\ NL
.i0
.s1
Eine \*(II Da\%ten\%bank\%zeile
(R17: db_line)
wird durch das Zeilenkennzeichen I eingeleitet,
sie hat ein Feld.
.br
Das Feld DB_NAME ist der Name der \*(II Da\%ten\%bank,
er darf aus dem Zei\%chen\%satz [a-z_0-9] gebildet werden
und maximal 12 Zeichen lang sein.
.s1
Die angegebene Da\%ten\%bank mu\*s
zur Abarbeitungszeit von CDB(\*(RR),
RDB(\*(RR) und WDB(\*(RR)
im \*(II System existieren.
.s1
.lp +8 8
(R18) tab_line\ \ \ \ \ :\ 'T'\ sep\ TAB_NAME\ NL
.i0
.s1
Eine (\*(II) Tabellenzeile
(R18: tab_line)
wird durch das Zeilenkennzeichen T eingeleitet,
sie hat ein Feld.
.br
Das Feld TAB_NAME ist der Name der \*(II Tabelle (Re\%la\%tion),
er darf aus dem Zei\%chen\%satz [a-z_0-9] gebildet werden
und maximal 12 Zeichen lang sein.
.s1
Die angegebene Relation mu\*s
zur Abarbeitungszeit von RDB(\*(RR) und WDB(\*(RR)
in der \*(II Da\%ten\%bank existieren.
.s1
.lp +8 8
(R19) dom_line\ \ \ \ \ :\ 'D'\ sep\ D_NO\ sep\ D_NAME\ sep\ D_TYP\ NL
.i0
.s1
Eine (\*(II) Dom\*anzeile
(R19: dom_line)
wird durch das Zeilenkennzeichen D eingeleitet,
sie hat 3 Felder.
.br
Das Feld D_NO ist die Nummer der \*(II Dom\*ane,
sie darf zwischen 1 .. Dom\*ananzahl der Relation liegen.
.br
Das Feld D_NAME ist der Name der \*(II Dom\*ane,
er darf aus dem Zei\%chen\%satz [a-z_0-9] gebildet werden
und maximal 12 Zeichen lang sein.
.br
Das Feld D_TYP ist die Typ-/L\*angenangabe der \*(II Dom\*ane.
.br
.s1
Folgende Wer\%te f\*ur D_TYP sind zul\*assig:
.s1
.in 13
.nf
D_TYP
-------------------------------------------
cn 0 < n < 256
fn n==4 || n==8
in n==1 || n==2 || n==4
.fi
.i0
.s1
Die angegebene Dom\*ane mu\*s
zur Abarbeitungszeit von RDB(\*(RR) und WDB(\*(RR)
in der \*(II Relation
mit den gleichen Werten f\*ur D_NO und D_TYP existieren.
.s1
.lp +8 8
(R20) ref_line\ \ \ \ \ :\ '@'\ sep\ F_NO\ sep\ D_NO\ NL
.i0
.s1
Eine Zuordnungszeile
(R20: ref_line)
wird durch das Zei\%len\%kennzeichen @ eingeleitet,
sie hat 2 Felder.
.br
Das Feld F_NO ist die Nummer des \*(RR Feldes,
sie darf zwischen 0 .. Feldanzahl-1 der Da\%ten\%bank liegen.
.br
Das Feld D_NO ist die Nummer der \*(II Dom\*ane,
sie darf zwischen 1 .. Dom\*ananzahl der Relation liegen.
.br
Die Zuordnungszeile definiert,
welches \*(RR Feld
in welche \*(II Dom\*ane geladen werden soll
und umgekehrt.
Hinter den \*(RR Feldern und \*(II Dom\*anen
verbergen sich Werte, die umgeladen werden sollen.
Diese Werte sind allgemein als Typen
(F_TYP/F_DEC und D_TYP) definiert,
Folgende Typ\%zu\%ord\%nun\%gen wer\%den unterst\*utzt:
.s1
.in 13
.nf
\*(RR \*(II
----------------------------------------------------
Cl (0 < l < 255) cn (0 < n < 256)
D c8
L c1
Nl.d (0 <= d < l < 21) i1 || i2 || i4 || f4 || f8
M (nur \*(R3/4) keine Zuordnung m\*oglich
I4 (Satznummer) i4
C1 (Loeschmarkierung) c1
.fi
.i0
.s1
Bei der Zuordnung von \*(RR Feldern
zu \*(II Dom\*anen gilt,
da\*s jeweils nur ein Feld einer Dom\*ane zugewiesen wer\%den kann.
.s1
.lp +8 8
(R21) cmd_line\ \ \ \ \ :\ 'R'\ sep\ COMMAND\ NL
.lp +8 8
(R22) \ \ \ \ \ \ \ \ \ \ \ \ \ |\ 'W'\ sep\ COMMAND\ NL
.i0
.s1
Eine Kom\%man\%do\%zei\%le
(R21|R22: cmd_line)
wird entweder durch das Zei\%len\%kennzeichen R
oder W eingeleitet,
sie hat 1 Feld.
.br
Das Feld COMMAND ist der Kom\%man\%do\%text,
des auszuf\*uhrenden Kom\%man\%dos.
.br
Die R-Kom\%man\%do\%zei\%len (R21)
werden durch RDB(\*(RR)
und die W-Kom\%man\%do\%zei\%len (R22)
durch WDB(\*(RR) ausgef\*uhrt.
.sh SEMANTIK
Die bisherige Syntax mu\*s
um die Regeln der Reihenfolge
der verschiedenen Zeilen erweitert werden.
.br
Die informale Beschreibung erfolgt in Form von Regeln (S).
.br
Wie schon bekannt,
k\*onnen Leer- und Kommentarzeilen
an al\%len Stellen des DBI-Textfiles eingef\*ugt werden,
wo Zeilen stehen d\*urfen.
Sie sollen bei der Darstellung der se\%man\%tischen Regeln
nicht mehr erw\*ahnt werden.
.s1
.lp +8 8
(S\ 1) DBI\ \ \ \ \ \ \ \ \ \ :\ [before]\ \*(rr\ \*(ii\ [after]
.i0
.s1
Ein DBI-Text gliedert sich in 4 Abschnitte:
.lp +16 8
before Kom\%man\%do\%teil vor der Konvertierung (S2)
.lp +16 8
\*(rr \*(RR Da\%ten\%bank\%teil (S3)
.lp +16 8
\*(ii \*(II Da\%ten\%bank\%teil (S5)
.lp +16 8
after Kom\%man\%do\%teil nach der Konvertierung (S9)
.i0
Die Kom\%man\%do\%teile vor bzw. nach der Konvertierung sind wahl\%weise,
d.h. sie k\*onnen entfallen.
.s1
.lp +8 8
(S\ 2) before\ \ \ \ \ \ \ :\ {cmd_line}
.i0
.s1
Der Kom\%man\%do\%teil vor der Konvertierung
besteht aus einer be\%liebigen Menge
von R-Kom\%man\%do\%zei\%len (R21) bzw.
W-Kom\%man\%do\%zei\%len (R22).
.br
Die R-Kom\%man\%do\%zei\%len (R21)
werden durch RDB(\*(RR)
und die W-Kom\%man\%do\%zei\%len (R22)
durch WDB(\*(RR) ausgef\*uhrt.
Ein Kommando kann ein Programm mit Argumenten
oder eine shell-Prozedur mit Argumenten sein.
.br
In DB(\*(RR) sind Beispiele zur Verwendung
des Kom\%man\%do\%teils angegeben.
.s1
.lp +8 8
(S\ 3) \*(rr\ \ \ \ \ \ :\ dbd_line\ fields
.i0
.s1
Der \*(RR Da\%ten\%bank\%teil beschreibt vollst\*andig
die \*(RR Da\%ten\%bank.
Sie wird durch eine \*(RR Da\%ten\%bank\%zei\%le (R15: dbd_line)
und den Feldteil (S4: fields) definiert.
.s1
.lp +8 8
(S\ 4) fields\ \ \ \ \ :\ {field_line}
.i0
.s1
Die \*(RR Felder werden durch
eine Menge von Feldzeilen (R16: field_line) definiert.
.s1
.lp +8 8
(S\ 5) \*(ii\ \ \ \ \ \ \ \ \ :\ db_line\ {relation}
.i0
.s1
Der \*(II Da\%ten\%bank\%teil beschreibt vollst\*andig
die \*(II Da\%ten\%bank.
Sie wird durch eine \*(II Da\%ten\%bank\%zei\%le (R17: db_line)
und eine Menge von (\*(II) Ta\%bel\%len\%tei\%len (S6: relation) definiert.
Jeder Ta\%bel\%len\%tei\%l be\%schreibt genau eine \*(II Relation.
Es sind maximal 5 Ta\%bel\%len\%tei\%le zul\*assig.
.s1
.lp +8 8
(S\ 6) relation\ \ \ \ \ :\ tab_line\ doms\ refs
.i0
.s1
Der (\*(II) Ta\%bel\%len\%tei\%l beschreibt vollst\*andig
eine \*(II Relation.
Sie wird durch eine Tabellenzeile (R18: tab_line),
den Dom\*anteil(S7: doms)
und den Zuordnungsteil (S8: refs) definiert.
.s1
.lp +8 8
(S\ 7) doms\ \ \ \ \ \ \ \ \ :\ {dom_line}
.i0
.s1
Die \*(II Dom\*anen werden durch
eine Menge von Dom\*anzeilen (R19: dom_line) definiert.
.s1
.lp +8 8
(S\ 8) refs\ \ \ \ \ \ \ \ \ :\ {ref_line}
.i0
.s1
Die Zuordnungen werden durch
eine Menge von Zuordnungszeilen (R20: ref_line) definiert.
.s1
.lp +8 8
(S\ 9) after\ \ \ \ \ \ \ \ :\ {cmd_line}
.i0
.s1
Der Kom\%man\%do\%teil nach der Konvertierung
besteht aus einer be\%liebigen Menge
von R-Kom\%man\%do\%zei\%len (R21) bzw.
W-Kom\%man\%do\%zei\%len (R22).
.br
Die R-Kom\%man\%do\%zei\%len (R21)
werden durch RDB(\*(RR)
und die W-Kom\%man\%do\%zei\%len (R22)
durch WDB(\*(RR) ausgef\*uhrt.
Ein Kommando kann ein Programm mit Argumenten
oder eine shell-Prozedur mit Argumenten sein.
.br
In DB(\*(RR) sind Beispiele zur Verwendung
des Kom\%man\%do\%teils angegeben.
.bp
.sh BEISPIEL
Folgender DBI-Text soll die syntaktischen
und semantischen Regeln erl\*autern.
.s1
.nf
1 R echo START \*(R2 ==> \*(II
2 W echo START \*(II ==> \*(R2
3 2 pers.dbd
4 F 0 # I4
5 F 1 * C1
6 F 2 NUM N5
7 F 3 NAME C20
8 I \*(rr
9 T personal
10 D 1 num i2
11 D 2 name c20
12 @ 2 1
13 @ 3 2
14 R echo ENDE \*(R2 ==> \*(II
15 W echo ENDE \*(II ==> \*(R2
.fi
.s1
Folgend sollen alle Zeilen den
syntaktischen und semantischen Regeln zugeordnet werden:
.s1
.lp +12 12
Zeile\ \ 1-15 (S1) DBI-text
.s1
.lp +12 12
Zeile\ \ 1-\ 2 (S2) Kommandoteil vor der Konvertierung
.s1
.lp +12 12
Zeile\ \ \ \ \ 1 (R21) Kommando f\*ur RDB(\*(RR),
.br
gibt den Text "START \*(R2 ==> \*(II"
nach dem Start der Konvertierung aus.
.lp +12 12
Zeile\ \ \ \ \ 2 (R22) Kommando f\*ur WDB(\*(RR),
.br
gibt den Text "START \*(II ==> \*(R2"
nach dem Start der Konvertierung aus.
.s1
.lp +12 12
Zeile\ \ 3-\ 7 (S3) \*(RR Da\%ten\%bank\%teil
.s1
.lp +12 12
Zeile\ \ \ \ \ 3 (R15) \*(RR Da\%ten\%bank\%zeile,
f\*ur die \*(RR Da\%ten\%bank,
die sich in dem \*(UU file pers.dbd be\%fin\%det.
.s1
.lp +12 12
Zeile\ \ 4-\ 7 (S4) Feld\%teil
.s1
.lp +12 12
Zeile\ \ \ \ \ 4 (R16) Feldzeile,
f\*ur das Feld 0/# mit dem Typ I4
(\*(RR Satznummer).
.lp +12 12
Zeile\ \ \ \ \ 5 (R16) Feldzeile,
f\*ur das Feld 1/* mit dem Typ C1
(\*(RR L\*oschmarkierung).
.lp +12 12
Zeile\ \ \ \ \ 6 (R16) Feldzeile,
f\*ur das Feld 2/NUM mit dem Typ N5
(Angestelltennummer).
.lp +12 12
Zeile\ \ \ \ \ 7 (R16) Feldzeile,
f\*ur das Feld 3/NAME mit dem Typ C20
(Angestelltenname).
.s1
.lp +12 12
Zeile\ \ 8-13 (S5) \*(II Da\%ten\%bank\%teil
.s1
.lp +12 12
Zeile\ \ \ \ \ 8 (R17) \*(II Da\%ten\%bank\%zeile,
w\*ahlt die Da\%ten\%bank \*(rr aus.
.s1
.lp +12 12
Zeile\ \ 9-13 (S6) Tabellen\%teil
.s1
.lp +12 12
Zeile\ \ \ \ \ 9 (R18) Tabellen\%zeile
f\*ur die Relation personal der Da\%ten\%bank \*(rr.
.s1
.lp +12 12
Zeile\ 10-11 (S7) Dom\*an\%teil
.s1
.lp +12 12
Zeile\ \ \ \ 10 (R19) Dom\*anzeile,
f\*ur die Dom\*ane 1/num mit dem Typ i2
(Angestelltennummer).
.lp +12 12
Zeile\ \ \ \ 11 (R19) Dom\*anzeile,
f\*ur die Dom\*ane 2/name mit dem Typ c20
(Angestelltenname).
.s1
.lp +12 12
Zeile\ 12-13 (S8) Zuordnungs\%teil
.s1
.lp +12 12
Zeile\ \ \ \ 12 (R20) Zuordnungszeile,
korreliert das Feld 2 (NUM/N5)
mit der \*(II Dom\*ane 1 (num/i2).
.lp +12 12
Zeile\ \ \ \ 13 (R20) Zuordnungszeile,
korreliert das Feld 3 (NAME/C20)
mit der \*(II Dom\*ane 2 (name/c20).
.s1
.lp +12 12
Zeile\ 14-15 (S9) Kommandoteil nach der Konvertierung
.s1
.lp +12 12
Zeile\ \ \ \ 14 (R21) Kommando f\*ur RDB(\*(RR),
.br
gibt den Text "ENDE \*(R2 ==> \*(II"
nach dem Ende der Konvertierung aus.
.lp +12 12
Zeile\ \ \ \ 15 (R22) Kommando f\*ur WDB(\*(RR),
.br
gibt den Text "ENDE \*(II ==> \*(R2"
nach dem Ende der Konvertierung aus.
.i0