Das folgende Programmskelett gibt einen Überblick über die wichtigsten Klauseln und Anweisungen, die COBOL2000 für die Verarbeitung indizierter Dateien zur Verfügung stellt. Die wesentlichen Angaben werden im Anschluss daran kurz erläutert:
IDENTIFICATION DIVISION. ... ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT interner-dateiname ASSIGN TO externer-name ORGANIZATION IS INDEXED ACCESS MODE IS zugriffsart RECORD KEY IS primärschlüssel ALTERNATE RECORD KEY IS sekundärschlüssel FILE STATUS IS statusfelder. ... DATA DIVISION. FILE SECTION. FD interner-dateiname. BLOCK CONTAINS blocklängenangabe RECORD satzlängenangabe ... 01 datensatz. nn feld-1 typ&länge ... nn primärschlüssel-feld typ&länge nn sekundärschlüssel-feld typ&länge ... PROCEDURE DIVISION. ... OPEN open-modus interner-dateiname ... START interner-dateiname ... READ interner-dateiname ... REWRITE datensatz ... WRITE datensatz ... DELETE interner-dateiname ... CLOSE interner-dateiname ... STOP RUN.
SELECT interner-dateiname
legt den Namen fest, unter dem die Datei in der Übersetzungseinheit angesprochen wird. interner-dateiname muss ein gültiges Programmiererwort sein.
Das Format der SELECT-Klausel erlaubt auch die Angabe OPTIONAL für Eingabedateien, die beim Programmablauf nicht unbedingt vorhanden sein müssen.
Ist einem mit SELECT OPTIONAL vereinbarten Dateinamen beim Programmablauf keine Datei zugewiesen, so wird
bei OPEN INPUT im Dialogbetrieb der Programmablauf mit der Meldung COB9117 unterbrochen und ein ADD-FILE-LINK-Kommando angefordert, im Stapelbetrieb dieAT END-Bedingung ausgelöst,
bei OPEN I-O oder OPEN EXTEND eine Datei mit dem Namen FILE.COBOL.linkname angelegt.
ASSIGN TO externer-name
gibt die Systemdatei an, die der Datei zugewiesen wird, oder legt den Linknamen fest, über den eine katalogisierte Datei zugeordnet werden kann.
externer-name muss entweder
ein zulässiges Literal,
ein in der DATA DIVISION definierter zulässiger Datenname oder
ein gültiger Herstellername
aus dem Format der ASSIGN-Klausel sein (siehe Handbuch „COBOL2000-Sprachbeschreibung“ [ 1]).
ORGANIZATION IS INDEXED
legt fest, dass die Datei indiziert organisiert ist.
ACCESS MODE IS zugriffsart
bestimmt die Art, in der auf die Sätze zugegriffen werden kann.
Für zugriffsart sind folgende Angaben möglich (siehe auch Abschnitt „Eröffnungsarten und Verarbeitungsformen (indizierte Dateien)"):
SEQUENTIAL | legt fest, dass die Sätze nur sequenziell verarbeitet werden. |
RANDOM | vereinbart, dass auf die Sätze nur wahlfrei zugegriffen wird. |
DYNAMIC | gestattet, dass auf die Sätze wahlweise sequenziell oder wahlfrei zugegriffen wird. |
Die ACCESS MODE-Klausel ist optional. Wird sie nicht angegeben, nimmt der Compiler ACCESS MODE IS SEQUENTIAL an.
RECORD KEY IS primärschlüssel
gibt das Feld innerhalb des Datensatzes an, das den primären Satzschlüssel enthält.
primärschlüssel muss als Datenfeld innerhalb der zugehörigen Datensatzerklärung vereinbart werden (siehe unten).
Außer beim sequenziellen Lesen muss primärschlüssel vor jeder Ein-/Ausgabeanweisung mit dem Primärschlüssel des Satzes versorgt werden, der bearbeitet werden soll.
ALTERNATE RECORD KEY IS sekundärschlüssel
Mit COBOL-Programmen können auch Dateien verarbeitet werden, deren Datensätze außer dem obligatorischen Primärschlüssel (RECORD KEY)
einen oder mehrere Sekundärschlüssel (ALTERNATE RECORD KEY) enthalten.Sind in einer Datei Sekundärschlüssel definiert, kann der Benutzer auf die Datensätze entweder über den Primärschlüssel oder über den/die Sekundärschlüssel zugreifen.
sekundärschlüssel muss als Datenfeld innerhalb der zugehörigen Datensatzerklärung vereinbart werden (siehe unten).
FILE STATUS IS statusfelder
gibt die Datenfelder an, in denen das Laufzeitsystem nach jedem Zugriff auf die Datei Informationen darüber hinterlegt,
ob die Ein-/Ausgabeoperation erfolgreich war und
welcher Art ggf. die dabei aufgetretenen Fehler sind.
Die statusfelder müssen in der WORKING-STORAGE oder der LINKAGE SECTION vereinbart werden. Ihr Format und die Bedeutung der einzelnen Zustandscodes werden in Abschnitt „Ein-/Ausgabezustände" beschrieben.
Die FILE STATUS-Klausel ist optional. Wird sie nicht angegeben, stehen dem Programm die oben erwähnten Informationen nicht zur Verfügung.
BLOCK CONTAINS blocklängenangabe
legt die maximale Größe eines logischen Blocks fest. Sie bestimmt, wie viele Datensätze jeweils gemeinsam durch eine Ein-/Ausgabeoperation in den bzw. aus dem Puffer des Programms übertragen werden sollen.
blocklängenangabe muss dabei eine zulässige Angabe aus dem Format derBLOCK CONTAINS-Klausel sein.
Die Blockung von Datensätzen verringert
die Zahl der Zugriffe auf periphere Speicher und damit die Laufzeit des Programms und
die Zahl der Blockzwischenräume auf dem Speichermedium und damit den physischen Platzbedarf der Datei.
Andererseits wird bei Zugriffen mit Sperrmechanismus im Verlauf einer Simultanverarbeitung (siehe Abschnitt „Simultanverarbeitung von Dateien (SHARED-UPDATE)") stets der gesamte Block gesperrt, in dem sich der aktuelle Satz befindet. Ein großer Blockungsfaktor führt in diesem Fall daher zu Einbußen an Verarbeitungsgeschwindigkeit.
Der Compiler errechnet bei der Übersetzung aus den Angaben in der Übersetzungseinheit über Block-und Satzlänge einen Wert für die Puffergröße, der vom Laufzeitsystem für das DVS auf das nächstgrößere Vielfache eines PAM-Blocks (2048 Byte) aufgerundet wird. Diese Voreinstellung kann bei der Dateizuweisung durch die Angabe des BLKSIZE-Operanden im ADD-FILE-LINK-Kommando verändert werden (siehe Abschnitt „Festlegen von Dateimerkmalen"), wobei darauf zu achten ist, dass der Puffer mindestens so groß sein muss wie der längste Datensatz.
Außer bei neu angelegten Dateien (OPEN OUTPUT) hat die im Katalog eingetragene Blockgröße stets Vorrang gegenüber den Blockgrößenangaben im Programm bzw. im ADD-FILE-LINK-Kommando.
Die BLOCK CONTAINS-Klausel ist optional. Wird sie nicht angegeben, nimmt der Compiler BLOCK CONTAINS 1 RECORD an, d.h. die Datensätze werden nicht geblockt.
RECORD satzlängenangabe
legt fest, ob Sätze fester oder variabler Länge verarbeitet werden sollen und
bestimmt bei Sätzen variabler Länge einen Bereich für die zulässigen Satzgrößen und, falls im Format angegeben, ein Datenfeld zur Aufnahme der jeweils aktuellen Satzlängeninformation.
Die satzlängenangabe muss einem der drei Formate der RECORD-Klausel entsprechen, die COBOL2000 zur Verfügung stellt. Sie darf nicht im Widerspruch zu den Satzlängen stehen, die der Compiler aus den Angaben der dazugehörigen Datensatzerklärung(en) errechnet.
Die RECORD-Klausel ist optional. Wird sie nicht angegeben, nimmt der Compiler Sätze variabler Länge an.
01 datensatz. nn feld-1 typ&länge ... nn primärschlüssel typ&länge ... nn sekundärschlüssel typ&länge
stellt eine Datensatzerklärung für die zugehörige Datei dar. Sie beschreibt den logischen Aufbau von Datensätzen.
Für jede Datei ist mindestens eine Datensatzerklärung erforderlich. Werden für eine Datei mehrere Datensatzerklärungen angegeben, ist das vereinbarte Satzformat zu beachten:
Bei Sätzen fester Länge müssen alle Satzerklärungen die gleiche Größe haben,
bei Sätzen variabler Länge dürfen sie nicht im Widerspruch zur Satzlängenangabe der RECORD-Klausel stehen. Darüberhinaus muss auch die Datensatzerklärung mit der kleinsten Satzlänge den Satzschlüssel noch ganz enthalten.
Mindestens eine der Datensatzerklärungen muss das Primärschlüsselfeld explizit als Teilfeld von datensatz vereinbaren. Für typ&länge sind die erforderlichen Längen- und Formatvereinbarungen (PICTURE- und USAGE-Klauseln etc.) einzusetzen (primärschlüssel darf bis zu 255 Byte lang sein).
sekundärschlüssel ist der Datenname aus der entsprechenden ALTERNATE RECORD KEY-Klausel. Jedes Sekundärschlüssel-Feld darf maximal 127 Byte lang sein. Überlappungen mit dem Primärschlüssel oder weiteren Sekundärschlüsseln sind zulässig, sofern zwei Schlüsselfelder nicht an derselben Stelle beginnen. Der COBOL2000-Compiler lässt auch rein numerisch (PIC 9) oder alphabetisch (PIC A) definierte Sekundärschlüssel zu.
Für alle anderen Datensatzerklärungen zu dieser Datei ist die Unterteilung von datensatz in Teilfelder (feld-1, feld-2,...) optional.
OPEN open-modus interner-dateiname
eröffnet die Datei in der angegebenen Eröffnungsart open-modus für die Verarbeitung.
Für open-modus sind folgende Angaben möglich:
INPUT | eröffnet die Datei als Eingabedatei; sie kann nur gelesen werden |
OUTPUT | eröffnet die Datei als Ausgabedatei; sie kann nur neu geschrieben werden. |
EXTEND | eröffnet die Datei als Ausgabedatei; sie kann erweitert werden. |
I-O | eröffnet die Datei als Ein-/Ausgabedatei; sie kann (Satz für Satz) gelesen, aktualisiert und zurückgeschrieben werden. |
Die Angabe für open-modus legt fest, mit welchen Ein-/Ausgabeanweisungen auf die Datei zugegriffen werden darf (siehe Abschnitt „Eröffnungsarten und Verarbeitungsformen (indizierte Dateien)").
START interner-dateiname READ interner-dateiname REWRITE datensatz WRITE datensatz DELETE interner-dateiname
sind Ein-/Ausgabeanweisungen für die Datei, die jeweils
in der Datei auf einen Satz positionieren bzw.
einen Satz lesen bzw.
einen Satz zurückschreiben bzw.
einen Satz schreiben bzw.
einen Satz löschen
Welche dieser Anweisungen für die Datei zulässig sind, hängt von der Eröffnungsart ab, die in der OPEN-Anweisung vereinbart wird. Dieser Zusammenhang wird in Abschnitt „Eröffnungsarten und Verarbeitungsformen (indizierte Dateien)" beschrieben.
CLOSE interner-dateiname
beendet die Verarbeitung der Datei.
Durch die zusätzliche Angabe WITH LOCK kann ein erneutes Eröffnen der Datei im selben Programmlauf verhindert werden.