Hinweise zur Anweisung 'get' mit DL/I

Im Kontext von DL/I ruft die EGL-Anweisung 'get' ein einzelnes Segment in einer DL/I-Datenbank ab.

Die Anweisung schließt die Option 'forUpdate' ein, mit der Sie die gespeicherten Daten zu einem späteren Zeitpunkt in Ihrem Code ersetzen oder löschen können. Sie können diese Anweisung auch verwenden, um eine Gruppe von DL/I-Segmenten abzurufen und den Inhalt jedes nachfolgenden Segments in den nächsten DLISegment-Datensatz einer dynamischen Feldgruppe zu stellen.

Die Anweisung 'get' generiert eine DL/I-Anweisung 'get unique' (GU). Die Anweisung 'get...forUpdate' generiert eine DL/I-Anweisung GHU.

Die Anweisung 'get' wird hauptsächlich wie folgt verwendet:

Ein Beispiel zur Verwendung der Anweisung 'get...forUpdate' mit DL/I finden Sie unter Hinweise zur Anweisung 'delete' mit DL/I.

DL/I unterstützt auch die Verwendung von Pfadaufrufen in get-Anweisungen. Bei Verwendung von Pfadaufrufen können Sie übergeordnete Segmente für alle Segmentebenen zwischen dem Segment auf der niedrigsten Ebene und dem Stammelement lesen. Im folgenden Beispiel liest EGL in nur einem Aufruf alle drei DL/I-Segmente ('customer', 'location' und 'order') in die entsprechenden DLISegment-Datensätze:
get myCustomer, myLocation, myOrder;
EGL generiert aus dieser Anweisung den folgenden DL/I-Pseudocode:
GU STSCCST*D (STQCCNO = :myCustomer.customerNo) 
   STSCLOC*D (STQCLNO = :myLocation.locationNo) 
   STPCORD

Wenn Sie eine dynamische Feldgruppe aus DLISegment-Datensätzen als Objekt der Anweisung 'get' angeben, generieren Sie einen DL/I-Aufruf GU (get unique) für den ersten Datensatz in der Feldgruppe und einen Aufruf GN (get next) für jeden nachfolgenden Datensatz in der Feldgruppe. Wenn für die Feldgruppe keine Anzahl an Elementen angegeben ist, generiert die Anweisung so lange GN-Aufrufe, bis das Ende der DL/I-Datei erreicht ist oder bis ein Fehlercode auftritt.

Syntax

Syntaxdiagramm für die Anweisung 'get' mit DL/I
Positionsoption
Die Positionsoptionen 'next' und 'next inParent' sind mit der Anweisung 'get' in DL/I gültig. Weitere Informationen finden Sie unter 'Positionsoptionen' in diesem Thema.
DLISegment-Variable
Name der DLISegment-Variablen, die dem Segment entspricht, das Sie aus der Datenbank lesen wollen.
forUpdate
Option, die es Ihnen ermöglicht, zu einem späteren Zeitpunkt eine EGL-Anweisung 'replace' oder 'delete' für die Daten zu verwenden, die aus der Datei oder Datenbank abgerufen wurden.
Die Option 'forUpdate' sperrt den Datensatz, sodass er von anderen Programmen erst dann geändert werden kann, nachdem eine Festschreibung (Commit) erfolgt ist. Weitere Informationen zur Commitverarbeitung finden Sie unter Logische Arbeitseinheit (LUW).
usingPCB PCB-Name
Option zum Angeben des Namens eines Programmkommunikationsblocks (PCB) gemäß Definition in Ihrem PSB-Datensatz (Programmspezifikationsblock), um diesen PCB anstelle des standardmäßigen PCB zu verwenden.
with #dli{ DL/I-Anweisung }
Option zur Verwendung einer expliziten DL/I-Anweisung GU oder GHU. Weitere Informationen finden Sie unter Direktive '#dli'. Zwischen '#dli' und der linken geschweiften Klammer darf kein Leerzeichen stehen.
Dynamische_DLI-Feldgruppe
Name einer dynamischen Feldgruppe, die aus DLISegment-Datensätzen besteht.

