UPDATELOB [OF ] [RECORD ] [(r)] [IN ] [FILE ] view-name |
|||||
[PASSWORD =operand1]
|
|||||
[CIPHER =operand2]
|
|||||
[[STARTING ] [AT ] OFFSET [=] operand3]
|
|||||
TRUNCATE |
このドキュメントでは、次のトピックについて説明します。
構文図で使用されている記号については、「構文記号」を参照してください。
関連ステートメント:READ
| FIND
| GET
| READLOB
| UPDATE
関連機能グループ:データベースへのアクセスと更新
UPDATELOB
ステートメントは、データベースレコードの LOB フィールド(Large OBject フィールド)のデータセグメントを更新するために使用します。値の修正位置は自由に選択できます。更新するレコードは、FIND
、READ
、GET
ステートメントで事前に選択しているか、または STORE
ステートメントで作成していることが必要です。
UPDATELOB
ステートメントの使用により、対応する FIND
、READ
または GET
ステートメントで選択された各レコードは排他的ホールドの状態になります。
詳細については、『プログラミングガイド』の「レコードホールドロジック」を参照してください。
UPDATELOB
ステートメント
は、Adabas データベースにアクセスするためにのみ使用できます。
を、更新するレコードを選択するステートメントと同一行に入力しないでください。
は、1 つの LOB フィールドの更新にのみ適用されます。
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | オペランド参照 | ダイナミック定義 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand1 |
C | S | A | ○ | × | |||||||||||||||
operand2 |
C | S | N | ○ | × | |||||||||||||||
operand3 |
C | S | N | P | I | B * | ○ | × |
* operand3
のフォーマット B は、4 以下の長さで使用できます。
構文要素の説明:
構文要素 | 説明 |
---|---|
(r) |
ステートメント参照:
表記 参照指定がなければ、 注意: |
view-name |
ビュー名:
|
PASSWORD および CIPHER 節:
|
|
STARTING AT
OFFSET=operand3 |
STARTING AT OFFSET 節:
操作が実行される LOB フィールド内に開始オフセットを指定します。LOB フィールドの一番左のバイトはオフセットゼロ(
この節が省略されている場合は、開始オフセット( |
TRUNCATE 節:
この節を省略すると、挿入されたセグメントの後のデータが保持されます。 |
Natural システム変数 *NUMBER
は、UPDATELOB
ステートメントで提供されています。
このシステム変数は、P10 のフォーマットと長さで定義されています。このフォーマット/長さは変更できません。
システム変数 | 説明 |
---|---|
*NUMBER |
システム変数 *NUMBER は、開始オフセットと挿入された文字数の合計を返します。LOB フィールドの連続する領域が複数の呼び出しに置き換えられる場合、この値は次の UPDATELOB の開始オフセットを表します。
|
UPDATELOB
は、関連する FIND
、READ
、GET
または STORE
ステートメントによってホールドに設定されたレコードを操作します。リンクは、現行のアクティブなリファレンスを介して暗黙的であるか、または (r)
表記により明示的です。
関連するステートメントによって使用されるビューと、UPDATELOB
によって使用されるビューは、同じデータベースとファイル番号にアクセスする必要があります。ビューが同じデータ定義モジュール(DDM)から派生している場合、これは自動的に確認されます。
挿入位置 operand3
が LOB 長より大きい場合は、ギャップに空白が入力されます。つまり、LOB フィールドをそのフィールド長を超えた位置で更新できます。
m バイトを n バイトに置き換えることはできません。つまり、LOB 部分を異なる長さのデータセグメントに置き換えることはできません。
*NUMBER
で返される値は、最後の挿入が終了した LOB 内の位置を示す最高値です。連続した更新操作が要求された場合、この値は常に次回の UPDATELOB
実行の STARTING AT
値として保持する必要があります。
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 1 KB SEGMENT (LOBFIELD_SEGMENT) /* IN LOB. STARTING AT OFFSET = 2048 /* STORE DATA IN LOB RANGE 2049-3072. /* FIRST 2 KBS ARE AUTO-FILLED WITH BLANKS BY THE DB. 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