UPDATELOB

UPDATELOB[OF] [RECORD] [(r)] [IN] [FILE] view-name
  [PASSWORD=operand1]
  [CIPHER=operand2]
  [[STARTING] [AT] OFFSET [=] operand3]

TRUNCATE

[REMAINDER]
[AT] OFFSET

このドキュメントでは、次のトピックについて説明します。

構文図で使用されている記号については、「構文記号」を参照してください。

関連ステートメント:READ | FIND | GET | READLOB | UPDATE

関連機能グループ:データベースへのアクセスと更新


関数

UPDATELOB ステートメントは、データベースレコードの LOB フィールド(Large OBject フィールド)のデータセグメントを更新するために使用します。値の修正位置は自由に選択できます。更新するレコードは、FINDREADGET ステートメントで事前に選択しているか、または STORE ステートメントで作成していることが必要です。

ホールド状態

UPDATELOB ステートメントの使用により、対応する FINDREAD または GET ステートメントで選択された各レコードは排他的ホールドの状態になります。

詳細については、『プログラミングガイド』の「レコードホールドロジック」を参照してください。

制限

UPDATELOB ステートメント

  • は、Adabas データベースにアクセスするためにのみ使用できます。

  • を、更新するレコードを選択するステートメントと同一行に入力しないでください。

  • は、1 つの LOB フィールドの更新にのみ適用されます。

構文説明

オペランド定義テーブル:

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
operand1 C S       A                         ×
operand2 C S           N                     ×
operand3 C S           N P I   B *             ×

* operand3 のフォーマット B は、4 以下の長さで使用できます。

構文要素の説明:

構文要素 説明
(r)
ステートメント参照:

表記 (r) を使用して、修正するレコードが読み込まれたか、または作成されたステートメントを示すことができます。r は、ソースコード行番号またはステートメントラベルとして指定できます。FINDREADGET または STORE ステートメントを参照できます。

参照指定がなければ、UPDATELOB ステートメントでは、一番内側のアクティブな READ または FIND 処理ループが参照されます。アクティブな READ または FIND ループがない場合、このステートメントより前の最後の GET ステートメントが参照されます。STORE ステートメントを参照するには、常に (r) 表記を指定する必要があります。

注意:
UPDATELOB ステートメントは、参照している READ または FIND ループ内に指定する必要があります。

view-name
ビュー名:

view-name としてビューの名前を指定します。この名前は、DEFINE DATA ステートメント内、あるいはプログラム外のグローバルデータエリアまたはローカルデータエリアに事前に定義しておく必要があります。

  • ビューは単一の値の LOB フィールドだけを含み、追加フィールドは指定できません。

  • LOB が MU または PE フィールドの場合、一意のオカレンスのみを指定してください。範囲表記は使用できません。

  • LOB フィールドは、ビュー内で固定長(非ダイナミック長)で定義する必要があります。

PASSWORD=operand1
CIPHER=operand2

PASSWORD および CIPHER 節:

PASSWORD 節は、パスワード保護されているファイルからデータを取得するときのパスワードの指定に使用します。

CIPHER 節は、暗号化されているファイルからデータを取得するときのサイファキーの指定に使用します。

詳細については、ステートメント FIND および PASSW を参照してください。

STARTING AT OFFSET=operand3
STARTING AT OFFSET 節:

操作が実行される LOB フィールド内に開始オフセットを指定します。LOB フィールドの一番左のバイトはオフセットゼロ(0)です。

operand3 値定数の形式で、またはユーザー定義変数として、小数部なしで指定する必要があります。フィールドは UPDATELOB 実行によって変更されません。オフセット値が LOB 長より大きい場合は、ギャップに空白が入力されます。つまり、LOB フィールドはそのフィールドの長さを超えた位置で更新できます。

この節が省略されている場合は、開始オフセット(0)が想定されます。

TRUNCATE REMAINDER
または
TRUNCATE AT OFFSET

TRUNCATE 節:

TRUNCATE REMAINDER を指定した場合は、新しいセグメントが LOB フィールドに書き込まれた後、残りの LOB フィールドデータが切り捨てられます。これにより、挿入されたセグメントの末尾が LOB フィールドの末尾になります。

TRUNCATE AT OFFSET を指定した場合は、指定した開始オフセットの後のデータは切り捨てられます。LOB フィールドへのセグメントの挿入は実行されません。その後、LOB 長は operand3 と等しくなります。

この節を省略すると、挿入されたセグメントの後のデータが保持されます。

UPDATELOB で使用可能なシステム変数

Natural システム変数 *NUMBER は、UPDATELOB ステートメントで提供されています。

このシステム変数は、P10 のフォーマットと長さで定義されています。このフォーマット/長さは変更できません。

システム変数 説明
*NUMBER システム変数 *NUMBER は、開始オフセットと挿入された文字数の合計を返します。LOB フィールドの連続する領域が複数の呼び出しに置き換えられる場合、この値は次の UPDATELOB の開始オフセットを表します。

TRUNCATE AT OFFSET 節を指定した場合、挿入される文字数は、ビューで定義された LOB セグメントのバイト長またはゼロ(0)のいずれかです。

UPDATELOB ステートメントによって返される *NUMBER フィールドは、使用時に常に参照ラベルまたは番号(*NUMBER(0430) など)が提供されている必要があります。

機能上の考慮事項

  • UPDATELOB は、関連する FINDREADGET または STORE ステートメントによってホールドに設定されたレコードを操作します。リンクは、現行のアクティブなリファレンスを介して暗黙的であるか、または (r) 表記により明示的です。

  • 関連するステートメントによって使用されるビューと、UPDATELOB によって使用されるビューは、同じデータベースとファイル番号にアクセスする必要があります。ビューが同じデータ定義モジュール(DDM)から派生している場合、これは自動的に確認されます。

  • 挿入位置 operand3 が LOB 長より大きい場合は、ギャップに空白が入力されます。つまり、LOB フィールドをそのフィールド長を超えた位置で更新できます。

  • m バイトを n バイトに置き換えることはできません。つまり、LOB 部分を異なる長さのデータセグメントに置き換えることはできません。

  • *NUMBER で返される値は、最後の挿入が終了した LOB 内の位置を示す最高値です。連続した更新操作が要求された場合、この値は常に次回の UPDATELOB 実行の STARTING AT 値として保持する必要があります。

例 1 - 新しいレコードを保存し、LOB セグメントを入力する

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

例 2 - LOB データを存在するレコードに追加する(ピース単位)

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

例 3 - LOB フィールドを切り捨てる

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

例 4 - LOB データを既存のレコードに読み取り、LOB セグメントを更新する

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