Positionsoptionen

Die Anweisung 'get next' generiert eine DL/I-Anweisung GN. Die Anweisung 'get next...forUpdate' generiert eine DL/I-Anweisung GHN. Die Anweisung liest das Segment, das unmittelbar auf das aktuelle Segment in der hierarchischen Reihenfolge folgt. Hierarchische Reihenfolge bedeutet, dass der Datenbankmanager beim Stammsegment beginnt und dann den Lesevorgang entlang der Hierarchie von oben nach unten so lange fortsetzt wie möglich, indem das erste untergeordnete Segment des ersten untergeordneten Segments gelesen wird usw., bis die unterste Ebene der Hierarchie erreicht wird. Anschließend wird der Lesevorgang nach oben fortgesetzt, bis ein paralleles untergeordnetes Element gefunden wird, das bisher noch nicht gelesen wurde. Dieses Segment wird dann mit allen untergeordneten Segmenten gelesen.

Die Kundendatenbank (Customer) unter Beispiel-DL/I-Datenbank beispielsweise weist die folgende hierarchische Reihenfolge auf:
  1. Der Datenbankmanager liest zunächst das Stammsegment: Kundenname (customerName) und Kundenadresse (customerAddr).
  2. Der Datenbankmanager liest anschließend das erste Standortsegment (Location) für diesen Kunden, das erste Bestellsegment (Order) und alle Artikelsegmente (Item) für diese Bestellung.
  3. Wenn weitere Order-Segmente vorliegen, liest der Datenbankmanager das nächste Order-Segment und alle Item-Segmente für diese Bestellung. Wenn keine weiteren Order-Segmente für diesen Standort mehr vorliegen, geht es mit Schritt 4 weiter.
  4. Wenn weitere Location-Segmente vorliegen, liest der Datenbankmanager das nächste Location-Segment, das erste Order-Segment für diesen Standort und alle Item-Segmente für diese Bestellung. Dann geht es zurück zu Schritt 3. Wenn keine weiteren Location-Segmente mehr vorliegen, geht es weiter mit Schritt 5.
  5. Wenn weitere Customer-Segmente vorliegen, liest der Datenbankmanager das nächste Customer-Segment. Es geht zurück zu Schritt 2. Wenn keine weiteren Customer-Segmente vorliegen, hat der Manager die gesamte Datei gelesen.

DL/I unterstützt auch die Verwendung von Pfadaufrufen in get next-Anweisungen. Dies bedeutet, dass Sie übergeordnete Segmente für alle Segmentebenen zwischen dem Segment auf der niedrigsten Ebene und dem Stammelement lesen können.

Die aktuelle Datenbankposition wird von E/A-Operationen beeinflusst, ebenso wie es der Fall ist, wenn Sie ein lokales COBOL- oder PL/I-Programm schreiben. Darüber hinaus können Sie eine EGL-Anweisung 'set record position' verwenden, um EGL zu veranlassen, eine nachfolgende Anweisung 'get next' (Aufruf GN) in eine Anweisung 'get' (Aufruf GU) zu ändern. Ein Beispiel:
// Definition von DLISegment-Datensätzen mithilfe der Eigenschaft 'hostVarQualifier'
Record CustomerRecordPart type DLISegment
  { segmentName="STSCCST", keyItem="customerNo", hostVarQualifier="myCustomer" }
  ...
end
Record LocationRecordPart type DLISegment
  { segmentName="STSCLOC", keyItem="locationNo", hostVarQualifier="myLocation" }
  ...
end
Record OrderRecordPart type DLISegment
  { segmentName="STPCORD", keyItem="orderDateNo", hostVarQualifier="myOrder" }
  ...
