UPDATELOB [OF ]
[RECORD ]
[(r)] [IN ]
[FILE ] view-name |
|||||
[PASSWORD =operand1]
|
|||||
[CIPHER =operand2]
|
|||||
[[STARTING ]
[AT ] OFFSET
[=] operand3]
|
|||||
TRUNCATE |
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
| 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