UPDATELOB [OF] [RECORD] [(r)] [IN] [FILE] view-name |
|||||
[PASSWORD=operand1]
|
|||||
[CIPHER=operand2]
|
|||||
[[STARTING]
[AT] OFFSET
[=] operand3]
|
|||||
|
|
TRUNCATE |
|
|
|
|
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 | READLOB | UPDATE
Gehört zur Funktionsgruppe: Datenbankzugriffe und Datenbankänderungen
Das Statement UPDATELOB dient zum Aktualisieren eines Datensegments eines
LOB-Feldes (LOB = Large OBject) in einem Datenbankdatensatz. Die Stelle, an der die
Wertänderung ausgeführt wird, kann frei gewählt werden. Der zu aktualisierende Datensatz
muss zuvor mit einem FIND-, READ-, GET-Statement ausgewählt oder mit einem STORE-Statement angelegt worden sein.
Die Verwendung des UPDATELOB-Statements bewirkt, dass jeder für die
Verarbeitung im entsprechenden FIND-,
READ-, GET-Statement gelesene Datensatz in exklusiven Hold gesetzt
wird.
Weitere Informationen siehe Datensatz-Kontrolle während einer Transaktion (Hold-Logik) im Leitfaden zur Programmierung.
Das UPDATELOB-Statement
kann nur für den Zugriff auf Adabas-Datenbanken benutzt werden;
darf nicht in der Zeile angegeben werden, in der das zur Auswahl des zu aktualisierenden Datensatzes benutzte Statement steht;
ist nur für die Aktualisierung eines einzelnen LOB-Feldes verwendbar.
Operanden-Definitionstabelle:
| Operand | Mögliche Struktur | Mögliche Formate | Referenzierung erlaubt | Dynam. Definition | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand1
|
C | S | A | yes | no | |||||||||||||||
operand2
|
C | S | N | yes | no | |||||||||||||||
operand3
|
C | S | N | P | I | B * | yes | no | ||||||||||||
* Format B von operand3 kann mit einer Länge von
kleiner gleich 4 benutzt werden.
Syntax-Element-Beschreibung:
| Syntax-Element | Beschreibung |
|---|---|
(r) |
Statement-Referenzierung:
Die Notation
Falls Sie keine Referenzierung angeben, bezieht sich das
Anmerkung |
view-name |
View-Name:
Als
|
|
PASSWORD-Klausel und CIPHER-Klausel:
Die Die |
|
STARTING AT
OFFSET=operand3 |
STARTING AT OFFSET-Klausel:
Dient zur Angabe des Startversatzes (Offset) innerhalb des LOB-Feldes, ab wo
die Operation ausgeführt werden soll. Das höchstwertige Byte des LOB-Feldes hat
den Offset Null (
Wird die Klausel nicht angegeben, dann wird Null ( |
|
TRUNCATE-Klausel:
Wenn Sie Wenn Sie Wird die Klausel weggelassen, bleiben die Daten nach dem eingefügten Segment erhalten. |
Beim UPDATELOB-Statement steht die Natural-Systemvariable *NUMBER zur
Verfügung.
Format/Länge dieser Systemvariablen ist P10. Die Format/Länge-Werte können nicht geändert werden.
| Systemvariable | Erläuterung |
|---|---|
*NUMBER |
Die Systemvariable *NUMBER gibt
die Summe aus Startversatz und Anzahl der eingefügten Zeichen zurück. Dieser Wert
stellt den Startversatz für das nächste UPDATELOB dar, wenn ein
darauffolgender Bereich des LOB-Feldes mittels mehrerer Aufrufe ersetzt wird.
Die Anzahl der eingefügten Zeichen ist entweder die Byte-Länge des im View
definierten LOB-Segments oder Null ( Wenn es benutzt wird, muss das durch das |
Ein UPDATELOB bearbeitet eine Datensatz, der durch ein zugehöriges
FIND-, READ-, GET- oder STORE-Statement in den Hold-Zustand gesetzt worden ist. Die
Verbindung ist entweder implizit über die zurzeit aktive Referenzierung oder explizit
mit (r)-Notation.
Der von dem zugehörigen Statement benutzte View und der vom
UPDATELOB-Statement benutzte View müssen auf dieselbe Datenbank- und
Dateinummer zugreifen. Dies ist automatisch sichergestellt, wenn die Views vom selben
DDM abgeleitet werden.
Falls der in operand3 angegebene Wert für die
Einfügeposition größer als die LOB-Länge ist, wird die Lücke mit Leerzeichen
aufgefüllt. Das bedeutet, dass Sie ein LOB-Feld an einer Stelle aktualisieren können,
die jenseits seiner Länge liegt.
Sie können nicht m Bytes durch n Bytes ersetzen - oder anders ausgedrückt: Es ist nicht zulässig, einen LOB-Teil durch ein Datensegment zu ersetzen, das eine andere Länge hat.
Der durch die Systemvariable *NUMBER zurückgelieferte
Wert ist die höchste Zuordnungsmarke, welche die Position innerhalb des LOB angibt, an
der die letzte Einfügung endete. Wenn eine Anzahl aufeinanderfolgender
Aktualisierungen gefordert wird, sollte dieser Wert immer als STARTING
AT-Wert für die nächste UPDATELOB-Ausführung beibehalten
werden.
Beispiel 1 - Neuen Datensatz abspeichern und LOB-Segment auffüllen
Beispiel 2 - LOB-Daten stückweise zu einem vorhandenen Datensatz hinzufügen
Example 4 - LOB-Daten in existenten Datensatz lesen und LOB-Segment aktualisieren
DEFINE DATA LOCAL
1 V1 VIEW OF ..
2 PERSONNEL-ID
2 NAME
1 V2 VIEW OF ..
2 LOBFIELD_SEGMENT /* LOB field defined in DDM with (A1024).
END-DEFINE
*
**===================================================
** Store new record
**===================================================
V1.PERSONNEL-ID := '12345678'
V1.NAME := 'Smith'
LAB1.
STORE V1 /* Store new record with 2 fixed length fields.
*
MOVE ALL 'X' TO LOBFIELD_SEGMENT
**===================================================
** Update LOB field
**===================================================
UPDATELOB (LAB1.) IN FILE V2 /* Insert segment of 1KB (LOBFIELD_SEGMENT) in LOB.
STARTING AT OFFSET = 2048 /* Store data in LOB range 2049-3072.
/* The first 2KB are auto filled with blanks by the database.
END TRANSACTION
END
DEFINE DATA LOCAL
1 V1 VIEW OF EMPLOYEES-V2009
2 PERSONNEL-ID
2 NAME
2 L@PICTURE
1 V2 VIEW OF EMPLOYEES-V2009
2 PICTURE_SEGMENT /* LOB field defined in DDM with (A1024).
2 REDEFINE PICTURE
3 PICTURE_B (B1024)
1 #OFF (I4)
END-DEFINE
*
**===================================================
** Read record to be updated
**===================================================
LAB1.
READ (1) V1 BY PERSONNEL-ID = '60008339' /* Read record and set into exclusive hold.
RESET #OFF /* Start to overwrite LOB field from the beginning.
/*===================================================
/* Read data from work file and put into LOB field
/*===================================================
READ WORK FILE 7 PICTURE_B /* Start to read picture data (.jpg) from work file.
LAB2.
UPDATELOB (LAB1.) IN FILE V2
STARTING AT OFFSET #OFF
#OFF := *NUMBER(LAB2.) /* Keep next position to append.
END-WORK
END-READ
**===================================================
END TRANSACTION
END
DEFINE DATA LOCAL
1 V1 VIEW OF EMPLOYEES-V2009
2 PERSONNEL-ID
2 NAME
2 L@PICTURE
1 V2 VIEW OF EMPLOYEES-V2009
1 V3 VIEW OF EMPLOYEES-V2009
2 PICTURE_SEGMENT /* LOB field defined in DDM with (A1024).
END-DEFINE
*
**===================================================
** Read record to be updated
**===================================================
LAB1.
READ V1 BY PERSONNEL-ID /* Read records.
IF L@PICTURE > 10240 THEN /* Check if LOB length is too high.
LAB2.
GET V2 RECORD *ISN(LAB1.) /* Set record to be updated into exclusive hold.
UPDATELOB (LAB2.) IN FILE V3
STARTING AT OFFSET 10240
TRUNCATE AT OFFSET /* Truncate LOB data beyond 10KB.
END TRANSACTION
END-IF
END-READ
END
DEFINE DATA LOCAL
1 V1 VIEW OF ..
2 NAME
1 V2 VIEW OF ..
2 DOCUMENT_SEGMENT /* LOB field defined in DDM with (A100).
1 #ISN (I4)
1 #POS (I4)
1 #LENGTH (I4) INIT <100>
END-DEFINE
*
**===================================================
** Read record to be updated
**===================================================
INPUT (AD=T)
/ ' Read record (ISN):' #ISN
*
G1.
GET V1 RECORD #ISN /* Get record with ISN and set into exclusive hold.
*
**===================================================
** Read LOB data and update segment of LOB field
**===================================================
R1.
READLOB V2 WITH ISN = #ISN
STARTING AT OFFSET = 3000
..
#POS := *NUMBER(R1.) - #LENGTH
..
IF ..
DOCUMENT_SEGMENT := ..
UPDATELOB (G1.) IN FILE V2 /* Update current segment in LOB field.
STARTING AT OFFSET #POS
END-IF
..
END-READLOB
*
END TRANSACTION
END