Natural-Statements und Natural-Transaktionslogik mit VSAM

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:


Natural-Statements mit VSAM

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.

BACKOUT TRANSACTION

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.

DELETE

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).

END TRANSACTION

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.

FIND

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 FIND NUMBER und FIND FIRST nicht zur Verfügung.

*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.

*NUMBER enthält nur dann einen aussagefähigen Wert, wenn im Suchkriterium der Operator EQUAL TO verwendet wird. Bei jedem anderen Operator ist *NUMBER 0, wenn keine Datensätze gefunden wurden. Jeder andere Wert zeigt an, dass Datensätze gefunden wurden, aber der Wert hat keinen Bezug zur Anzahl der tatsächlich gefundenen Datensätze.

Dasselbe gilt für *NUMBER beim Statement FIND NUMBER.

*COUNTER Die Systemvariable *COUNTER enthält die Anzahl der Aufrufe der Verarbeitungsschleife.

Diese Systemvariable ist beim Statement FIND NUMBER nicht verfügbar.

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.

GET

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.

GET SAME

Das GET SAME-Statement gilt nur für VSAM ESDS, RRDS und VRDS (siehe auch das GET-Statement weiter oben).

GET TRANSACTION DATA

Das GET TRANSACTION DATA-Statement ist nicht bei der Natural-Schnittstelle zu VSAM anwendbar.

HISTOGRAM

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.

READ

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.

STORE

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.

UPDATE

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-Transaktionslogik im Zusammenhang mit VSAM

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:

Bei nativem VSAM

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

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:

Modul NVSCICS

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.

If a SYNCPOINT or ROLLBACK command fails (for example, when CICS answers with a ROLLEDBACK condition to a SYNCPOINT request), error messages NAT3544 or NAT3545 are returned.

Tasks im Conversational Mode

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:

Example:

READ vsam-file
 UPDATE
 INPUT ...
END-READ
BACKOUT TRANSACTION

Pseudo-Conversational Tasks

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.

Unter DFSMStvs

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.