P8000/WEGA/contrib/ingres/dbs/ing_src/teil1/ql

3229 lines
55 KiB
Plaintext

.ds RH \f3Uebersicht\f1
.ds LH Referenz_Manual
.ds RF \f3QUEL\f1
.ds CH - % -
.bp
.NH 3
.ft B
\o'U"'bersicht der Anfrage-Kommandos *
.ft R
.LP
.IP
.RS
.IP =>
APPEND \- f\o'u"'ge neue Tupel in die Relation ein
.br
.ft B
append
.ft R
[\c
.ft B
to\c
.ft R
] relname (target_list) [\c
.ft B
where
.ft R
qual\c
]
.IP =>
COPY \- kopiere Daten zwischen einer Relation und einem \*(xx\ File.
.br
.ft B
copy
.ft R
relname
([domname = fformat {, domname = fformat }])
.br
.RS
.IP
into | from "Filename"
.RE
.IP =>
CREATE \- erzeuge eine neue Relation
.br
.ft B
create
.ft R
relname (domname
= format {, domname
= format })
.IP =>
DEFINE \- definiere Subschema
.br
.ft B
define
.ft R
.ft B
view
.ft R
relname (target list) [
.ft B
where
.ft R
qual ]
.br
.ft B
define
.ft R
.ft B
permit
.ft R
oplist
.ft B
on
.ft R
var [ (attlist) ]
.br
.ft B
to
.ft R
name [
.ft B
at
.ft R
term ] [
.ft B
from
.ft R
time
.ft B
to
.ft R
time ] [
.ft B
on
.ft R
day
.ft B
to
.ft R
day ] [
.ft B
where
.ft R
qual ]
.br
.ft B
define
.ft R
.ft B
integrity
.ft R
.ft B
on
.ft R
var
.ft B
is
.ft R
qual
.IP =>
DELETE \- l\o'o"'sche Tupel aus einer Relation
.br
.ft B
delete
.ft R
var
[\c
.ft B
where
.ft R
qual\c
]
.IP =>
DESTROY \- l\o'o"'sche existierende Relationen
.br
.ft B
destroy
.ft R
relname {, relname}
.br
.ft B
destroy
.ft R
.ft B
permit | integrity
.ft R
relname
.ft B
all |
.ft R
constraint {, constraint}
.IP =>
HELP \- liefere Hilfen \o'u"'ber \*(yy\-Nutzung
oder Informationen \o'u"'ber Relationen in der Datenbank
.br
.ft B
help
.ft R
[\c
relname\c
{\c
,relname\c
}]
.br
.ft B
help
.ft R
"" | "section" {,"section"}
.br
.ft B
help integrity | permit | view
.ft R
relname {,relname}
.IP =>
INDEX \- erzeuge einen Sekund\o'a"'rindex \o'u"'ber
eine existierende Relation.
.br
.ft B
index on
.ft R
relname
.ft B
is
.ft R
indexname
(domname
{ ,domname
})
.IP =>
INTEGRITY \- definiere Integrit\o'a"'tsbedingungen
.br
.ft B
define integrity on
.ft R
var
.ft B
is
.ft R
qual
.IP =>
MODIFY \- modifiziere die Speicherstruktur einer Relation
.br
.RS
.IP
.ft B
modify
.ft R
relname
.ft B
to
.ft R
storage-structure
.br
[
.ft B
on
.ft R
key [ :sortorder]
{ , key :sortorder
} ]
.br
[
.ft B
where
.ft R
[
.ft B
fillfactor =
.ft R
n ] [
.ft B
, minpages =
.ft R
n ]
.br
[
.ft B
, maxpages =
.ft R
n ] ]
.RE
.IP =>
PERMIT \- f\o'u"'ge Berechtigungen zu einer Relation hinzu
.br
.ft B
define permit
.ft R
oplist
.ft B
on
.ft R
var [ (attlist) ]
.br
.ft B
to
.ft R
name [
.ft B
at
.ft R
term ] [
.ft B
from
.ft R
time
.ft B
to
.ft R
time ] [
.ft B
on
.ft R
day
.ft B
to
.ft R
day ] [
.ft B
where
.ft R
qual ]
.IP =>
PRINT \- drucke Relationen
.br
.ft B
print
.ft R
relname {, relname}
.IP =>
RANGE \- deklariere eine Variable \o'u"'ber eine Relation
.br
.ft B
range
.ft R
[[
.ft B
of
.ft R
] var
.ft B
is
.ft R
relname]
.IP =>
REPLACE \- ersetze Werte von Dom\o'a"'nen in einer Relation
.br
.ft B
replace
.ft R
var (target_list)
[\c
.ft B
where
.ft R
qual]
.IP =>
RETRIEVE \- suche Tupel
.br
.ft B
retrieve
.ft R
[[\c
.ft B
into\c
.ft R
] relname
.ft B
unique\c
.ft R
] (target_list)
[\c
.ft B
where
.ft R
qual]
.IP =>
SAVE \- sichere eine Relation bis zu einem be\%stimmten Datum
.br
.ft B
save
.ft R
relname
.ft B
until
.ft R
month day year
.IP =>
VIEW \- definiere eine virtuelle Relation
.br
.ft B
define view
.ft R
relname (target list) [
.ft B
where
.ft R
qual ]
.RE
.bp
.SH
.ft B
\*(yy\ - Referenz Manual
.ft R
.sp 5
.SH
.ft B
TEIL QUEL
.ft R
.sp 5
.nf
################################################################
################################################################
## ##
## ##
## ##
## ##
## ##
## ### # # ##### ###### ###### ##
## # ## # # # # # # # ##
## # # # # # # # # # ##
## # # # # # #### # # ###### ##
## # # # # # # # # # # ##
## # # ## # # # # # # ##
## ### # # ##### ####### ###### ###### ##
## ##
## ##
## ##
## ##### # # ####### # ##
## # # # # # # ##
## # # # # # # ##
## # # # # ##### # ##
## # # # # # # # ##
## # # # # # # ##
## #### # ##### ####### ####### ##
## ##
## ##
## ##
## ##
## ##
################################################################
################################################################
.fi
.bp
.LP
.ds RH \f3APPEND\f1
.bp
.RE
.ft B
NAME
.ft R
.IP
append \- Anf\o'u"'gen von Tupeln an eine Relation
.RE
.sp 1
.ft B
SYNOPSIS
.ft R
.IP
.ft B
append
.ft R
[\c
.ft B
to\c
.ft R
] relname (target_list) [\c
.ft B
where
.ft R
qual\c
]
.RE
.sp 1
.ft B
BESCHREIBUNG
.ft R
.IP
.ft B
append
.ft R
f\o'u"'gt Tupel
an die mit
.ft B
<relname>
.ft R
bezeichnete Relation an.
Diese Relation muss bereits existieren.
Die
.ft B
<target_list>
.ft R
bestimmt die
Attribute, die mit Werten belegt werden.
Die Dom\o'a"'nen k\o'o"'nnen in der <target_list>
in beliebiger Reihenfolge aufgez\o'a"'hlt werden.
Attribute, deren Dom\o'a"'ne in der <target_list>
nicht aufgez\o'a"'hlt sind, erhalten einen
leeren Wert (0 bei nume\%rischen Dom\o'a"'nen,
Leerkette "" bei Zeichenketten\-Dom\o'a"'nen).
.IP
Die Belegung der Attribute erfolgt mittels
der Formulierung in der <target_list>
durch direkte Wertzuweisung
oder durch Ausdrucks\- oder Namenszuweisung
aus anderen Quell\-Relationen.
Die Quell\-Relationen sind vorher durch
.ft B
range\c
.ft R
\-Statements mit entsprechenden
.ft B
tuple_variablen
.ft R
zu definieren.
Aus den Quell\-Relationen kann eine Filterung
\o'u"'ber eine
.ft B
where\c
.ft R
\-Phrase erfolgen.
.IP
Das Schl\o'u"'sselwort
.ft B
all
.ft R
kann in der <target_list>
benutzt werden, wenn der Ziel\-Relation alle
Dom\o'a"'nen hinzugef\o'u"'gt werden
und diese mit den Dom\o'a"'nen\-Namen
der Quell\-Relation \o'u"'bereinstimmen sollen.
.IP
Um Attribute einer numerischen Dom\o'a"'ne zu belegen,
kann ein beliebiges, anderes numerisches Attribut
oder ein nume\%rischer Ausdruck zugewiesen werden.
Es erfolgen automatisch die n\o'o"'tigen Konvertierungen.
Numerische Werte k\o'o"'nnen nicht direkt auf solche
von Zeichenketten\-Dom\o'a"'nen zugewiesen werden;
man konvertiert sie mittels der
.ft B
ascii\c
.ft R
\-Funktion.
Ebenso kann eine Zeichenkette nicht direkt
dem Attribut einer nume\%rischen Dom\o'a"'ne zugewiesen
werden; man benutzt in diesem Fall die
Konvertierungsfunktionen
.ft B
int1
.ft R
,
.ft B
int2
.ft R
u.s.w.
.IP
Das Statement
.ft B
append
.ft R
kann f\o'u"'r die Ziel\-Relation
nur durch deren Eigent\o'u"'mer
oder durch einen Nutzer, der f\o'u"'r sie
die Zugriffsberechtigung
.ft B
append
.ft R
hat, benutzt werden.
.RE
.sp 1
.ft B
BEISPIELE
.ft R
.DS I
/* F\o'u"'ge einer Personal\-Relation
einen neuen Mitarbeiter hinzu */
append personal(name="Neumann",pno=2345,abt="ORZ")
.sp 1
/* F\o'u"'ge eine Relation zugang
an die Personal\-Relation an */
range of z is zugang
append to personal(z.all)
.DE
.RE
.sp 1
.ft B
SIEHE AUCH
.ft R
.IP
copy(quel), retrieve(quel)
.RE
.sp 1
.ft B
NACHRICHTEN
.ft R
.IP
Bei Zuweisung eines numerischen Wertes auf das
Attribut einer Zeichenketten\-Dom\o'a"'ne oder einer
Zeichenkette auf das Attribut einer numerischen
Dom\o'a"'ne werden Nachrich\%ten ausgegeben.
.RE
.sp 1
.ft B
HILFEN
.ft R
.IP
S\o'a"'tze, die einer Ziel\-Relation hinzugef\o'u"'gt werden,
die als heap, cheap, heapsort oder cheapsort
angelegt ist, gelangen auch dann in die Relation,
wenn diese dadurch doppelte Tupel
erh\o'a"'lt.
Bei einer heapsort\- oder cheapsort\-Ziel\-Relation
werden die Tupel eines erfolg\%reichen
.ft B
append
.ft R
hinten angef\o'u"'gt,
sodass die Sortierung
verloren geht.
.RE
.ds RH \f3COPY\f1
.bp
.ft B
NAME
.ft R
.IP
copy \- Kopieren von Daten einer
Relation von/auf ein \*(xx\-Standard\-File
.RE
.sp 1
.ft B
SYNOPSIS
.ft R
.IP
.ft B
copy
.ft R
relname
([domname=fformat {, domname=fformat }])
.br
.RS
.IP
direction "Filename"
.RE
.RE
.sp 1
.ft B
BESCHREIBUNG
.ft R
.IP
.ft B
copy
.ft R
transportiert die Daten zwischen einer \*(yy\-Relation
und einem \*(xx\-Standard\-File.
Ein Tupel der Relation mit seinen Dom\o'a"'nen
wird einem Satz der Datei mit seinen Feldern zugeordnet.
Die Transportrichtung
.ft B
<direction>
.ft R
ist entweder
.ft B
into
.ft R
oder
.ft B
from.
.ft R
Die mit
.ft B
<relname>
.ft R
bezeichnete Relation muss jedenfalls existieren.
Die <domname>'s m\o'u"'ssen
Dom\o'a"'nen dieser Relation sein.
Das ihnen zugeordnete Format
.ft B
<fformat>
.ft R
ist das der Felder des \*(xx\-File.
Das \*(xx\-File muss mit
"Filename"
durch einen kompletten Pfadnamen
(auf der Wurzel, also mit "/" beginnend)
angegeben werden.
.IP
Beim Kopieren in die Relation
(
.ft B
copy
.ft R
<relname>
(...)
.ft B
from
.ft R
"Filename"
)
wird das Statement nur vom Eigent\o'u"'mer der Relation angenommen.
Die Relation darf keine Systemrelation oder
kein Sekund\o'a"'rindex sein
und darf keinen Sekund\o'a"'rindex haben.
.IP
Beim Kopieren in das \*(xx\-File (
.ft B
copy
.ft R
<relname>
(...)
.ft B
into
.ft R
"Filename"
) wird das Statement nur vom Eigent\o'u"'mer der Relation angenommen
oder von einem Nutzer, der f\o'u"'r sie
Zugriffsberechtigung
.ft B
retrieve
.ft R
hat.
Der Nutzer muss die entsprechende Berechtigung
f\o'u"'r das file_directory haben.
Das \*(xx\-File wird mit file_mode 0600
angelegt oder falls es schon vorhanden
ist, neu erzeugt.
Der
.ft B
copy
.ft R
verwendende Nutzer wird Eigent\o'u"'mer des \*(xx\-File.
.IP
Beim Kopieren werden folgende Formate
.ft B
<fformat>
.ft R
f\o'u"'r die Felder des \*(xx\-File
unterst\o'u"'tzt:
.IP
.RS
.IP
.ft B
i1, i2, i4
.ft R
1\-, 2\- oder 4\-Byte\-Integer
.IP
.ft B
f4, f8
.ft R
4\- oder 8\-Byte Gleitkomma
(einfache oder doppelte Genauigkeit)
.IP
.ft B
c1, c2, ... c255
.ft R
\- Zeichenkette fester angegebener L\o'a"'nge
.IP
.ft B
c0[<delim>] | "c0<delim>"
.ft R
\- Zeichenkette variabler L\o'a"'nge
beendet durch den Begrenzer \c
.ft B
<delim>
.ft R
(delimitor)
.IP
.ft B
d0[<delim>] | "d0<delim>"
.ft R
.br
.ft B
d1 ... d255
.ft R
.br
\- ein f\o'u"'r die Relation bedeutungsloses
Feld (dummy-Feld siehe folgend).
.RE
.IP
Die L\o'a"'ngenangaben in
.ft B
<fformat>
.ft R
d\o'u"'rfen f\o'u"'hrende Nullen haben.
.IP
Die im Statement zugeordnete Dom\o'a"'ne der Relation
zum Feld des File m\o'u"'ssen nicht vom selben Typ
oder derselben L\o'a"'nge sein,
.ft B
copy
.ft R
f\o'u"'hrt die notwendigen Konvertierungen durch
(s. aber unten Laufzeitfehler).
.IP
Im Statement m\o'u"'ssen die Dom\o'a"'nen der Relation
in der Reihenfolge der Felder der S\o'a"'tze des \*(xx\-File
aufgez\o'a"'hlt werden.
Die Zuordnung in der Relation erfolgt per Spaltennamen.
Nicht aufgez\o'a"'hlte Dom\o'a"'nen der Relation
bleiben vom Kopieren ausgeschlossen
(bei
.ft B
from
.ft R
werden sie durch 0 bzw. eine Leerkette "" initia\%lisiert).
Der Satz des \*(xx\-File muss vollst\o'a"'ndig
beschrieben werden.
Vom Kopieren ausgeschlossene Felder m\o'u"'ssen
als
.ft B
dummy\c
.ft R
\-Felder aufgez\o'a"'hlt werden.
Der f\o'u"'r die dummy\-Felder im Statement
angegebene
.ft B
<domname>
.ft R
ist f\o'u"'r die Relation bedeutungslos.
.IP
.ft B
copy
.ft R
unterst\o'u"'tzt die Arbeit mit variabel langen Feldern
auf dem \*(xx\-File, f\o'u"'r die das, sie hinten
begrenzende Zeichen, als Begrenzer (delimitor)
.ft B
<delim>
.ft R
bestimmt werden muss.
Da die \o'u"'blicherweise gew\o'a"'hlten Begrenzer
auch innerhalb der QUEL eine syntaktische Bedeutung haben,
k\o'o"'nnen solche Zeichen symbolisch angegeben werden:
.RE
.DS I
Bezeichner
f\o'u"'r bezeichnet
.ft B
<delim>
.ft R
-------------------------------------------------
nl new_line-Zeichen <nl>
tab Tabulator-Zeichen <tab>
sp (space) <blank>-Zeichen
nul "\e0" Byte vom Wert 0
null "\e0" Byte vom Wert 0
comma Komma ","
colon Semikolon ";"
dash Bindestrich "-"
lparen (left parenthesis) "("
rparen (right parenthesis) ")"
<zeichen> das angegebene Zeichen selbst
.DE
.RE
.IP
Man kann das
.ft B
<fformat>
.ft R
auch als
.ft B
"c0<delim>"
.ft R
bzw.
.ft B
"d0<delim>
.ft R
schreiben,
um eine Spezialbedeutung von <delim>
innerhalb von QUEL aufzuheben.
.IP
Bei der Arbeit mit variablen Feldern
sind Besonderheiten abh\o'a"'ngig von der Transportrichtung
zu beachten.
.IP
In die Relation:
.br
.ft B
copy
.ft R
.ft B
relname
.ft R
(...)
.ft B
from
.ft R
"Filename" :
.RS
.IP
Wenn
.ft B
<delim>
.ft R
im Statement bei
.ft B
c0
.ft R
oder
.ft B
d0
.ft R
nicht angegeben ist,
wird das erste auftretende
Komma, <tab> oder <nl>
als Feldbegrenzer gewertet,
sonst begrenzt das angegebene Zeichen <delim>
das Feld.
Das Begrenzerzeichen wird nicht in das Attribut \o'u"'bernommen.
Enth\o'a"'lt das Feld das Begrenzerzeichen an Stellen, wo
es noch nicht Begrenzer sein soll,
ist diesem Zeichen im Feld ein <backslash> ( "\e" )
voranzustellen.
Beispiele:
.DS I
chardom= c0 Zeichenkette endend
auf Komma, <tab> oder <nl>
chardom= c0nl dto endend auf <nl>
chardom= "c0#" dto endend auf #
.DE
Wenn chardom= c0comma definiert ist,
w\o'u"'rde der Feld\%inhalt
.br
Neumann\e, Karl,
.br
den Attributwert
.br
Neumann, Karl
.br
erzeugen.
Es wird empfohlen, bei der Anlage von \*(xx\-Files,
die zur Kopie auf \*(yy\-Relationen vorgesehen sind,
einen Satzbegrenzer einzuf\o'u"'hren,
der sich von allen Feldbegrenzern unterscheidet.
Dadurch wird
.ft B
copy
.ft R
synchro\%nisiert,
auch wenn ein Satz f\o'a"'lschlicherweise
nicht die richtige Anzahl von Feldern hat.
.RE
.IP
In das File:
.br
.ft B
copy
.ft R
relname (...)
.ft B
into
.ft R
"Filename" :
.IP
c0
.br
.RS
.IP
Das Attribut wird in eine Zeichenkette fester L\o'a"'nge
umgewandelt, diese wird in das File geschrieben.
F\o'u"'r die Attribute von Zeichenketten\-Dom\o'a"'nen
ergibt sich die L\o'a"'nge aus dem Dom\o'a"'nen-Format
.ft B
<format>
.ft R
selbst, f\o'u"'r Attribute
numerischer Dom\o'a"'nen erfolgt eine ascii\-Umwandlung
auf das Druckformat, das bei Sitzungsstart
durch die \*(yy\-Optionen
.ft B
-i,
.ft R
.ft B
-f,
.ft R
oder
.ft B
-c
.ft R
beeinflusst werden kann (s.
.ft B
quel\c
.ft R
(unix)).
.RE
.IP
c0<delim>
.br
.RS
.IP
wie c0, zus\o'a"'tzlich wird das Zeichen <delim>
in das Feld geschrieben.
.RE
.IP
d0
.br
.RS
.IP
unzul\o'a"'ssig
.RE
.IP
d0<delim>
.br
.RS
.IP
Das Zeichen <delim> wird einmal in den Satz des File
geschrieben;
der im Statement angegebene <domname> ist bedeutungslos.
.RE
.IP
d1, d2, ... d255
.br
.RS
.IP
Der <domname> muss einer der oben als "Bezeichner f\o'u"'r <delim>"
aufgez\o'a"'hlten sein.
Das von ihm bezeichnete Zeichen wird 1,2, ... 255 mal
in den Satz des \*(xx\-File geschrieben.
.RE
.IP
d1<delim>, d2<delim>, ... d255<delim>
.br
.RS
.IP
Das Zeichen <delim> wird 1,2, ...255 mal
in das \*(xx\-File geschrieben.
Der im Statement angegebene <domname>
ist bedeutungslos.
.RE
.RE
.IP
Zur Sicherung und Wiederherstellung
einzelner Relationen kann das Statement in der Kurzform:
.IP
.RS
.IP
.ft B
copy
.ft R
relname ()
direction
"Filename"
.RE
.IP
verwendet werden physiche Kopie = (bulk_copy).
Das Statement wird in diesem Falle automatisch mit allen
Dom\o'a"'nen der Relation in deren Erzeugungsreihenfolge
und deren Formaten erg\o'a"'nzt.
Man spart Formulierungsaufwand, die Abarbeitung
erfolgt schneller als f\o'u"'r andere
.ft B
copy\c
.ft R
\-Statements, da Konvertierungen entfallen.
.RE
.sp 1
.ft B
NACHRICHTEN
.ft R
.IP
Es werden eine Reihe syntaktischer Kontrollen durchgef\o'u"'hrt,
die Fehlernachrichten bringen k\o'o"'nnen
(s.
.ft B
dbu\c
.ft R
(error) 5800 ...),
dabei ist das Kopieren noch nicht angelaufen
(man \o'u"'berpr\o'u"'fe ggf. aber, ob bei copy\.\.\.into
das \*(xx\-create schon das Ziel\-File
gel\o'o"'scht hat).
.IP
Zur Laufzeit f\o'u"'hren folgende Fehler
zum Abbruch des Kopierens:
.RS
.IP -
wenn bei Konvertierungen
(numerisch zu Zeichen\%kette,
Zeichenkette zu numerisch,
numerisch zu numerisch anderen Formats)
die L\o'a"'nge des Ziels eine Aufnahme des
vollst\o'a"'ndigen Wertes nicht mehr erlaubt,
.IP -
wenn bei copy\.\.\.from\
das File-Ende asynchron zum Tupelende kommt.
.RE
.IP
Nach Abschluss der Kopie werden 3 integrale Werte
gewarnt, falls es solche F\o'a"'lle gab:
.RS
.IP -
Es wurden
.ft B
nnn
.ft R
Attribute nur verk\o'u"'rzt kopiert.
.RE
.IP
Nur bei copy\.\.\.from\ "Filename":
.RS
.IP -
Es wurden
.ft B
nnn
.ft R
doppelte Tupel gefunden und igno\%riert.
Das erstauftretende Tupel wurde gespeichert.
Diese Meldung tritt nicht auf, wenn die Relation
heap-Struktur hat,
in diese werden auch doppelte Tupel gespeichert.
.RE
.IP -
Es wurden
.ft B
nnn
.ft R
Attribute gefunden,
in denen nicht druckbare Zeichen
auftraten, die zu Leerzeichen konvertiert wurden
(auch <tab>, <nl> und <escape>
wurden konvertiert !)
.RE
.RE
.sp 1
.ft B
BEISPIELE
.ft R
.DS I
/* Kopiere Daten in die personal Relation */
copy personal
(name= "c24#", pno= c4null, d= d0semicol, abt= c0comma
d=d0nl)
from "/mnt/mein_dir/personal"
/* Kopiere Daten der personal Relation
in ein File */
copy personal
(name= c0comma, pno= i2, comma= d1
abt= c3, d= d1comma, d= d1nl)
into "/user/mein_dir/personal"
.DE
.sp 1
.RE
.ft B
SIEHE AUCH
.ft R
.IP
append(quel), create(quel),
quel(unix), integrity(quel), copyr(unix)
.RE
.sp 1
.ft B
HILFEN
.ft R
.IP
Bei copy into auf Relationen mit definierten
Integrit\o'a"'ten werden die Integrit\o'a"'ten nicht
eingehalten, so dass inkonsistente Datenbest\o'a"'nde
entstehen k\o'o"'nnen.
.RE
.ds RH \f3CREATE\f1
.bp
.RE
.ft B
NAME
.ft R
.IP
create \- Erzeugen einer neuen Relation
.RE
.sp 1
.ft B
SYNOPSIS
.ft R
.IP
.ft B
create
.ft R
relname (domname = format
{, domname = format })
.RE
.sp 1
.ft B
BESCHREIBUNG
.ft R
.IP
.ft B
create
.ft R
erzeugt eine neue Relation in der aufliegenden Datenbank.
Die Relation wird dem, das Statement ausl\o'o"'senden
Nutzer, zugeeignet (dieser ist ihr "Eigent\o'u"'mer")
und f\o'u"'r 7 Tage reserviert.
Wenn dieser Nutzer der DBA ist,
wird die Relation zur allgemeinen Benutzung (shared),
andernfalls nur f\o'u"'r den Nutzer pers\o'o"'nlich (private)
verf\o'u"'gbar.
Der Name der erzeugten Relation ist
.ft B
<relname>,
.ft R
ihre Dom\o'a"'nen werden mit den aufgef\o'u"'hrten
.ft B
<domname>
.ft R
\'s angelegt und erhalten die, jeweils f\o'u"'r sie
spezifizierten Formate (s.
.ft B
quel:
.ft R
<format>).
.IP
Die Relation wird als heap ohne Daten initialisiert.
F\o'u"'r andere Nutzer werden keine Zugriffsrechte
eingetragen.
.IP
Eine Relation kann implementierungsabh\o'a"'ngig 49
bzw. 128 Dom\o'a"'nen bekommen.
Die Namen der System-Relationen
(relation, attribute, indexes, tree, protect, integrities, references)
sind reservierte Relationen\-Namen.
.IP
Die vom Anwender gew\o'a"'hlten Namen m\o'u"'ssen
den \*(yy\-Konventionen gen\o'u"'gen.
Namen d\o'u"'rfen kleine Buchstaben, Ziffern
und das Unterstreichungszeichen "_" enthalten;
m\o'u"'ssen mit einem Buchstaben oder "_" anfangen
und d\o'u"'rfen maximal 12 Zeichen lang sein).
Schl\o'u"'sselworte von QUEL oder AMX sollten vermieden werden.
.IP
Attributnamen sind lokale Namen innerhalb einer
Relation und m\o'u"'ssen hier eindeutig sein.
Relationennamen werden von \*(yy\ mit einem
Codenamen des, sie erzeugenden Nutzers erg\o'a"'nzt.
Ein Nutzer greift dadurch bei gleichen
Relationennamen innerhalb einer Datenbank
immer auf "seine" Relation zu.
.RE
.sp 1
.ft B
BEISPIEL
.ft R
.DS I
/* Erzeuge eine Relation personal
mit den Dom\o'a"'nen pno, name, abt */
create personal (pno=i2, name=c56, abt=c3)
.DE
.sp 1
.ft B
SIEHE AUCH
.ft R
.IP
append(quel),
copy(quel),
creater(unix),
destroy(quel),
modify(quel),
save(quel)
.RE
.ds RH \f3DEFINE\f1
.bp
.LP
.ft B
NAME
.ft R
.IP
define - definiere ein Subschema
.LP
.ft B
SYNOPSIS
.ft R
.IP
.ft B
define view
.ft R
name (target list) [
.ft B
where
.ft R
qual ]
.br
.ft B
define
.ft R
.ft B
permit
.ft R
oplist
.ft B
on
.ft R
var [ (attlist) }
.br
.ft B
to
.ft R
name [
.ft B
at
.ft R
term ] [
.ft B
from
.ft R
time
.ft B
to
.ft R
time ] [
.ft B
on
.ft R
day
.ft B
to
.ft R
day ] [
.ft B
where
.ft R
qual ]
.br
.ft B
define integrity on
.ft R
var
.ft B
is
.ft R
qual
.LP
.ft B
BESCHREIBUNG
.ft R
.IP
Mit dem
.ft B
define
.ft R
\-Statement k\o'o"'nnen Integrit\o'a"'ten, Zugriffsrechte
bzw. Sichten (views) in die Datenbank eingef\o'u"'hrt werden,
wenn f\o'u"'r diese QRYMOD (Querymodifikation = Anfragemodifikation)
\-Unterst\o'u"'tzung generiert wurde.
.LP
.ft B
SIEHE AUCH
.ft R
.IP
integrity(quel), permit(quel), view(quel)
.RE
.ds RH \f3DELETE\f1
.bp
.RE
.ft B
NAME
.ft R
.IP
delete \- Streichen von Tupeln aus einer Relation
.RE
.sp 1
.ft B
SYNOPSIS
.ft R
.IP
.ft B
delete
.ft R
var
[\c
.ft B
where
.ft R
qual\c
]
.RE
.sp 1
.ft B
BESCHREIBUNG
.ft R
.IP
.ft B
delete
.ft R
streicht in der Relation vorhandene Tupel,
die sich unter
.ft B
qual
.ft R
qualifizieren.
Die
.ft B
<var>
.ft R
muss in einem vorangehend gegebenem
.ft B
range
.ft R
\-Statement \o'u"'ber einer \%existierenden Relation
definiert worden sein.
Das
.ft B
delete
.ft R
\-Statement hat keine
.ft B
<target_list>,
.ft R
die sich qualifizierenden Tupel werden insgesamt ge\%strichen.
Wenn im Statement keine where-Phrase angegeben wird,
werden alle Tupel der Relation gestrichen;
es entsteht eine leere Relation.
Will man derartiges erreichen, ist
die Anwendung eines modify-Kommandos
.RS
.IP
.ft B
modify
.ft R
<relname>
.ft B
to truncated
.ft R
.RE
.IP
zeitg\o'u"'nstiger.
.IP
Das
.ft B
delete\c
.ft R
\-Statement wird nur vom Eigent\o'u"'mer der Relation, oder einem
Nutzer, der die
Zugriffsberechtigung
.ft B
delete
.ft R
f\o'u"'r die Relation besitzt,
angenommen.
.RE
.sp 1
.ft B
BEISPIEL
.ft R
.DS I
/* Streichen aller Mitarbeiter der Abteilung ORZ
aus der Relation personal */
range of p is personal
delete p where p.abt = "ORZ"
.DE
.sp 1
.ft B
SIEHE AUCH
.ft R
.IP
destroy(quel), modify(quel), range(quel)
.RE
.ds RH \f3DESTROY\f1
.bp
.RE
.ft B
NAME
.ft R
.IP
destroy \- L\o'o"'schen von Relationen
.RE
.sp 1
.ft B
SYNOPSIS
.ft R
.IP
.ft B
destroy
.ft R
relname { , relname }
.br
.ft B
destroy permit | integrity
.ft R
relname
.ft B
all |
.ft R
constraint {,constraint}
.RE
.sp 1
.ft B
BESCHREIBUNG
.ft R
.IP
.ft B
destroy
.ft R
streicht Relationen aus der aufliegenden Datenbank.
Das Kommando wird nur vom Eigent\o'u"'mer der Relation(en)
angenommen.
Will man von einer Relation nur deren Inhalt
\- also alle Tupel \- streichen,
aber die Defi\%nition der Relation erhalten ,
benutzt man das
.ft B
delete
.ft R
\-Statement ohne where-Phrase
oder das
.ft B
modify
.ft R
\-Statement mit der Speicherstruktur
.ft B
truncated.
.ft R
.IP
Beim Streichen einer Relation,
f\o'u"'r die Sekund\o'a"'rindizes definiert sind,
werden automatisch auch diese gestrichen.
Das Streichen eines Sekund\o'a"'rindex selbst
hat auf dessen Prim\o'a"'r-Relation keine Auswirkung.
.IP
Das
.ft B
"destroy permit"
.ft R
\-Statement l\o'o"'scht gegebene
Zugriffsrechte zu der Relation "relname", das
"destroy-integrity"-Statement definierte Integrit\o'a"'ten.
.br
Das Schl\o'u"'sselwort
.ft B
"all"
.ft R
gibt an, dass alle
Zugriffsrechte bzw. Integrit\o'a"'ten gestrichen werden sollen.
Um einzelne Zugriffsrechte bzw. Integrit\o'a"'ten zu l\o'o"'schen,
muss eine, durch Komma getrennte constraint-Liste (Nummern)
angegeben werden. Die constraint's erh\o'a"'lt man durch
.ft B
help permit
.ft R
bzw.
.ft B
help integrity.
.ft R
.RE
.sp 1
.ft B
BEISPIEL
.ft R
.DS I
/* Streiche die Relation personal */
destroy personal
destroy integrity personal 7
destroy integrity personal all
destroy permit personal 2, 9, 12
.DE
.sp 1
.ft B
SIEHE AUCH
.ft R
.IP
create(quel), delete(quel), help(quel), index(quel), modify(quel),
destroyr(unix), integrity(quel), permit(quel), view(quel)
.RE
.sp 1
.ft B
HILFEN
.ft R
.IP
Relationen, die Basis f\o'u"'r Sichten (siehe view(quel))
bzw. Zugriffsrechte (siehe permit(quel)) sind, d\o'u"'rfen
nicht gel\o'o"'scht werden.
.RE
.ds RH \f3HELP\f1
.bp
.RE
.ft B
NAME
.ft R
.IP
help \- Ausgabe von Hilfen zur Nutzung von \*(yy\
und von Informationen \o'u"'ber die Relationen
der aufliegenden Datenbank
.RE
.sp 1
.ft B
SYNOPSIS
.ft R
.IP
.ft B
help
.ft R
[ relname ] {, relname }
.ft B
help
.ft R
"" | "section" {, "section"}
.br
.ft B
help view
.ft R
relname {, relname}
.br
.ft B
help permit
.ft R
relname {, relname}
.br
.ft B
help integrity
.ft R
relname {, relname}
.RE
.sp 1
.ft B
BESCHREIBUNG
.ft R
.IP
Mit Statement
.ft B
help
.ft R
ohne Argumente erh\o'a"'lt man eine \o'U"'bersicht \o'u"'ber alle Relationen
der aufliegenden Datenbank, zu denen Zugriffsberechtigung besteht:
.IP
relation name relation owner
.br
{ <relname> <Eigner> }
.IP
Mit einem Statement
.ft B
help relname
.ft R
erh\o'a"'lt man Informationen \o'u"'ber die
bezeichnete Relation,
sofern f\o'u"'r diese Zugriffsberechtigung besteht:
.RE
.IP
.DS L
Relation: <relname>
Besitzer: <Eigner der Relation>
Tupellaenge: <Gesamtl\o'a"'nge des Tupel>
saved until: <Verfallsdatum>
number of tupels: <Anzahl der Tupel>
storage structur: <Speicherstruktur>
relation type: <Typ der Relation>
Bei indizierten Prim\o'a"'rrelationen folgt:
secondary indices: <indexname> {, <indexname>}
Bei allen Relationen folgt
die Tabelle ihrer Dom\o'a"'nen:
Domaenenname Typ Laenge Schluessel
{ <domname> <format> <keyno>}
.DE
.IP
Die Speicherstruktur wird ausgegeben als:
.RE
.IP
.DS L
[compressed] (heap /* [c]heap */
| isam /* [c]isam */
| hash /* [c]hash */
| unbekannt [Nummer] /* falsch */
)
.DE
.sp 1
.IP
Der Typ der Relation ist:
.RE
.IP
.DS L
Systemkatalog /* System-Relation*/
| Index auf <relname>
| Index auf unbekannte Relation
| Nutzerrelation /* Prim\o'a"'rrelation */
.DE
.IP
Die erste Seitenzahl gibt die Anzahl der physischen Seiten, die
die Relation auf externen Speichern belegt und die aufgrund
des Datenbestandes wirklich notwendig sind, aus.
Die 2.Zahl gibt die \o'U"'berlaufseiten an.
.IP
Wenn die Relation einen Schl\o'u"'ssel hat
und dieser aus mehreren Komponenten besteht,
gibt in der Dom\o'a"'nentabelle
eine
.ft B
<keyno>
.ft R
!= 0
an, dass es sich um eine Schl\o'u"'sselkomponente handelt,
gleichzeitig informiert
.ft B
<keyno>
.ft R
\o'u"'ber die Stellung (Reihenfolge) der Komponente im Schl\o'u"'ssel.
.IP
Mit einem Statement
.ft B
help "section"
.ft R
kann man sich einzelne Ab\%schnitte des Referenz-Manuals
ansehen:
.RE
.IP
.DS L
help "" zeigt das Inhaltsverzeichnis
help "help" zeigt den vorliegenden Abschnitt
help "<section>" zeigt den Abschnitt <section> dieses
Referenz-Manuals
.DE
.IP
Die Abschnittsnamen m\o'u"'ssen
mit kleinen Buchstaben angegeben werden.
.IP
.ft B
help view relname
.ft R
{, relname} druckt die view-Definitionen des spezifizierten Relationsnamen.
.IP
.ft B
help permit relname
.ft R
{, relname} druckt die Zugriffsberechtigungen der spezifizierten
Relationen.
.IP
.ft B
help integrity relname
.ft R
{, relname} druckt die Integrit\o'a"'tsbedingungen f\o'u"'r die
spezifizierten Relationen.
.RE
.ds RH \f3INDEX\f1
.bp
.RE
.ft B
NAME
.ft R
.IP
index \- Erzeugung eines Sekund\o'a"'rindex
.br
auf eine existierende Relation
.RE
.sp 1
.ft B
SYNOPSIS
.ft R
.IP
.ft B
index on
.ft R
relname
.ft B
is
.ft R
indexname
(domname {, domname})
.RE
.sp 1
.ft B
BESCHREIBUNG
.ft R
.IP
.ft B
index
.ft R
wird benutzt, um Sekund\o'a"'rindizes auf existierenden
Relationen zu definieren und zu erzeugen und damit die Effizienz
von
.ft B
retrieve
.ft R
\- und
.ft B
update
.ft R
\-Statements zu erh\o'o"'hen.
Ein Sekund\o'a"'rindex vermittelt mit seinem
Schl\o'u"'ssel einen weiteren Zugriffspfad
auf der Prim\o'a"'r\-Relation, so als
h\o'a"'tte die Prim\o'a"'r\-Relation
einen weiteren Schl\o'u"'ssel, auf den direkt zugegriffen
werden kann.
Der Sekund\o'a"'rindex wird aus den Dom\o'a"'nen der Prim\o'a"'r\-Relation
erzeugt, die in der Reihenfolge,
wie sie im Statement als
.ft B
{<domname>}
.ft R
angegeben sind, als Schl\o'u"'ssel des Index verwendet werden.
Das Statement wird nur vom Eigent\o'u"'mer der Relation
angenommen.
.IP
Um die Integrit\o'a"'t des Index zu erhalten,
kann ein Nutzer Indizes nicht direkt ver\o'a"'ndern.
Sobald die Prim\o'a"'r-Relation ge\o'a"'ndert wird,
werden auch alle auf ihr definierten
Sekund\o'a"'rindizes automatisch ver\o'a"'ndert.
.IP
Ein Sekund\o'a"'rindex wird bei seiner Erzeugung
automatisch in der Speicherstruktur isam
\o'u"'ber seinem Schl\o'u"'ssel
angelegt.
Diese Initialstruktur kann durch die QUEL\-Option
.ft B
\-n
.ft R
auf eine andere festgelegt werden (s.
.ft B
quel
.ft R
(unix)).
Ausserdem kann jeder Sekund\o'a"'rindex
einzeln durch Anwendung eines
.ft B
modify\c
.ft R
-Statements auf eine Speicherstruktur
gebracht werden, die anwendungsspezifisch
die beste ist.
In diesem Falle verwendet man
.ft B
<indexname>
.ft R
wie einen normalen <relname>.
.IP
Nach einem
.ft B
modify
.ft R
\- oder
.ft B
destroy
.ft R
\-Kommando auf einer Prim\o'a"'r\-Relation
sind alle auf ihr definierten Sekund\o'a"'rindizes
gestrichen.
.IP
Sekund\o'a"'rindizes k\o'o"'nnen nicht auf
Systemkataloge, Sichten und
Sekund\o'a"'rindizes definiert werden.
.RE
.sp 1
.ft B
BEISPIEL
.ft R
.DS I
/* Erzeuge einen Sekund\o'a"'rindex abteilung
auf die Prim\o'a"'r\-Relation personal */
index on personal is abteilung(abt)
.DE
.sp 1
.ft B
SIEHE AUCH
.ft R
.IP
copy(quel), destroy(quel), modify(quel), indexr(unix)
.RE
.sp 1
.ft B
HILFEN
.ft R
.IP
Ein Index kann maximal 6 Dom\o'a"'nen als Schl\o'u"'sselkomponenten
erhalten.
.IP
Das
.ft B
copy\c
.ft R
\-Statement kann nicht benutzt werden,
um Daten in eine Relation zu kopieren,
\o'u"'ber der Sekund\o'a"'rindizes
definiert sind.
.IP
Die Anlage eines Index als isam-Struktur ist
die beste Speicherstruktur f\o'u"'r den Standardfall.
.br
Die Speicherstruktur "heap" ist f\o'u"'r Indizes ohne Sinn,
"hash" ist nur dann sinnvoll, wenn grunds\o'a"'tzlich mit
vergebenen festen Schl\o'u"'sseln \o'u"'ber den Index
recherchiert wird.
.RE
.ds RH \f3INTEGRITY\f1
.bp
.LP
.ft B
NAME
.ft R
.IP
integrity - Definition von Integrit\o'a"'tsbedingungen
.LP
.ft B
SYNOPSIS
.ft R
.IP
.ft B
define integrity on
.ft R
var
.ft B is
.ft R
qual
.LP
.ft B
BESCHREIBUNG
.ft R
.IP
Das
.ft B
integrity
.ft R
-Statement f\o'u"'gt eine Integrit\o'a"'tsbedingung f\o'u"'r die durch
.ft B
var
.ft R
spezifizierte Relation hinzu.
Eine Integrit\o'a"'t ist eine Einschr\o'a"'nkung eines
zul\o'a"'ssigen Wertebereiches f\o'u"'r eine oder mehrere
Dom\o'a"'nen. Nachdem die Integrit\o'a"'ten definiert
wurden, werden vom System nur noch \o'A"'nderungen
ausgef\o'u"'hrt, die alle definierten Integrit\o'a"'ten erf\o'u"'llen.
.IP
\o'A"'nderungen, die mindestens eine Integrit\o'a"'t
verletzen, werden ohne Ausgabe einer Fehlermeldung nicht
ausgef\o'u"'hrt.
.IP
In der aktuellen Implementation werden Integrit\o'a"'tsverletzungen
nicht ausgewiesen
\- ung\o'u"'ltige Ver\o'a"'nderungen an existierenden
Datenbest\o'a"'nden werden einfach (schweigend) nicht ausgef\o'u"'hrt.
.IP
Die
.ft B
Qualifikation
.ft R
darf keine Aggregate und nur Dom\o'a"'nen
der einzuschr\o'a"'nkenden Relation enthalten.
.IP
Das integrity-Statement wird nur vom Eigent\o'u"'mer der
Relation angenommen.
.br
In AMX-Programme k\o'o"'nnen nur Relationen verarbeitet
werden, die keine Integrit\o'a"'tsbedingungen besitzen.
.LP
.ft B
BEISPIEL
.ft R
.IP
.DS L
/* Sichere, dass alle Angestellten ein
positives Einkommen haben */
range of e is employee
define integrity on e is e.salary > 0
.DE
.LP
.ft B
SIEHE AUCH
.ft R
.IP
destroy(quel), copy(quel)
.RE
.sp1
.ft B
HILFEN
.ft R
.IP
Eine Integrit\o'a"'t wird nur dann g\o'u"'ltig,
wenn der zum Zeitpunkt der Definition existierende
Datenbestand keine Verletzung der Bedingungen darstellt.
.ft B
copy
.ft R
ber\o'u"'cksichtigt die definierten Integrit\o'a"'ten noch nicht.
.RE
.ds RH \f3MODIFY\f1
.bp
.RE
.ft B
NAME
.ft R
.IP
modify \- \o'A"'nderung der Speicherstruktur einer Relation
.RE
.sp 1
.ft B
SYNOPSIS
.ft R
.IP
.ft B
modify
.ft R
relname
.ft B
to
.ft R
storage_structure
.br
[
.ft B
on
.ft R
key :sortorder { , key :sortorder} ]
.br
[
.ft B
where
.ft R
[
.ft B
fillfactor =
.ft R
.ft B
n
.ft R
]
.br
[
.ft B
, minpages =
.ft R
.ft B
n
.ft R
] [
.ft B
, maxpages =
.ft R
.ft B
n
.ft R
] ]
.RE
.sp 1
.ft B
BESCHREIBUNG
.ft R
.IP
.ft B
modify
.ft R
ver\o'a"'ndert die Speicherstruktur der spezifizierten
Relation
.ft B
<relname>
.ft R
auf
.ft B
<storage_structur>.
.ft R
Das Statement wird nur vom Eigent\o'u"'mer der Relation
angenommen.
Die Systemrelationen und Sichten k\o'o"'nnen mit
.ft B
modify
.ft R
nicht modifiziert werden.
Das Statement wird benutzt,
um Prim\o'a"'rschl\o'u"'ssel einzuf\o'u"'hren,
zu \o'a"'ndern bzw. zu reorganisieren.
Die Speicherstruktur
.ft B
<storage_structure>
.ft R
kann wie folgt bestimmt werden:
.IP
.DS L
isam - index sequentielle Struktur
cisam - komprimierte isam
hash - hash Struktur
chash - komprimierte hash
heap - unstrukturiert und ohne Schl\o'u"'ssel
cheap - komprimierte heap
heapsort - heap mit sortierten Tupeln
und Ausschluss doppelter
cheapsort - komprimierte heapsort
truncated - heap, in dem alle Tupel gestrichen
wurden
same - Reorganisation
.DE
.IP
Die Speicherstrukturen isam und hash erm\o'o"'glichen
Schl\o'u"'sselzugriffe.
Isam ben\o'o"'tigt mindestens zwei Plattenzugriffe,
unterst\o'u"'tzt aber auch sequentielle Zugriffe,
wie sie bei von-bis-Abfragen n\o'o"'tig sind.
Hash greift direkt zu, ist aber bei
sequentieller Suche uneffektiv.
Beide Verfahren ordnen neue Tupel zun\o'a"'chst
auf einer Prim\o'a"'rseite ein
und legen, wenn diese voll ist,
dahinter \o'U"'berlaufseiten an.
Bei der Suche nach einem Tupel
f\o'u"'hrt der Direktzugriff auf die Prim\o'a"'rseite,
diese und alle an ihr "h\o'a"'ngenden" \o'U"'berlaufseiten
m\o'u"'ssen nach dem Tupel abgesucht werden.
.IP
Heap ist ein v\o'o"'llig ungeordneter Bestand,
der nur sequentiell durchsucht werden kann.
Heapsort liegt nach
.ft B
modify
.ft R
in einer definierten Sortierfolge vor.
Sowohl bei heap, als auch bei heapsort
werden neue Tupel unsortiert angef\o'u"'gt.
.IP
Bei Anlage einer heapsort-Struktur
werden die Tupel nach allen ihren Attributen sortiert.
Dadurch k\o'o"'nnen und werden doppelte Tupel
ermittelt und ausgeschlossen.
Bei den Speicherstrukturen heapsort bzw. cheapsort
kann durch die Schl\o'u"'sselw\o'o"'rter
"ascending" bzw. "a" auf\%steigende und durch die
Schl\o'u"'sselw\o'o"'rter "descending" bzw. "d"
fallende Sortierung angegeben werden.
.br
"ascending" ist Standard und kann demzufolge entfallen.
.IP
Bei den komprimierten Speicherstrukturen wird eine
g\o'u"'nstigere Ablage der Daten auf dem externen
Speichermedium erreicht, mit der Einschr\o'a"'nkung, dass
\o'A"'nderungen unter Umst\o'a"'nden zeitaufwendiger sind.
.IP
Wenn im Statement die
.ft B
on
.ft R
-Phrase fehlt,
wird bei der Modifizierung auf isam, cisam, hash oder chash
als Schl\o'u"'ssel f\o'u"'r die Relation automatisch
die erste Dom\o'a"'ne verwendet.
Bei Modifizierung auf heap, cheap oder same
darf die
.ft B
on
.ft R
-Phrase nicht angegeben werden.
Bei Modifizierung auf heapsort oder cheapsort
ist die Angabe der
.ft B
on
.ft R
-Phrase notwendig.
.IP
Wenn eine Relation sortiert werden soll
(isam, cisam, hash, chash, heapsort und cheapsort),
sind die Prim\o'a"'rschl\o'u"'ssel der Relation in der
.ft B
on
.ft R
-Phrase in der Reihenfolge der gew\o'u"'nschten
Sortierung anzugeben,
der erstangegebene bildet den dominanten
Sortierbegriff.
Die in der
.ft B
on
.ft R
-Phrase nicht angegebenen Dom\o'a"'nen werden
danach in der erzeugten Reihenfolge
zur Sortierung herangezogen.
.IP
Bei einer Modifikation zur Speicherstruktur "same" wird
die Relation reorganisiert, d.h., die Speicherstruktur, der
Sortierschl\o'u"'ssel und deren Reihenfolge bleiben erhalten.
Nach umfangreichen \o'A"'nderungen kann die externe
Anordnung der Daten uneffektiv werden, so dass eine
Neueinrichtung bzw. Reorganisation der Schl\o'u"'sselstruktur
sinnvoll ist.
.br
(Schl\o'u"'sselbaumstruktur !)
.IP
Ein F\o'u"'llfaktor
.ft B
<fillfactor>
.ft R
spezifiziert die prozentuale F\o'u"'llung (1 ... 100)
der Prim\o'a"'rseiten (unter idealen Bedingungen)
bei Anlage der Relation durch das
.ft B
modify
.ft R
-Statement.
Dieser F\o'u"'llfaktor kann bei Modifizierung
auf isam, cisam, hash und chash angegeben werden.
Man vermeide die Angabe eines zu grossen
F\o'u"'llfaktors bei noch unfertigen Relationen.
Eine ungleichm\o'a"'ssige Verteilung des Schl\o'u"'ssels
kann bei folgenden Erweiterungen der Relation
zur Anlage von vielen \o'U"'berlaufseiten
f\o'u"'hren, wodurch sich das Zugriffsverhalten
der Relation sehr verschlechtert.
.IP
Bei Modifizierung auf hash oder chash spezifizieren
.ft B
minpage
.ft R
und
.ft B
maxpage
.ft R
die minimale und maximale Anzahl von Prim\o'a"'rseiten,
die die Relation haben soll.
Falls angegeben,
m\o'u"'ssen beide mindestens 1 sein;
.ft B
maxpage
.ft R
darf nicht kleiner als
.ft B
minpage
.ft R
sein.
.IP
Wenn nicht angegeben, werden folgende
Standardwerte eingesetzt:
.RE
.DS L
FILLFACTOR MINPAGES MAXPAGES
---------- -------- --------
hash 50 10 nach Bedarf
chash 75 1 nach Bedarf
isam 80 -- --
cisam 100 -- --
.DE
.RE
.sp 1
.ft B
BEISPIEL
.ft R
.IP
.DS L
/* Modifiziere die personal Relation
auf eine Isam-Struktur mit name als Schl\o'u"'ssel */
modify personal to isam on name
/* Wenn name die erste Dom\o'a"'ne dieser Relation ist
kann das gleiche Resultat erzielt werden durch */
modify personal to isam
/* Die gleiche Modifizierung
mit 60-prozentiger F\o'u"'llung der Prim\o'a"'rseiten */
modify personal to isam on name
where fillfactor = 60
.DE
.DS L
/* Ermittle Dienstjubilare
und ordne sie nach 10- und 25-j\o'a"'hrigen */
range of p is personal
retrieve into temp
(p.abt, p.name, dienstalter=1985-p.einstellung)
where 1985-p.einstellung = 10
or 1985-p.einstellung = 25
modify temp to heapsort on dienstalter
print temp
destroy temp
.DE
.RE
.sp 1
.ft B
SIEHE AUCH
.ft R
.IP
sysmod(unix), modifyr(unix)
.RE
.ds RH \f3PERMIT\f1
.bp
.LP
.ft B
NAME
.ft R
.IP
permit - f\o'u"'ge Berechtigungen an eine Relation an
.LP
.ft B
SYNOPSIS
.ft R
.IP
.ft B
define
.ft R
.ft B
permit
.ft R
oplist
.ft B
on
.ft R
var [ (attlist) }
.br
.ft B
to
.ft R
name [
.ft B
at
.ft R
term ] [
.ft B
from
.ft R
time
.ft B
to
.ft R
time ] [
.ft B
on
.ft R
day
.ft B
to
.ft R
day ] [
.ft B
where
.ft R
qual ]
.LP
.ft B
BESCHREIBUNG
.ft R
.IP
Das
.ft B
permit
.ft R
-Statement darf nur vom DBA f\o'u"'r DBA Relationen
gegeben werden (der DBA kann sich nicht selbst
einschr\o'a"'nken, er hat immer alle Rechte ).
.IP
Das
.ft B
permit
.ft R
-Statement erweitert die aktuellen Berechtigungen f\o'u"'r eine Relation
entsprechend der Spe\%zifikation von
.ft B
var.
.ft R
Die
.ft B
Operationsliste
.ft R
(oplist) ist eine durch Komma getrennte Liste m\o'o"'glicher
Operationen, also
.ft B
retrieve
.ft R
,
.ft B
replace
.ft R
,
.ft B
delete
.ft R
,
.ft B
append
.ft R
oder
.ft B
all.
.ft R
"all" ist ein Spezialfall, es bedeutet, dass alle Berechtigungen
gesetzt sind.
.ft B
name
.ft R
ist der login-Name eines Nutzers oder auch "all".
.ft B
term
.ft R
ist ein Terminalname der Form ttyxx oder das Schl\o'u"'sselwort "all".
Das Auslassen der Term-Phrase ist gleichbedeutend zu "all",
.ft B
xx
.ft R
kann ein implemetationsabh\o'a"'ngiger 2- oder 4- Byte langer Name sein.
.ft B
time
.ft R
ist in der Form "hh:mm" nach 24-Stunden-Modus einzugeben
und begrenzt die Zeit des Tages an der die Berechtigung gilt.
.ft B
day
.ft R
ist die Angabe des Wochentages in der Form 0 = Sonntag
bis 6 = Sonnabend.
Diese Qua\%lifikation wird an die Qualifikation der Anfrage zur
Laufzeit angeh\o'a"'ngt.
.IP
Die separaten Teile
.ft B
eines
.ft R
permit-Statements ( oplist, attlist, name, term, time- und
day-Phrase und qual ) m\o'u"'ssen gleichzeitig
zutreffen, damit das Zugriffsrecht wirksam wird.
.IP
Die Gesamtzugriffsrechte f\o'u"'r einen konkreten Nutzer
ergeben sich aus der Menge der Vereinigung aller
zutreffenden permit-Statements.
Beispielsweise wird mit
.IP
... to erich at tty4 ...
.IP
die Berechtigung f\o'u"'r Erich erteilt, wenn er am TTY4
eingeloggt ist, aber wenn wir zwei
.ft B
permit
.ft R
-Statements
.IP
... to erich at all ...
.br
... to all at tty4 ...
.IP
haben, dann wird Erich die Gesamtheit der Berechtigungen,
die durch das erste Statement gegeben sind (auch am TTYd), nutzen
k\o'o"'nnen, w\o'a"'hrend Paul alle Berechtigungen des zweiten
Statements nur am TTY4 erh\o'a"'lt.
.IP
Die Statements
.RP
.IP
define permit all on x to all
.br
define permit retrieve on x to all
.RE
.IP
mit keinen weiteren Qualifikationen werden als Spezialf\o'a"'lle
behandelt und sehr effizient aufgel\o'o"'sst.
In AMX-Programmen k\o'o"'nnen
.ft B
nur
.ft R
Relationen verarbeitet werden,
die keine definierten Zugriffsrechte besitzen mit der
Ausnahme der Spezialf\o'a"'lle
.DS L
define permit all | retrieve on x to all
.DE
ber\o'u"'cksichtigt, alle anderen werden ignoriert.
Die Vergabe von Zugriffsrechten auf Indizes und Sichten ist
nicht gestattet.
.IP
Die Qualifikation kann Bedingungen aus anderen Relationen enthalten.
.LP
.ft B
BEISPIEL
.ft R
.IP
.DS L
range of e is personal
define permit retrieve on e (name, gehalt) to erich
at ttyd from 8:00 to 17:00
on 1 to 5
where e.mgr = "marc"
range of p is parts
define permit retrieve of p to all
/*Erich wird die Berechtigung erteilt,
**\o'u"'ber die Namen der Teile aller Lieferungen
**des H\o'a"'ndlers 241 zu recherchieren*/
range of t is teile
range of l is lieferung
define permit retrieve on t(tname) to erich
where t.tnum=l.tnum and l.lnum=241
.DE
.LP
.ft B
SIEHE AUCH
.ft R
.IP
destroy(quel)
.RE
.LP
.ft B
HILFEN
.ft R
.IP
Es ist darauf zu achten, dass die Relationen, die in
Qualifikation eingegangen sind, solange nicht gel\o'o"'scht
werden, solange das Zugriffsrecht existiert.
.RE
.ds RH \f3PRINT\f1
.bp
.LP
.ft B
NAME
.ft R
.IP
print \- Ausgabe von Relationen
.RE
.sp 1
.ft B
SYNOPSIS
.ft R
.IP
.ft B
print
.ft R
relname {, relname}
.RE
.sp 1
.ft B
BESCHREIBUNG
.ft R
.IP
.ft B
print
.ft R
gibt den gesamten Inhalt der spezifizierten
Relation(en) auf das Terminal (standard_output)
aus.
Die Ausgabeformate f\o'u"'r die verschiedenen Formate
der beteiligten Dom\o'a"'nen kann man bei Start von
QUEL durch die entsprechenden Optionen (s.
.ft B
quel
.ft R
(unix)) festlegen. Die als Spalten\o'u"'berschriften
ausgegebenen Namen der Dom\o'a"'nen werden
ggf. abgek\o'u"'rzt, wenn sie anders in der Druckbreite
nicht unterzubringen sind.
.IP
Das Statement wird nur vom Eigner der Relation
oder von einem Nutzer angenommen, der f\o'u"'r sie die
Zugriffsberechtigung
.ft B
retrieve
.ft R
hat.
.RE
.sp 1
.ft B
BEISPIEL
.ft R
.IP
.DS L
/* Ausgabe der Relation personal */
print personal
.DE
.RE
.sp 1
.ft B
SIEHE AUCH
.ft R
.IP
retrieve(quel),
quel(unix), printr(unix)
.RE
.sp 1
.ft B
HILFEN
.ft R
.IP
Man vermeide die Ausgabe von zu langen Zeilen.
QUEL selbst nimmt keine Zeilenteilung (wrap around) vor.
.RE
.ds RH \f3RANGE\f1
.bp
.RE
.ft B
NAME
.ft R
.IP
range - Deklaration einer tuple_variable'n
.br
auf eine Relation
.RE
.sp 1
.ft B
SYNOPSIS
.ft R
.IP
.ft B
range
.ft R
[[
.ft B
of
.ft R
] var
.ft B
is
.ft R
relname ]
.RE
.sp 1
.ft B
BESCHREIBUNG
.ft R
.IP
.ft B
range
.ft R
wird benutzt, um eine Tupelvariable
.ft B
var
.ft R
, die in nachfolgenden QUEL-Statements benutzt werden soll,
einer Relation
.ft B
<relname>
.ft R
zuzuordnen.
Die
.ft B
var
.ft R
referenziert dann in den QUEL-Statements
jeweils ein Tupel der spezifizierten Relation.
Die Zuordnung der
.ft B
var
.ft R
zu der Relation
gilt f\o'u"'r die gesamte QUEL-Sitzung,
solange die Variable nicht durch ein anderes
.ft B
range
.ft R
-Statement einer anderen Relation zugeordnet
oder die Relation durch ein
.ft B
destroy
.ft R
-Statement gestrichen wird.
Das leere range-Statement listet die aktuelle range-Tabelle aus.
.RE
.sp 1
.ft B
BEISPIEL
.ft R
.IP
.DS L
/* Deklariere eine tuple_variable p
auf die Relation personal */
range of p is personal
.DE
.RE
.sp 1
.ft B
SIEHE AUCH
.ft R
.IP
destroy(quel)
.RE
.sp 1
.ft B
HILFEN
.ft R
.IP
Es k\o'o"'nnen nur 10 Tupelvariablen gleichzeitig
dekla\%riert werden.
Nach dem zehnten range-Statement wird durch eine folgende
Deklaration die am l\o'a"'ngsten nicht benutzte
Tupelvariable ung\o'u"'ltig.
.RE
.ds RH \f3REPLACE\f1
.bp
.RE
.ft B
NAME
.ft R
.IP
replace - Ersetzen von Attributen in einer Relation
.RE
.sp 1
.ft B
SYNOPSIS
.ft R
.IP
.ft B
replace
.ft R
var (target_list)
[\c
.ft B
where
.ft R
qual]
.RE
.sp 1
.ft B
BESCHREIBUNG
.ft R
.IP
.ft B
replace
.ft R
\o'a"'ndert Werte in den Dom\o'a"'nen, die in der
.ft B
<target_list>
.ft R
angegeben sind f\o'u"'r alle die Tupel, die sich
entsprechend der
.ft B
where
.ft R
-Phrase qualifizieren.
Die
.ft B
var
.ft R
muss in einem vorangehend gegebenem
.ft B
range
.ft R
-Statement \o'u"'ber der zu \o'a"'ndernden Relation
deklariert worden sein.
Ausschliesslich die Dom\o'a"'nen, die modifiziert werden sollen,
m\o'u"'ssen in der
.ft B
<target_list>
.ft R
aufgez\o'a"'hlt werden.
Diese Dom\o'a"'nen k\o'o"'nnen durch Namensangabe bei Zuweisung
eines Ausdrucks, oder durch
Namensanalogie spezifiziert werden.
Attribute in ge\o'a"'nderten Tupeln,
deren Dom\o'a"'ne in der
.ft B
<target_list>
.ft R
nicht aufgef\o'u"'hrt sind,
bleiben unver\o'a"'ndert.
.IP
Attributen numerischer Dom\o'a"'nen kann ein beliebiger
nume\%rischer Wert zugewiesen werden, es erfolgt eine
automatische Konvertierung. Bei der Zuweisung von
Zeichenketten auf Attribute numerischer Dom\o'a"'nen oder
numerischer Werte auf Attribute von Zeichenketten\-Dom\o'a"'nen
muss die Konvertierung durch Verwendung der
entsprechenden Funktionen
.ft B
ascii,
.ft R
.ft B
int1,
.ft R
.ft B
int2,
.ft R
u.s.w.
in der
.ft B
<target_list>
.ft R
angewiesen werden.
.IP
Das Statement wird nur vom Eigner der Relation angenommen,
oder von einem Nutzer, der
eine Zugriffsberechtigung
f\o'u"'r die Relation hat.
.RE
.sp 1
.ft B
BEISPIEL
.ft R
.IP
.DS L
/* Alle Besch\o'a"'ftigten des Leiters "Rose, Peter"
**erhalten eine Gehaltserh\o'o"'hung von 10 % */
range of p is personal
replace p(gehalt=1.1 * p.gehalt)
where p.abt="Rose, Peter"
.DE
.RE
.sp 1
.ft B
SIEHE AUCH
.ft R
.IP
range(quel)
.RE
.sp 1
.ft B
NACHRICHTEN
.ft R
.IP
Bei Zuweisung eines numerischen Wertes auf das Attribut
einer Zeichenketten\-Dom\o'a"'ne oder einer Zeichenkette
auf das Attribut einer numerischen Dom\o'a"'ne
erfolgen Fehlermeldungen.
.RE
.ds RH \f3RETRIEVE\f1
.bp
.RE
.ft B
NAME
.ft R
.IP
retrieve - Suche von Tupeln
.RE
.sp 1
.ft B
SYNOPSIS
.ft R
.IP
.ft B
retrieve
.ft R
[[\c
.ft B
into
.ft R
]relname](target_list)
[\c
.ft B
where
.ft R
qual]
.IP
.ft B
retrieve
.ft R
unique (target_list) [
.ft B
where
.ft R
qual]
.RE
.sp 1
.ft B
BESCHREIBUNG
.ft R
.IP
.ft B
retrieve
.ft R
sucht Tupel mit den Dom\o'a"'nen, wie sie in der
.ft B
<target_list>
.ft R
spezifiziert sind und die den Bedingungen
der
.ft B
where
.ft R
-Phrase gen\o'u"'gen
und gibt sie auf dem Terminal (standard_output) aus
oder speichert sie im Falle von
.ft B
into
.ft R
in die angegebene Relation
.ft B
<relname>.
.ft R
.IP
Wenn
.ft B
<relname>
.ft R
spezifiziert ist, wird eine neue Relation erzeugt, die
in der aufliegenden Datenbank noch nicht
existieren darf.
Beachte, dass verschiedene Nutzer Relationen
gleichen Namens erzeugen d\o'u"'rfen; \*(yy\
erg\o'a"'nzt den Relationennamen um einen, den
erzeugenden Nutzer charakterisierenden Code
(s. auch
.ft B
create
.ft R
(quel).
Der Nutzer wird Eigent\o'u"'mer der Relation.
Die Relation erh\o'a"'lt die, in der
.ft B
<target_list>
.ft R
spezifizierten Dom\o'a"'nen.
Die Relation wird f\o'u"'r 7 Tage reserviert,
falls der Nutzer nicht folgend durch
ein
.ft B
save
.ft R
-Statement die Lebensdauer der Relation ver\o'a"'ndert.
Die Relation wird mit dem Ergebnis des
.ft B
retrieve
.ft R
-Statements gef\o'u"'llt.
.IP
Wenn das Schl\o'u"'sselwort
.ft B
unique
.ft R
spezifiert wird, werden die Tupel nach der Reihenfolge der
angegebenen Dom\o'a"'nen sortiert und doppelte Tupel vor der
Anzeige entfernt.
.IP
Die Resultat\-Relation wird standardm\o'a"'ssig
in
.ft B
cheapsort
.ft R
\-Speicherstruktur
(s.
.ft B
modify
.ft R
(quel))
erzeugt.
Sie wird dadurch nach den Dom\o'a"'nen,
in der Reihenfolge, wie diese in der
.ft B
<target_list>
.ft R
aufgez\o'a"'hlt sind, sortiert
und enth\o'a"'lt keine doppelten Tupel mehr.
.IP
Ist eine andere Speicherstruktur f\o'u"'r die
Resultat\-Relation erw\o'u"'nscht, kann das bei Start
der \*(yy\-Sitzung durch Verwendung der -\c
.ft B
r
.ft R
-Option (s.
.ft B
quel
.ft R
(unix)) erreicht werden.
.IP
Wenn im Statement die
.ft B
into
.ft R
-Phrase fehlt, (also kein
.ft B
<relname>
.ft R
angegeben ist,) erscheint das Resultat des
.ft B
retrieve
.ft R
einmalig auf dem Terminal, es kann nur durch
ein erneutes
.ft B
retrieve
.ft R
wieder sichtbar gemacht werden.
Die Sortierung der ausgegebenen Tupel
folgt den Regeln der Zerlegung der
.ft B
where
.ft R
-Phrase, doppelte Tupel werden nicht
unterdr\o'u"'ckt.
.IP
Die Druckformate, in denen Attribute von Dom\o'a"'nen
der verschiedenen Formate dargestellt werden sollen,
k\o'o"'nnen mit den entsprechenden Optionen
bei Start von \*(yy\ eingestellt werden (s.
.ft B
quel
.ft R
(unix)).
.IP
In der
.ft B
<target_list>
.ft R
kann das Schl\o'u"'sselwort
.ft B
all
.ft R
benutzt werden, wenn von einer Relation
alle Dom\o'a"'nen gesucht werden sollen.
.IP
Das Statement wird nur vom Eigent\o'u"'mer der beteiligten Relation(en)
angenommen, oder von Nutzern, die f\o'u"'r sie die
Zugriffsberechtigung
.ft B
retrieve
.ft R
haben.
.RE
.sp 1
.ft B
BEISPIEL
.ft R
.IP
.DS L
/* Finde alle Mitarbeiter, die j\o'u"'nger sind, als das
Durchschnittsalter aller Mitarbeiter betr\o'a"'gt */
range of p is personal
retrieve (p.name)
where 1985-p.gebjahr <= avg(1985-p.gebjahr)
/* Finde alle Besch\o'a"'ftigten, die \o'a"'lter
sind, als ihr Leiter */
range of mitarbeiter is personal
range of leiter is personal
retrieve (mitarbeiter.name)
where mitarbeiter.leiter = leiter.num
and mitarbeiter.gebdat > leiter.gebdat
.DE
.RE
.sp 1
.ft B
SIEHE AUCH
.ft R
.IP
modify(quel), quel(unix), range(quel),
save(quel)
.RE
.ds RH \f3SAVE\f1
.bp
.RE
.ft B
NAME
.ft R
.IP
save - Reservierung einer Relation bis zu einem Datum
.RE
.sp 1
.ft B
SYNOPSIS
.ft R
.IP
.ft B
save
.ft R
relname
.ft B
until
.ft R
month day year
.RE
.sp 1
.ft B
BESCHREIBUNG
.ft R
.IP
.ft B
save
.ft R
wird benutzt, um das Verfallsdatum einer Relation
zu ver\o'a"'ndern,
das
bei ihrer Erzeugung standardm\o'a"'ssig auf 7 Tage
festgelegt wird.
.IP
.ft B
<month>
.ft R
ist der Monat (1,2,..12),
.ft B
<day>
.ft R
ist der Tag (1,2,..31) und
.ft B
<year>
.ft R
ist das Jahr (1985,1986,...)
des neuen Verfallsdatums.
Die Verfallsstunde wird auf 0 Uhr gesetzt.
.IP
Das Streichen einer Relation,
deren Reservierungszeit abgelaufen ist,
erfolgt mit dem Programm
.ft B
purge
.ft R
(s.
.ft B
purge
.ft R
(unix)).
Es erfolgt also nicht automatisch,
sondern nach entsprechenden technologischen
Regelungen \o'u"'ber die Arbeit mit
.ft B
purge.
.ft R
.IP
Ausschliesslich der Eigent\o'u"'mer einer Relation
kann deren Verfallsdatum ver\o'a"'ndern.
.IP
Die Systemrelationen (relation, attribute, indexes usw.)
haben kein Verfallsdatum.
.RE
.sp 1
.ft B
BEISPIEL
.ft R
.IP
.DS L
/* Reserviere die personal Relation
bis Ende Februar 1987 */
save personal until 3 1 1987
.DE
.RE
.sp 1
.ft B
SIEHE AUCH
.ft R
.IP
create(quel),
retrieve(quel),
purge(unix),
saver(unix)
.RE
.ds RH \f3VIEW\f1
.bp
.LP
.ft B
NAME
.ft R
.IP
view - definiere eine virtuelle Relation
.LP
.ft B
SYNOPSIS
.ft R
.IP
.ft B
define view
.ft R
relname (target-list) [
.ft B
where
.ft R
qual ]
.LP
.ft B
BESCHREIBUNG
.ft R
.IP
Eine virtuelle Relation oder Sicht hat im Gegensatz
zu einer normalen Relation (create(quel)) keine
physische Repr\o'a"'sentation, das heisst, keine eigenen
Daten. Die Sicht er\o'o"'ffnet anwenderbezogen neue
Interpretationen existierender Datenbest\o'a"'nde
( Basisrelationen ).
.IP
Die Syntax des
.ft B
view
.ft R
-Statements ist der Syntax des
.ft B
retrieve into
.ft R
-Statements angelehnt.
Im Gegensatz zum
.ft B
retrieve into
.ft R
Statement werden keine Daten recherchiert, sondern nur
die Recherchen-Definition \o'u"'bersetzt gespeichert.
Wenn die Relation
.ft B
relname
.ft R
sp\o'a"'ter genutzt wird, wird die Anfrage um die Definition
der Sicht erweitert.
.IP
Alle Formen eines retrieve's auf eine Sicht werden
unterst\o'u"'tzt, aber nur eine begrenzte Anzahl von \o'A"'nderungen.
.RS
.IP 1.
\o'A"'nderungen werden nicht unterst\o'u"'tzt, wenn
die Sicht mehrere Relationen umspannt.
.IP 2.
Es werden keine \o'A"'nderungen unterst\o'u"'tzt, die
auf Dom\o'a"'nen ausgef\o'u"'hrt werden sollen, die a) in der
Quali\%fikation des
.ft B
define-view
.ft R
\-Statements enthalten sind
oder b) nicht in einfache Dom\o'a"'nen \o'u"'berf\o'u"'hrt
werden k\o'o"'nnen.
.IP 3.
Allgemein werden \o'A"'nderungen unterst\o'u"'tzt, wenn garantiert werden
kann (ohne Nutzung der aktuellen Daten), dass das Ergebnis
der \o'A"'nderungen der Sicht identisch zu \o'A"'nderungen der
Basisrelation ist.
.RE
.IP
Die Basisrelationen m\o'u"'ssen nicht notwendigerweise
vom Eigent\o'u"'mer der Sicht angeeignet sein.
Nutzer, die nicht der DBA sind, erhalten die M\o'o"'glichkeit,
DBA-Relationen in ihre Sichten einzuschliessen.
Vom System wird garantiert, dass Basisrelationen nicht
gel\o'o"'scht werden.
.RS
.IP zu_2a
.DS L
range of b is base
define view v ( b.all ) where b.dom = 4
append to v ( dom = 5 )
.DE
Das f\o'u"'hrt dazu, dass das Tupel in die
Basisrelation eingef\o'u"'gt wird, ohne dass es
Bestandteil der Sicht wird. Die Anomalie besteht
darin, dass Tupel eingef\o'u"'gt werden k\o'o"'nnen, die
nicht angezeigt werden, weil die Qualifikation nicht
erf\o'u"'llt ist.
.IP zu_2b
.DS L
range of b is base
define view v ( dom = b.dom / 3 )
append to v (dom = 7)
.DE
Dieses append wird in ein append auf ein
physisches append folgender Art \o'u"'bersetzt:
.DS L
append to base ( dom / 3 = 7 )
.DE
Dieses append ist im Sinne von QUEL nicht akzeptabel.
.IP zu_3:
.DS L
range of b1 is base1
range of b2 is base2
define view v (b1.a, b2.c) where b1.b = b2.b
.DE
Datenbestand:
.DS L
base1 | a | b base2 | b | c v | a | c
~~~~~~|~~~~|~~~~ ~~~~~~|~~~~|~~~~ ~~~|~~~~|~~~~
| 7 | 0 | 0 | 3 | 7 | 3
| 8 | 0 | 0 | 4 | 7 | 4
| | | | | 8 | 3
| | | | >| 8 | 4 <
range of v is v
delete v where v.a = 8 and v.c = 4
.DE
Dieses Statement versucht, die markierte Zeile zu
l\o'o"'schen, was physisch auf den Basisrelationen
base1 und base2 nicht ausf\o'u"'hrbar ist.
.RE
.LP
.ft B
BEISPIEL
.ft R
.IP
.DS L
range of e is employee
range of d is dept
define view empdpt (ename=e.name,e.sal,dname=d.name)
where e.mgr=d.mgr
.DE
.LP
.ft B
SIEHE AUCH
.ft R
.IP
retrieve(quel), destroy(quel)
.RE