READLOB |
|
|
|
|
[IN] [FILE] view-name |
|
[PASSWORD=operand2]
|
||||||
[CIPHER=operand3]
|
||||||
[[WITH]
ISN [=]
operand4]
|
||||||
[[STARTING]
[AT] OFFSET
[=] operand5]
|
||||||
| statement
|
||||||
END-READLOB |
(structured mode only) | |||||
LOOP |
(reporting mode only) | |||||
Dieses Dokument 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 |
Ende des READLOB-Statements:
Im Structured Mode muss das für Natural reservierte Schlüsselwort
Im Reporting Mode wird das Natural-Statement
|
LOOP |
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