READLOB |
|
|
|
|
[IN] [FILE] view-name |
|
[PASSWORD=operand2]
|
||||||
[CIPHER=operand3]
|
||||||
[[WITH] ISN [=]
operand4]
|
||||||
[[STARTING] [AT] OFFSET [=] operand5]
|
||||||
|
statement
|
||||||
END-READLOB [(r)] |
(structured mode only) | |||||
LOOP [(r)] |
(reporting mode only) | |||||
Dieser Abschnitt behandelt folgende Themen:
Eine Erläuterung der in dem Syntax-Diagramm verwendeten Symbole entnehmen Sie dem Abschnitt Syntax-Symbole.
Verwandte Statements: READ | FIND | GET
Gehört zur Funktionsgruppe: Datenbankzugriffe und Datenbankänderungen
Das Statement READLOB wird bei einem einzelnen Datensatz verwendet, bei dem
das definierte LOB-Feld (LOB = Large OBject) während der Schleifenausführung in
festgelegten Segmenten gelesen wird.
Zu Beginn der Schleife wird der Versatz (Offset) innerhalb des LOB-Feldes gesetzt, ab dem die ersten Daten gelesen werden sollen. Bei der nächsten Schleifen-Iteration wird das Segment zurückgegeben, das auf das zuletzt gelesene Segment folgt. Wenn das Ende der LOB-Daten erreicht ist, wird die Schleife beendet.
Dieses Statement leitet eine Verarbeitungsschleife ein. Siehe auch Schleifenverarbeitung im Leitfaden zur Programmierung.
Das Statement READLOB kann nur für den Zugriff auf Adabas-Datenbanken
benutzt werden.
Operanden-Definitionstabelle:
| Operand | Mögliche Struktur | Mögliche Formate | Referenzierung erlaubt | Dynam. Definition | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand1
|
C | S | N | P | I | B * | ja | nein | ||||||||||||
operand2
|
C | S | A | ja | nein | |||||||||||||||
operand3
|
C | S | N | ja | nein | |||||||||||||||
operand4 |
C | S | N | P | I | B * | ja | nein | ||||||||||||
operand5 |
C | S | N | P | I | B * | ja | nein | ||||||||||||
* Format B von operand1,
operand4 und
operand5 kann mit einer Länge von kleiner
gleich 4 benutzt werden.
Syntax-Element-Beschreibung:
| Syntax-Element | Beschreibung |
|---|---|
operand1 |
Anzahl der zu lesen LOB-Segmente:
Die Anzahl der durchzuführenden Schleifenverarbeitungen kann durch Angabe von
Beispiel: READLOB (5) IN FILE VIEW01 ... #CNT := 10 READLOB (#CNT) IN FILE VIEW01 ... Für dieses Statement hat das hier angegebene Limit Vorrang vor einem Limit,
welches mit dem Anmerkung |
ALL |
ALL-Option:
Sie können wahlweise das Schlüsselwort Wenn Sie |
view-name |
View-Name:
Als
|
|
PASSWORD- und CIPHER-Klauseln:
Die Die |
|
WITH
ISN=operand4 |
WITH ISN-Option:
Diese Option dient zur Angabe der internen Folgenummer (ISN) des Datensatzes,
auf den das
Anmerkung Wird diese Option nicht angegeben, dann wird standardmäßig das
|
STARTING AT
OFFSET=operand5 |
STARTING AT OFFSET-Klausel:
Dient zur Angabe des Start-Offset innerhalb des LOB-Feldes, d.h., ab wo das
Lesen des ersten Segments beginnen soll. Das erste Byte des LOB-Feldes hat den
Versatz Null (
Wird die Klausel nicht angegeben, dann wird Null ( Siehe auch *NUMBER während der Schleifenverarbeitung, die im Abschnitt Bei READLOB vorhandene Systemvariablen weiter unten beschrieben wird. |
END-READLOB
(r)
|
Ende des READLOB-Statements:
Im Structured Mode muss das für Natural reservierte Schlüsselwort
Im Structured Mode können Sie bei Im Reporting Mode wird das Natural-Statement Im Reporting Mode können Sie bei |
LOOP
(r)
|
Beim READLOB-Statement stehen die Natural-Systemvariablen *ISN, *COUNTER und
*NUMBER
zur Verfügung.
Format/Länge dieser Systemvariablen ist P10. Die Format/Länge-Werte können nicht geändert werden.
In der folgenden Tabelle wird die Verwendung dieser Natural-Systemvariablen in Verbindung
mit dem READLOB-Statement erläutert:
| Systemvariable | Erläuterung | |||
|---|---|---|---|---|
*ISN |
Enthält die Adabas-interne Folgenummer (ISN) des Datensatzes,
der zurzeit verarbeitet wird. Das mit einem READLOB-Statement immer
auf denselben Datensatz zugreift, bleibt der von der Systemvariablen über alle
Schleifen-Iterationen zurückgegebene Wert immer derselbe.
|
|||
*COUNTER |
Enthält die Anzahl der durchlaufenen Verarbeitungsschleifen. | |||
*NUMBER |
Diese Systemvariable wird zweifach verwendet: | |||
|
||||
Falls ein konsekutives Lesen über ein LOB-Feld angefordert
wird, darf der *NUMBER-Wert innerhalb des
READLOB-Statements nicht geändert werden, da
*NUMBER den Offset für die exakte Fortsetzung mit
dem nächsten Segment in der darauffolgenden Schleifen-Iteration enthält. Falls
jedoch eine Fortsetzung an einer anderen Stelle innerhalb des LOB-Feldes
(Neupositionierung) gewünscht wird, können Sie den
*NUMBER-Wert auf diesen Offset ändern. Wird
*NUMBER zurückgesetzt, hat dies zur Folge, dass das
nächste Segment vom LOB-Anfang kommt. Wird *NUMBER um
(n) erhöht, wird die entsprechende
Anzahl Bytes bei der LOB-Feldverarbeitung übersprungen.
|
Das READLOB-Statement liest den Datensatz immer ohne Hold (Sperre). Um
die Stabilität der LOB-Daten während der Durchsuchung des Feldes durch das
READLOB-Statement sicherzustellen (d.h. zur Vermeidung einer
Aktualisierung durch andere Benutzer), kann der Datensatz mit dem Datenbank-Statement,
welches den ISN-Wert liefert, in den Hold-Status gesetzt werden, und zwar
in einen Exclusive Hold bedingt durch ein UPDATE- oder
DELETE-Statement, welches sich auf ein äußeres READ-
oder FIND-Statement bezieht, oder
in einen Shared Hold mit einer IN SHARED HOLD-Option, die
in einem READ- oder FIND-Statement angewendet wird.
Da das READLOB-Statement den Datensatz immer ohne Hold (Sperre) liest,
darf sich ein UPDATE-, DELETE- oder GET
SAME-Statement nicht auf ein READLOB-Statement beziehen.
Beispiel 2 - Datensatznummer über benutzerdefinierte Variable holen
Beispiel 3 - Datensatznummer aus der READ-Schleife holen/ mit Exclusive Hold)
DEFINE DATA LOCAL
1 VIEW01 VIEW OF ..
2 NAME
2 L@LOBFIELD
1 VIEW02 VIEW OF ..
2 LOBFIELD_SEGMENT /* LOB field defined in DDM with (A1000).
END-DEFINE
*
READ VIEW01 BY NAME = 'SMITH' /* Outer statement reads all demanded record
/* fields, except the LOB field.
IN SHARED HOLD MODE=Q /* Set record into shared hold to enforce LOB
/* data stability during READLOB.
DISPLAY NAME 'Total-length LOB-field' L@LOBFIELD
READLOB VIEW02 /* Record number used from active record of
/* READ statement.
/* LOB is read in segments with length 1000.
STARTING AT OFFSET = 2000 /* Start to read the LOB field at byte 2000.
WRITE 'Loop counter:' *COUNTER 10X ' Next offset:' *NUMBER
PRINT VIEW02.LOBFIELD_SEGMENT
END-READLOB
END-READ
END
DEFINE DATA LOCAL
1 #ISN (I4)
1 #CNT (I4)
1 #OFF (I4)
1 VIEW02 VIEW OF ..
2 LOBFIELD_SEGMENT /* LOB field defined in DDM with (A1000).
END-DEFINE
*
INPUT (AD=T)
/ ' Read record (ISN):' #ISN
/ 'Number of segments:' #CNT
/ ' Start at offset:' #OFF
*
READLOB (#CNT) VIEW02 /* Read max. (#CNT) segments with length 1000.
WITH ISN = #ISN /* Record number provided by user.
/* Record is not in hold.
STARTING AT OFFSET = #OFF /* Start to read the LOB field at byte (#OFF).
WRITE 'Loop counter:' *COUNTER 10X ' Next offset:' *NUMBER
PRINT VIEW02.LOBFIELD_SEGMENT
END-READLOB
END
DEFINE DATA LOCAL
1 VIEW01 VIEW OF ..
2 NAME
1 VIEW02 VIEW OF ..
2 LOBFIELD_SEGMENT /* LOB field defined in DDM with (A1000).
END-DEFINE
*
R1. READ VIEW01 BY NAME = 'SMITH' /* Outer statement reads all demanded record fields,
/* except the LOB field.
DISPLAY NAME
READLOB VIEW02 /* Record number used from active record of READ stmt.
/* LOB is read in segments with length 1000.
STARTING AT OFFSET = 2000 /* Start to read the LOB field at byte 2000.
WRITE 'Loop counter:' *COUNTER 10X ' Next offset:' *NUMBER
PRINT VIEW02.LOBFIELD_SEGMENT
END-READLOB
...
UPDATE (R1.) /* Set record into exclusive hold that enforces LOB
/* data stability during READLOB.
END OF TRANSACTION
END-READ
END