end

  //Erstellung von Variablen für die Datensätze 
  myCustomer CustomerRecord; 
  myLocation LocationRecord; 
  myOrder OrderRecord; 

  //Erstellung eines Segmentsucharguments 
  myCustomer.customerNo = "005001"; 
  myLocation.locationNo = "000022"; 
  myOrder.orderDateNo = "20050730A003"; 
  set myOrder position;

  //Bestellungen (Orders) in einer Schleife durchlaufen
  while (myOrder not noRecordFound)
    try 
      get next myOrder; 
      onException 
        myErrorHandler(2); 
    end // Ende des try-Blocks
  end // Ende von 'while'
Bei der ersten Ausführung der Anweisung 'get next' verwendet EGL wie folgt einen Aufruf GU mit qualifizierten SSAs für 'customer', 'location' und 'order':
GU STSCCST (STQCCNO = :myCustomer.customerNo) 
   STSCLOC (STQCLNO = :myLocation.locationNo) 
   STPCORD (STQCODN = :myOrder.orderDateNo)

Nach dem ersten Durchlaufen der Schleife verwendet EGL einen Aufruf GN.

Die folgenden Hinweise gelten, wenn Sie eine Anweisung 'set record position' verwenden:
  • 'set record position' setzt ein Flag, um anzugeben, dass EGL die erste Anweisung 'get next' für den DLISegment-Datensatz in eine Anweisung 'get' (Aufruf GU) konvertieren soll.
  • Wenn die nächste E/A-Anweisung für den DLISegment-Datensatz keine Anweisung 'get next' ist, wird die Anweisung 'set record position' ignoriert, und das Flag wird zurückgesetzt.
  • Wenn die Anweisung 'get next' die Direktive '#dli' angibt, wird die Anweisung 'set record position' ignoriert, und das Flag wird zurückgesetzt.

Wenn Sie eine dynamische Feldgruppe aus DLISegment-Datensätzen als Objekt der Anweisung 'get next' angeben, generieren Sie einen DL/I-Aufruf GN (get next) für jeden Datensatz in der Feldgruppe. Wenn für die Feldgruppe keine Anzahl an Elementen angegeben ist, generiert die Anweisung so lange GN-Aufrufe, bis das Ende der DL/I-Datenbank erreicht ist oder bis ein Fehlercode auftritt. Um in dieser Situation ein besser vorhersehbares Verhalten zu erreichen, verwenden Sie die Anweisung 'get next inParent'.

Die Anweisung 'get next inParent' generiert eine DL/I-Anweisung GNP (wenn kein Änderungswert 'forUpdate' vorliegt) bzw. eine Anweisung GHNP (wenn ein Änderungswert 'forUpdate' vorliegt). Die Anweisung liest das nächste untergeordnete Segment, das dasselbe übergeordnete Segment aufweist wie das Segment an der aktuellen Datenbankposition. Sie können den Änderungswert 'next inParent' auch verwenden, um eine Gruppe von DL/I-Segmenten für eine dynamische Feldgruppe abzurufen.

Beispiel

Das folgende Beispiel zeigt, wie ein Dateidatensatz gelesen und ersetzt wird:
  emp.empnum = 1;         // Legt den Schlüssel im Datensatz 'emp' (Mitarbeiter) fest

  try
    get emp forUpdate;
  onException(dex DLIException)
    myErrorHandler(dex);   // beendet das Programm
  end

  emp.empname = emp.empname + " Smith";

  try
    replace emp;
  onException(dex DLIException)
    myErrorHandler(dex);
  end

Kompatibilität

Tabelle 1. Hinweise zur Kompatibilität für 'get' und DL/I
Plattform Problem
CICS für z/OS Die Position für 'get' geht in den folgenden Fällen verloren:
  • Wenn eine Commit- oder Rollback-Operation ausgegeben wird.
  • Nach einer Anweisung 'converse', wenn diese im Segmentmodus ausgeführt wird.

Feedback