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