Funktion
Durch die READ-Anweisung wird dem Programm
bei sequenziellem Zugriff der nächste Datensatz einer Datei (für sequenzielle, relative und indizierte Dateiorganisation),
bei wahlfreiem Zugriff (für relative und indizierte Dateiorganisation) ein durch den Schlüssel festgelegter Datensatz einer Datei
zur Verfügung gestellt.
Format 1 | sequenzieller Dateizugriff. Gilt für sequenziell organisierte Dateien und wird bei relativer und indizierter Dateiorganisation mit sequenziellem oder dynamischem Zugriffsmodus verwendet, um Datensätze sequenziell zu lesen. | |
Format 2 | wahlfreier Dateizugriff. |
Die Formaterweiterung (WITH NO LOCK) für beide Formate, die bei der Simultanverarbeitung wirksam wird, ist im Handbuch „COBOL2000 Benutzerhandbuch“ [1] beschrieben.
Format 1 sequenzieller Dateizugriff
READ dateiname [WITH NO LOCK] {NEXT | PREVIOUS } RECORD [INTO bezeichner]
[AT END unbedingte-anweisung-1]
[NOT AT END unbedingte-anweisung-2]
[END-READ]
Syntaxregeln
In der READ-Anweisung bezieht sich das Empfangsfeld auf denselben Speicherbereich wie die Datensatzbeschreibung.
Falls keine USE-Prozedur für die Datei vorhanden ist, muss AT END in der READ-Anweisung angegeben werden.
PREVIOUS darf nur bei indizierter oder relativer Dateiorganisation angegeben werden.
Wenn im FILE-CONTROL-Paragrafen für die Datei ACCESS MODE RANDOM eingetragen ist, dürfen die Klauseln der Klauseln AT END, NOT AT END, NEXT und PREVIOUS nicht angegeben werden.
Wenn im FILE-CONTROL-Paragrafen für die Datei ACCESS MODE SEQUENTIAL eingetragen und weder NEXT noch PREVIOUS angegeben ist, wird NEXT angenommen.
Wenn die folgenden Bedingungen gleichzeitig erfüllt sind, wird NEXT angenommen:
Im FILE-CONTROL-Paragrafen ist für die Datei ACCESS MODE DYNAMIC eingetragen.
Weder NEXT noch PREVIOUS ist angegeben.
AT END oder NOT AT AND ist angegeben.
Allgemeine Regeln
Für sequenzielle, relative und indizierte Dateiorganisation gilt:
Bevor eine READ-Anweisung für eine Datei durchgeführt werden kann, muss eine OPEN-Anweisung mit der Angabe INPUT oder I-O vorausgegangen sein.
Die Ausführung der READ-Anweisung bewirkt, dass der Inhalt des Datenfeldes einer für diese Datei vorhandenen FILE STATUS-Klausel aktualisiert wird (siehe „FILE STATUS-Klausel").
Sind die Datensätze einer Datei mit mehr als einer Datensatzerklärung beschrieben, teilen sich diese Sätze automatisch denselben Speicherbereich; dies entspricht einer impliziten Redefinition des Speicherbereichs. Die Inhalte aller Datenfelder, die außerhalb der Grenzen des aktuellen Datensatzes liegen, sind nach der Ausführung der READ-Anweisung undefiniert.
INTO kann angegeben werden,
wenn der Dateierklärung nur eine Datensatzbeschreibung untergeordnet ist
wenn sowohl alle Datensatznamen, die dateiname zugeordnet sind, als auch das durch bezeichner repräsentierte Datenfeld Datengruppen oder alphanumerische Datenfelder sind.
Falls nach einer READ-Anweisung ohne INTO-Angabe der Eingabebereich explizit angesprochen werden soll, ist der Benutzer für die Verwendung der richtigen (d.h. der Länge des eingelesenen Datensatzes entsprechenden) Datensatzerklärung verantwortlich.
Tritt keine Ausnahme-Bedingung auf, ist der Satz im Satzbereich verfügbar und eine implizite Übertragung auf Grund der INTO-Angabe wird ausgeführt.
Die Fortsetzung des Ablaufs der READ-Anweisung hängt davon ab, ob AT END oder NOT AT END angegeben ist (siehe Abschnitt „Ende-Bedingung").
Nach einer erfolglosen READ-Anweisung sind der Inhalt des zur Datei gehörenden Eingabebereichs sowie der Dateipositionsindikator undefiniert und der Ein-/Ausgabestatus zeigt an, dass kein gültiger nächster Satz zur Verfügung gestellt wurde.
Wenn die Anzahl der Zeichenpositionen eines gelesenen Datensatzes kleiner ist als die kleinste in den Datensatzbeschreibungen angegebene Länge, ist der Teil der Satzbereiches, der rechts vom letzten gültigen gelesenen Zeichen steht, undefiniert. Ist die Anzahl der Zeichenpositionen größer als die größte in den Datensatzbeschreibungen angegebene Länge, wird der Datensatz rechts von der maximalen Länge abgeschnit-ten. In beiden Fällen war die Leseoperation erfolgreich, aber es wird ein FILE STATUS-Wert gesetzt, der einen Satzlängenkonflikt anzeigt.
Die Ausführung einer READ-Anweisung mit INTO-Angabe ist gleichbedeutend mit:
READ dateiname
MOVE datensatzname TO bezeichnerDie Übertragung findet entsprechend den Regeln für die MOVE-Anweisung ohne CORRESPONDING-Angabe statt.
Der Datensatz steht nach Ausführung der READ-Anweisung mit INTO-Angabe sowohl im Eingabebereich als auch im durch bezeichner festgelegten Bereich zur Verfügung. Die Länge des Sendefeldes ist durch die Länge des eingelesenen Datensatzes bestimmt (siehe „RECORD-Klausel"). Enthält der Dateibeschreibungseintrag eine RECORD IS VARYING-Klausel, ist die implizit durchgeführte Übertragung eine Gruppenübertragung. Die implizite MOVE-Anweisung wird nicht durchgeführt, wenn die Ausführung der READ-Anweisung erfolglos war. Die Berechnung der Subskripte für bezeichner findet nach Ausführung der READ-Anweisung und unmittelbar vor der Übertragung statt.Der Dateipositionsindikator bestimmt, ob ein Satz geliefert wird und ggf. welcher Satz geliefert wird:
Wenn der Dateipositionsindikator „ungültig“ anzeigt, ist die READ-Anweisung erfolglos.
Wenn der Dateipositionsindikator durch eine vorausgehende OPEN- oder START-Anweisung gesetzt worden ist, wird folgendes Ergebnis geliefert:
Falls explizit oder implizit NEXT angegeben wurde, wird der erste Satz der Datei mit einer Satznummer oder einem Satzschlüssel ≥ Dateipositionsindikator geliefert.
Falls PREVIOUS angegeben wurde, wird der erste Satz der Datei mit einer Satznummer oder einem Satzschlüssel ≤ Dateipositionsindikator geliefert.
Anmerkung:
Nach OPEN liefert READ PREVIOUS bei relativen Dateien den ersten Satz, bei indizierten Dateien normalerweise die Ende-Bedingung.Wenn der Dateipositionsindikator durch eine vorausgehende READ-Anweisung gesetzt worden ist, wird folgendes Ergebnis geliefert:
Falls explizit oder implizit NEXT angegeben wurde, wird der erste Satz der Datei mit einer Satznummer oder einem Satzschlüssel > Dateipositionsindikator geliefert.
Falls PREVIOUS angegeben wurde, wird der erste Satz der Datei mit einer Satznummer oder einem Satzschlüssel < Dateipositionsindikator geliefert.
Wenn ein Satz geliefert wird, steht er im Satzbereich der Datei dateiname zur Verfügung. Der Dateipositionsindikator wird auf die Satznummer bzw. auf den Satzschlüssel gesetzt. Wenn kein Satz geliefert wird, zeigt der Dateipositionsindikator „ungültig“ und an und es wird entsprechend Regel 5 verfahren.
Für sequenzielle Dateiorganisation gilt außerdem:
Nach Auftreten der Ende-Bedingung darf für diese Datei keine READ-Anweisung gegeben werden, bevor nicht eine erfolgreiche CLOSE-Anweisung, gefolgt von einer erfolgreichen OPEN-Anweisung, durchgeführt wurde.
Falls das physische Ende einer Spule während der Ausführung einer READ-Anweisung für eine auf mehreren Datenträgern gespeicherte Datei erkannt wird, finden die folgenden Operationen statt:
Die Standarddatenträger-Endekennsatzroutinen und, falls eine entsprechende USE-Prozedur vorliegt, die Benutzerdatenträger-Endekennsatzroutinen werden durchlaufen. Dabei wird die Reihenfolge der Durchführung der beiden Prozeduren von den USE-Prozeduren festgelegt.
Ein Datenträgerwechsel findet statt.
Die Standard- und, falls angegeben, Benutzer-Anfangskennsatzroutinen werden ausgeführt. Wieder wird die Reihenfolge der Ausführung von den Angaben der USE-Prozedur festgelegt.
Für relative und indizierte Dateiorganisation gilt außerdem:
Wenn RELATIVE KEY angegeben ist, bewirkt die READ-Anweisung die Übertragung der relativen Satznummer des verfügbaren Satzes in das Datenfeld des relativen Satzschlüssels, entsprechend den Regeln für die MOVE-Anweisung.
Nach Auftreten der Ende-Bedingung darf für diese Datei keine READ-Anweisung gegeben werden, bevor nicht entweder mit START neu positioniert wurde oder die Datei erfolgreich geschlossen und wieder geöffnet wurde.
In einer indizierten Datei mit sequenziellem Zugriff ist die Reihenfolge der Datensätze, deren Schlüssel Duplikate zulässt, festgelegt durch die Reihenfolge, in der diese doppelten Schlüsselwerte durch WRITE- bzw REWRITE-Anweisungen erzeugt wurden. Beim Lesen mit explizitem oder impliziten NEXT beginnt das Lesen mit dem zuerst geschriebenen Satz, bei PREVIOUS mit dem zuletzt geschriebenen Satz.
Format 2 wahlfreier Dateizugriff
READ dateiname [WITH NO LOCK] RECORD [INTO bezeichner]
[KEY IS datenname]
[INVALID KEY unbedingte-anweisung-1]
[NOT INVALID KEY unbedingte-anweisung-2]
[END-READ]
Syntaxregeln
In der READ-Anweisung bezieht sich das Empfangsfeld auf denselben Speicherbereich wie die Datensatzbeschreibung.
Falls keine USE-Prozedur für die Datei vorhanden ist, muss INVALID KEY angegeben werden.
Die Angabe
KEY IS datenname
darf nur bei indizierter Dateiorganisation angegeben werden.datenname muss der Name eines für diese Datei erklärten RECORD KEY oder ALTERNATE RECORD KEY-Datenfeldes sein.
datenname darf gekennzeichnet sein.
Allgemeine Regeln
Bevor eine READ-Anweisung für eine Datei durchgeführt werden kann, muss eine OPEN-Anweisung mit der Angabe INPUT oder I-O vorausgegangen sein.
Falls eine Datei mehr als einen logischen Satztyp enthält, teilen sich diese Datensätze automatisch den gleichen Speicherbereich; dies entspricht einer impliziten Redefinition des Speicherbereichs.
Die INTO-Angabe kann in folgenden Fällen gemacht werden:
wenn der Dateierklärung nur eine Datensatzbeschreibung untergeordnet ist
wenn sowohl alle Datensatznamen, die dateiname zugeordnet sind, als auch das durch bezeichner repräsentierte Datenfeld Datengruppen oder alphanumerische Datenfelder sind.
Die Ausführung einer READ-Anweisung mit der INTO-Angabe ist gleichbedeutend mit:
READ dateiname
MOVE datensatzname TO bezeichnerDie Übertragung findet entsprechend den Regeln für die MOVE-Anweisung ohne CORRESPONDING-Angabe statt. Der Datensatz steht nach Ausführung der READ-Anweisung mit INTO-Angabe sowohl im Eingabebereich als auch im durch bezeichner festgelegten Bereich zur Verfügung. Die Länge des Sendefeldes ist durch die Länge des eingelesenen Datensatzes bestimmt (siehe „RECORD-Klausel").War die READ-Anweisung nicht erfolgreich, so findet keine Übertragung statt.Die Berechnung der Indizes für bezeichner findet nach Ausführung der READ-Anweisung unmittelbar vor dem MOVE statt.
Falls nach einer READ-Anweisung ohne INTO-Angabe der Eingabebereich explizit angesprochen werden soll, ist der Benutzer für die Verwendung der richtigen (d.h. der Länge des eingelesenen Datensatzes entsprechenden) Datensatzerklärung verantwortlich.
Tritt während der Ausführung keine Schlüsselfehler-Bedingung auf, wird die INVALID KEY-Angabe, falls vorhanden, ignoriert, und folgende Vorgänge laufen ab:
Der Ein-/Ausgabe-Zustand für dateiname wird aktualisiert.
Tritt eine Ausnahme-Bedingung auf, die keine Schlüsselfehler-Bedingung ist, geht die Ablaufsteuerung zur USE-Prozedur über.
Tritt keine Ausnahme-Bedingung auf, ist der Satz im Satzbereich verfügbar und eine implizite Übertragung auf Grund der INTO-Angabe wird ausgeführt. Der Ablauf verzweigt zum Ende der READ-Anweisung oder, falls angegeben, zu unbedingte-anweisung-2 der NOT INVALID KEY-Angabe. Im letzteren Fall wird die Ausführung gemäß den Regeln für die angegebene unbedingte Anweisung fortgesetzt. Je nach Art dieser Anweisung wird der Ablauf entweder in einem anderen Teil des Programms oder am Ende der READ-Anweisung fortgesetzt.
Nach einer erfolglosen READ-Anweisung sind der Inhalt des zur Datei gehörigen Eingabebereichs sowie der Dateipositionsindikator undefiniert.
Ist die Anzahl der Zeichenpositionen eines gelesenen Datensatzes kleiner als die kleinste in den Datensatzbeschreibungen angegebene Länge, ist der Teil der Satzbereiches, der rechts vom letzten gültigen gelesenen Zeichen steht, undefiniert. Ist die Anzahl der Zeichenpositionen größer als die größte in den Datensatzbeschreibungen angegebene Länge, wird der Datensatz rechts von der maximalen Länge abgeschnit-ten. In beiden Fällen war die Leseoperation erfolgreich, aber es wird ein FILE STATUS-Wert gesetzt, der einen Satzlängenkonflikt anzeigt.
Nur für relative Dateiorganisation gilt:
Wenn eine Datei wahlfrei gelesen wird, wird nach einem Datensatz gesucht, dessen relative Satznummer gleich dem Wert des RELATIVE KEY-Datenfeldes dieser Datei ist. Falls kein solcher Datensatz in der Datei vorhanden ist, tritt eine Schlüsselfehler-Bedingung auf und die Ausführung der READ-Anweisung ist erfolglos (siehe „Schlüsselfehler-Bedingung").
Ist eine optionale Datei nicht vorhanden, tritt die Schlüsselfehler-Bedingung auf und die Ausführung der READ-Anweisung ist erfolglos.
Nur für indizierte Dateiorganisation gilt:
Mit der Ausführung der READ-Anweisung wird die Datei auf den Wert des Bezugsschlüssels positioniert. Dieser Wert wird verglichen mit dem Wert des entsprechenden Datenfeldes im abgespeicherten Satz, bis der erste Satz mit dem gleichen Wert gefunden ist. Wird als Bezugsschlüssel ein Alternativschlüssel verwendet und sind für diesen Alternativschlüssel Duplikate vorhanden, so wird der zuerst geschriebene Satz mit diesem Schlüsselwert zur Verfügung gestellt. Der so gefundene Satz wird im Satzbereich von dateiname zur Verfügung gestellt. Kann kein Satz auf o.g. Weise gefunden werden, tritt eine Schlüsselfehler-Bedingung auf, und die Ausführung der READ-Anweisung ist erfolglos (siehe „Schlüsselfehler-Bedingung").
Wenn KEY angegeben ist, wird für die aktuelle Leseoperation datenname als Bezugsschlüssel festgelegt. Bei dynamischem Zugriff wird dieser Bezugsschlüssel auch für alle folgenden READ-Anweisungen vom Format 1 verwendet, bis für die Datei ein anderer Bezugsschlüssel vereinbart wird.
Wenn kein KEY angegeben ist, gilt der Primärschlüssel als Bezugsschlüssel. Bei dynamischem Zugriff wird dieser Bezugsschlüssel auch für alle folgenden READ-Anweisungen vom Format 1 verwendet, bis für die Datei ein anderer Bezugsschlüssel vereinbart wird.