Dieses Kapitel beschreibt Besonderheiten, die hinsichtlich der Natural-Statements und Systemvariablen bei der Verwendung mit VSAM zu berücksichtigen sind. Darüber hinaus wird die Natural-Transaktionslogik im Zusammenhang mit VSAM behandelt.
Die Natural-Statements, die für den Zugriff auf VSAM-Dateien verwendet werden, sind eine Untermenge der in der Programmiersprache Natural enthaltenen Statements. Für den Zugriff auf eine VSAM-Datei sind keine neuen Statements erforderlich, da jedes Natural-Statement unabhängig vom Datenbankmanagementsystem oder der verwendeten Zugriffsmethode dieselbe Funktion erfüllt. Daher können Programme, die für VSAM-Dateien geschrieben wurden, auch für den Zugriff auf Adabas-Datenbanken verwendet werden.
Die Natural-Schnittstelle zu VSAM hat keine eingebaute Transaktionslogik und verwendet die Transaktionslogik der Umgebung, in der sie läuft. Dies führt je nach Umgebung zu unterschiedlichen Resultaten.
In diesem Kapitel werden die folgenden Themen behandelt:
Dieser Abschnitt umfasst in der Hauptsache Informationen, die auch in der Dokumentation zu Natural-Statements enthalten sind. Dort wird jede Natural-Statement im Detail beschrieben, gegebenenfalls mit Hinweisen zur Verwendung bei VSAM. Im Folgenden sind die besonderen Punkte zusammengefasst, die ein Programmierer bei der Verwendung von Natural-Statements mit VSAM beachten muss.
Anmerkung
Da der Natural-Compiler nicht prüft, ob ein Programm die durch die
Natural-Schnittstelle zu VSAM auferlegten Beschränkungen einhält, treten VSAM-spezifische
Programmierfehler bei der Verwendung von Natural-Statements erst bei der Ausführung des
Programms auf.
Natural-Statements, die in diesem Abschnitt nicht erwähnt wird, können ohne Einschränkungen mit VSAM verwendet werden.
Das BACKOUT
TRANSACTION-Statement wird verwendet, um alle
Datenbankaktualisierungen, die während der aktuellen logischen Benutzertransaktion
durchgeführt wurden, rückgängig zu machen. Dieses Statement gibt außerdem alle während
der Transaktion gehaltenen Datensätze frei.
Bei Verwendung mit Natural for VSAM gibt das BACKOUT TRANSACTION-Statement
Datensätze in der UPD-Tabelle frei. Es werden keine Transaktionen rückgängig gemacht, es
sei denn, Natural läuft unter einem TP-Monitor oder DFSMStvs, der das dynamische
Rückgängigmachen von Transaktionen unterstützt (z. B. CICS). In diesem Fall wird ein
ROLLBACK zum letzten SYNCPOINT
ausgegeben.
Das DELETE-Statement wird
verwendet, um einen Datensatz aus einer VSAM-Datei zu löschen.
Die Verwendung des DELETE-Statements setzt jeden in dem entsprechenden
FIND- oder READ-Statement ausgewählten Datensatz in
den Hold-Status.
Das DELETE-Statement ist nicht gültig bei VSAM Entry-Sequenced Data Sets
(ESDS).
Das END
TRANSACTION-Statement wird verwendet, um das Ende einer logischen
Transaktion anzuzeigen. Eine logische Transaktion ist die kleinste logische
Arbeitseinheit (wie vom Benutzer definiert), die in ihrer Gesamtheit ausgeführt werden
muss, um die logische Konsistenz der in der VSAM-Datei enthaltenen Informationen zu
gewährleisten.
Das END TRANSACTION-Statement gibt auch alle Sätze frei, die während der
Transaktion in den Hold-Status gesetzt wurden.
Ein END TRANSACTION-Statement gibt nur die in der UPD-Tabelle gehaltenen
Datensätze frei, es sei denn, Natural läuft unter einem TP-Monitor oder DFSMStvs, der
ein dynamisches Rückgängigmachen (Backout) von Transaktionen unterstützt (z. B. CICS).
In diesem Fall bewirkt ein END TRANSACTION-Statement, dass ein
SYNCPOINT ausgegeben wird.
Das FIND-Statement wird
verwendet, um einen Set von Datensätzen aus der VSAM-Datei anhand eines Suchkriteriums
auszuwählen, das aus Feldern besteht, die als Deskriptoren (Schlüssel) definiert
sind.
Die WITH-Klausel wird verwendet, um das Suchkriterium anzugeben, das aus
in der VSAM-Datei definierten Schlüsselfeldern (Deskriptoren) besteht.
Es können nur VSAM-Schlüsselfelder verwendet werden.
Die Anzahl der als Ergebnis einer WITH-Klausel auszuwählenden Datensätze kann durch die
Angabe des Schlüsselworts LIMIT zusammen mit einem Grenzwert (operand1), der als numerische
Konstante oder als benutzerdefinierte Variable ausgedrückt wird, begrenzt werden. Der
Limit-Wert wird in Klammern gesetzt. Wenn die Anzahl der ausgewählten Datensätze den
Limit-Wert überschreitet, wird das Programm mit einer Fehlermeldung abgebrochen.
Der Deskriptor muss in einer VSAM-Datei als VSAM-Schlüsselfeld definiert sein. In einem
DDM wird er mit P für Primärschlüssel, S für primärer
Sub-/Superdeskriptor, X für alternativer Sub-/Superdeskriptor oder
A für alternativer Schlüssel gekennzeichnet (siehe DDM bearbeiten im
Abschnitt Betrieb und die Beschreibung DDM-Editor (SYSDDM Utility)
in der Natural-Editoren-Dokumentation).
Die Formate des Deskriptors und des Suchwertes müssen kompatibel sein.
Die folgenden Natural-Systemvariablen sind beim FIND-Statement
verfügbar:
| Variable | Inhalt |
|---|---|
*ISN |
Die Systemvariable *ISN enthält die relative
Byte-Adresse des zurzeit in Bearbeitung befindlichen Datensatzes (nur
ESDS-Dateien).
Diese Variable steht bei den Statements |
*NUMBER |
Die Systemvariable *NUMBER enthält die Anzahl der
Datensätze, die das in der WITH-Klausel angegebene Basissuchkriterium
erfüllen, und zwar vor der Auswertung eines WHERE-Kriteriums.
Dasselbe gilt für |
*COUNTER |
Die Systemvariable *COUNTER enthält die Anzahl der
Aufrufe der Verarbeitungsschleife.
Diese Systemvariable ist beim Statement
|
Das FIND-Statement ist nur für Key-Sequenced (KSDS) und Entry-Sequenced
(ESDS) VSAM-Datasets gültig. Für ESDS muss ein alternativer Index oder ein Pfad für
einen alternativen Index definiert werden. Relative Record Datasets (RRDS) sind nicht
zulässig, da sie keine Schlüsselfelder (Deskriptoren) enthalten.
Das GET-Statement wird verwendet,
um einen Datensatz mit einer bestimmten VSAM-Datensatznummer zu lesen. Bei einer
ESDS-Datei ist die Datensatznummer (ISN) die relative Byte-Adresse (RBA). Bei RRDS- und
VRDS-Dateien ist es die relative Datensatznummer (RRN). Das GET-Statement
initiiert keine Verarbeitungsschleife. Folglich wird ein nachfolgendes UPDATE- oder DELETE-Statement nicht verarbeitet und
Natural gibt eine entsprechende Fehlermeldung zurück.
Für ESDS muss die RBA in einer benutzerdefinierten Variablen (numerisches Format) enthalten sein oder als Integer-Konstante angegeben werden. Für RRDS und VRDS gelten dieselben Regeln, mit der Ausnahme, dass die RRN anstelle des RBA angegeben werden muss.
Das GET SAME-Statement gilt
nur für VSAM ESDS, RRDS und VRDS (siehe auch das GET-Statement weiter
oben).
Das GET TRANSACTION
DATA-Statement ist nicht bei der Natural-Schnittstelle zu VSAM
anwendbar.
Das HISTOGRAM-Statement wird
verwendet, um die Werte eines Feldes zu lesen, das als Deskriptor, Subdeskriptor oder
Superdeskriptor definiert ist.
Das HISTOGRAM-Statement initiiert eine Verarbeitungsschleife, bietet aber
keinen Zugriff auf andere Felder als das in dem Statement angegebene Feld.
Als Deskriptoren können nur VSAM-Schlüsselfelder verwendet werden.
Die folgende Natural-Systemvariable ist mit dem HISTOGRAM-Statement
verfügbar:
| Variable | Inhalt |
|---|---|
*NUMBER |
Wenn die Systemvariable *NUMBER in Verbindung mit einem
KSDS-Primärschlüssel oder einem eindeutigen alternativen Index verwendet wird,
ist ihr Inhalt immer 1.
|
Anmerkung
Die Systemvariable *ISN ist bei der Natural-Schnittstelle zu
VSAM nicht verfügbar.
Bei Verwendung mit VSAM ist das HISTOGRAM-Statement nur für KSDS- und
ESDS-Datasets gültig. Für ESDS muss ein alternativer Index oder ein Pfad für einen
alternativen Index definiert werden.
Die Werte werden direkt aus dem VSAM-Index gelesen und in auf- oder absteigender Reihenfolge zurückgegeben.
Das READ-Statement wird
verwendet, um Datensätze aus einer VSAM-Datei zu lesen. Die Sätze können in der
Reihenfolge (auf- oder absteigend) der Werte eines Deskriptorfeldes (Schlüssel)
abgerufen werden. Die READ-Sequenz initiiert eine
Verarbeitungsschleife.
IN LOGICAL SEQUENCE wird
verwendet, um Datensätze in der Reihenfolge der Werte eines Deskriptors (Schlüssel) zu
lesen. Wenn LOGICAL mit einem Deskriptor angegeben wird, werden die
Datensätze in der Reihenfolge der Werte des Deskriptors gelesen. Ein Deskriptor kann zur
Reihenfolgesteuerung verwendet werden. Ein Deskriptor innerhalb einer Periodengruppe
kann nicht verwendet werden. Wird LOGICAL ohne Deskriptor angegeben, werden
die Datensätze in der Standard-Deskriptorreihenfolge gelesen, wie sie im DDM definiert
ist.
WITH REPOSITION
kann zum Übergehen der sequenziellen Verarbeitung innerhalb der aktiven Schleife
verwendet werden. Die neue Position muss als neuer Startwert für die Schleife definiert
werden und die Systemvariable *COUNTER zurücksetzen.
IN LOGICAL SEQUENCE ist nur für KSDS mit definierten Primärschlüsseln und
Alternativschlüsseln und ESDS mit definierten Alternativschlüsseln gültig. Auch ein
Subdeskriptor oder Superdeskriptor kann zur Ablaufsteuerung verwendet werden.
Die folgenden Natural-Systemvariablen stehen beim READ-Statement zur
Verfügung:
| Variable | Inhalt |
|---|---|
*ISN |
Die Systemvariable *ISN enthält entweder die RRN (für
RRDS oder VRDS) oder die RBA (für ESDS) des aktuellen Datensatzes.
|
*COUNTER |
Die Systemvariable *COUNTER enthält die Anzahl der
Einsprünge in die Verarbeitungsschleife.
|
Datensätze können auch IN PHYSICAL
SEQUENCE abgerufen werden, was dazu dient, Datensätze in der
Reihenfolge zu lesen, in der sie physisch in einer Datenbank gespeichert sind. Sie ist
nur bei VSAM ESDS, RRDS und VRDS gültig. Dies ist die Standardreihenfolge.
STARTING WITH ISN
kann als Startwert für die Schleife in aufsteigender oder absteigender physischer
Reihenfolge verwendet werden.
BY ISN wird verwendet, um
Datensätze in RBA- und RRN-Reihenfolge für ESDS-, RRDS- bzw. VRDS-Dateien zu lesen.
Das STORE-Statement wird
verwendet, um einen Datensatz in einer Datenbank hinzuzufügen.
Ein eindeutiger Wert für das Primärschlüsselfeld oder das Alternate-Index-Feld muss angegeben werden, wenn der Datensatz mit einem Primärschlüssel oder einem eindeutigen Alternate-Index definiert ist.
Die Klausel USING/GIVING
NUMBER ist nur bei RRDS oder VRDS gültig. In diesem Fall
entspricht die ISN der relativen Datensatznummer.
USING/GIVING NUMBER wird verwendet, um einen Datensatz mit einer vom
Benutzer vergebenen RRN zu speichern. Wenn ein Datensatz mit der angegeben RRN bereits
existiert, wird eine Fehlermeldung zurückgegeben und die Ausführung des Programms
abgebrochen, sofern nicht ON
ERROR-Verarbeitung angegeben wurde.
Die Natural-Systemvariable *ISN enthält die RRN, die dem neuen
Datensatz als Ergebnis der Ausführung des STORE-Statements zugewiesen
wurde.
Eine nachfolgende Referenz auf *ISN muss die
Statement-Nummer des entsprechenden STORE-Statement enthalten.
*ISN ist nur bei RRDS- oder VRDS-Dateien verfügbar.
Das UPDATE-Statement wird
verwendet, um ein oder mehrere Felder eines Datensatzes in einer Datenbank zu
aktualisieren. Der zu aktualisierende Datensatz muss zuvor mit einem FIND- oder READ-Statement ausgewählt worden sein.
Der Primärschlüssel kann nicht aktualisiert werden.
Natural for VSAM verwendet die Transaktionslogik der Umgebung, in der es läuft. Daher
unterscheiden sich die Ergebnisse der Natural-Statements END TRANSACTION und
BACKOUT
TRANSACTION (siehe auch die entsprechenden Abschnitte in
Natural-Statements mit VSAM) je nach der tatsächlichen Umgebung.
Da VSAM selbst keine Transaktionslogik besitzt, ist auch keine Transaktionslogik
verfügbar, wenn Natural in einer nativen VSAM-Umgebung arbeitet. Dies ist der Fall unter
Com-plete, TSO und im Batch-Modus, d.h. wenn NVSMISC das verwendete
E/A-Modul ist.
Bei NVSMISC geben die Statements END TRANSACTION und BACKOUT TRANSACTION keine Fehlermeldungen zurück, sondern
werden von der Natural-Schnittstelle zu VSAM ignoriert.
Unter CICS können VSAM-Dateien als "wiederherstellbare Ressourcen" oder
für RLS als "wiederherstellbare Sphäre" definiert werden, die alle von CICS
unter Verwendung des Konzepts der "logischen Arbeitseinheiten" (Logical
Units of Work, LUW) synchronisiert werden. Eine LUW endet, wenn ein
SYNCPOINT-Kommando ausgegeben wird oder wenn die CICS-Task
beendet wird. Einzelheiten finden Sie in der entsprechenden IBM-Literatur über CICS.
Nachfolgend finden Sie Informationen über:
Für CICS ist das E/A-Modul NVSCICS ein normales Anwendungsprogramm auf
Kommandoebene. Es übergibt die Statements END
TRANSACTION und BACKOUT
TRANSACTION an den NATCICS-Treiber, der die
Kommandos EXEC CICS SYNCPOINT und EXEC CICS
ROLLBACK ausgibt. Wenn in einer Natural-Sitzung mit nicht festgeschriebenen
Aktualisierungen (Uncommitted Updates) ein Fehler auftritt und keine Fehlertransaktion
übergeben wird, veranlasst Natural selbst die Schnittstelle zu VSAM zur Ausgabe eines
ROLLBACK-Kommandos.
Wenn ein SYNCPOINT- oder
ROLLBACK-Kommando fehlschlägt (z.B. wenn CICS auf eine
SYNCPOINT-Anforderung mit einer ROLLEDBACK-Kondition
antwortet), wird die Fehlermeldung NAT3544 oder NAT3545 zurückgegeben.
Wenn die Natural-Sitzung im CICS Conversational Mode läuft, wird die LUW nicht durch
eine Terminal-E/A beendet. Natural läuft im Conversational Mode, wenn entweder der
Natural-Parameter PSEUDO=OFF angegeben wurde oder Natural selbst festgestellt
hat, dass eine pseudo-konversationelle Verarbeitung nicht möglich ist.
Da Terminal-Ein-/Ausgaben die Transaktionslogik einer Anwendung nicht stören, solange Natural im Conversational Mode läuft, funktioniert ein Programm wie das folgende ohne Probleme:
READ vsam-file UPDATE INPUT ... END-READ BACKOUT TRANSACTION
Wenn die Natural-Sitzung im Pseudo-Conversational Mode läuft, beendet jede
Terminal-Ein-/Ausgabe die CICS-Task und führt damit implizit ein
SYNCPOINT-Kommando aus. Die Auswirkungen eines BACKOUT TRANSACTION-Statement, d.h.
eines EXEC CICS SYNCPOINT ROLLBACK-Kommandos, reichen daher
nur bis zur letzten Terminal-Ein-/Ausgabe zurück. Das obige Beispielprogramm würde
daher mit der Fehlermeldung NAT3548 enden, weil es nicht möglich ist, alle
Aktualisierungen zurückzunehmen.
Anmerkung
Beachten Sie, dass alle Meldungen der Natural-Schnittstelle zu VSAM nur zur
Laufzeit ausgegeben werden, da der Natural-Compiler nicht in der Lage ist, diese Art
von logischen Fehlern zu erkennen.
DFSMS Transactional VSAM Services (DFSMStvs) bietet die gleichen Funktionen wie CICS:
Vorwärts- und Rückwärts-Wiederherstellungsprotokollierung, Backout-Verarbeitung und
einen zweistufigen Commit-Prozess. Eine LUW endet, wenn der RRS-Aufruf (Resource
Recovery Service) SRRCMIT oder
SRRBACK ausgegeben wird (END TRANSACTION oder BACKOUT TRANSACTION). Einzelheiten finden Sie in der
entsprechenden IBM-Literatur zu DFSMStvs und RRS.