READLOB

READLOB

ALL
(operand1)

[IN] [FILE] view-name
  [PASSWORD=operand2]
  [CIPHER=operand3]
  [[WITH] ISN [=] operand4]
  [[STARTING] [AT] OFFSET [=] operand5]
  statement
END-READLOB (ストラクチャードモードのみ)
LOOP (レポーティングモードのみ)

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

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

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

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


関数

READLOB ステートメントは、単一レコードで使用します。そのレコードでは、定義された LOB フィールド(Large OBject フィールド)がループ処理中に固定長のセグメントで読み取られます。この LOB フィールドの読み取りにのみ適用されます。

ループ開始時に、LOB フィールド内のオフセットが最初のデータの取得元に設定されます。次のループの反復では、最後のセグメントに続くセグメントが返されます。LOB データエンドに到達すると、ループが終了します。

このステートメントでは、処理ループを開始します。『プログラミングガイド』の「ループ処理」も参照してください。

制限

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

構文説明

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

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

* operand1 operand4 および operand5 のフォーマット B は、4 以下の長さでのみ使用できます。

構文要素の説明:

構文要素 説明
operand1
読み取る LOB セグメント数:

実行するループ実行の数は、数値定数(04294967295 )や数値変数名として、operand1 を(キーワード READLOB の直後にカッコで囲んで)指定することで制限できます。

例:

READLOB (5) IN FILE VIEW01 ...
#CNT := 10
READLOB (#CNT) IN FILE VIEW01 ...

このステートメントでは、指定した制限が、LIMIT ステートメントで設定した制限より優先されます。プロファイルまたはセッションパラメータ LT で設定された制限のほうが小さい場合、LT 制限が適用されます。

注意:
operand1 は、READLOB の開始時に評価されます。operand1 の値が READLOB ループ内で変更されても、ループの反復数には影響しません。

ALL
ALL オプション:

LOB データを末尾まで読み込むことを明示するため、オプションでキーワード ALL を指定できます。

operand1ALL が省略された場合、ALL オプションがデフォルトで使用されます。

view-name
ビュー名:

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

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

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

  • LOB フィールドは、DDM で固定長(非ダイナミック。LOB フィールドのセグメント長に対応します)で定義する必要があります。

PASSWORD=operand2
CIPHER=operand3

PASSWORD および CIPHER 節:

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

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

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

WITH ISN=operand4
WITH ISN オプション:

このオプションは、READLOB ステートメントによってアクセスされるレコードの ISN を指定するために使用します。完全なループ実行中、このレコードのみがフェッチされます。

operand4 は、数値定数、ユーザー定義変数の形式、または Natural システム変数 *ISN によって提供されています。フィールドは READLOB 実行によって変更されません。

注意:
operand4 は、READLOB の開始時に評価されます。operand4 の値が READLOB ループ内で変更されても、フェッチされるレコードには影響しません。

このオプションを省略すると、最後にアクティブになったデータベースステートメントの *ISN フィールドがデフォルトで使用されます。

STARTING AT OFFSET=operand5
STARTING AT OFFSET 節:

最初のセグメント読み取りが開始される LOB フィールド内に開始オフセットを指定します。LOB フィールドの最初のバイトはオフセットゼロ(0)です。

operand5 は数値定数の形式で、またはユーザー定義変数として、小数部なしで指定する必要があります。フィールドは READLOB 実行によって変更されません。

この節を省略すると、開始オフセット(0)が想定され、LOB フィールドが先頭から読み取られます。

後述する「READLOB で使用可能なシステム変数」で説明されている処理中の*NUMBERも参照してください。

END-READLOB
READLOB ステートメントの終了:

ストラクチャードモードの場合、Natural の予約キーワード END-READLOB を使用して READLOB ステートメントを終了させる必要があります。

レポーティングモードでは、Natural のステートメント LOOP を使用して READLOB ステートメントを終了します。

LOOP

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

Natural システム変数 *ISN*COUNTER および *NUMBERREADLOB ステートメントで提供されます。

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

READLOB ステートメントとともに使用する場合の Natural システム変数の目的は、次のとおりです。

システム変数 説明
*ISN 現在処理中のレコードの Adabas ISN が入ります。READLOB ステートメントは常に同じレコードにアクセスするため、返される *ISN 値はすべてのループの反復で同じです。
*COUNTER 処理ループが通過した回数が含まれます。
*NUMBER コールの前: セグメントが読み取られる LOB フィールドにバイトオフセットを指定します。値ゼロ(0)は、LOB フィールドの左端のバイトを表します。

これは、最初のループ反復には適用されません。この場合、読み取りオフセットは STARTING AT OFFSET 節によって決定されます。

コールの後: データが検出された場合(つまり、オフセットが LOB フィールド長未満であった場合)、オフセットにセグメント長を加えた値を受け取ります。これにより、*NUMBER の値が LOB フィールド全体の長さより大きくなる可能性があります。

データが見つからなかった場合(つまり、オフセットが LOB フィールド長以上であった場合)、*NUMBER の値は変更されません。

LOB フィールドで連続した読み取りが要求された場合、*NUMBER 値を READLOB 内で変更してはなりません。これは、後続のループ反復において次のセグメントで正確に継続するためのオフセットが含まれているためです。ただし、LOB フィールド内の別の場所で継続(再配置)する必要がある場合は、*NUMBER 値をこのオフセットに変更できます。*NUMBER がリセットされた場合、LOB の先頭から次のセグメントに移動します。*NUMBER(n) 増えた場合、このバイト数が LOB フィールド処理でスキップされます。

機能上の考慮事項

  • READLOB ステートメントは常に、ホールド状態にないレコードを読み取ります。LOB データの安定性を保証するため(つまり、他のユーザーによる更新を防止するため)、READLOB がLOB フィールドを参照している間、データベースステートメントでレコードをホールド状態に設定し、ISN を以下のいずれかに設定できます

    • UPDATE または DELETE が外部 READ または FIND ステートメントを参照しているため、排他的ホールドに設定、または

    • READ または FIND ステートメントで適用される明示的な IN SHARED HOLD オプションにより共有ホールドに設定。追加のサブパラメータ MODE=Q が使用されている場合、読み取りシーケンスで次のレコードがフェッチされると、レコードは自動的にホールドからリリースされます。

  • READLOB ステートメントは常に、ホールド状態にないレコードを読み取るため、UPDATEDELETE または GET SAME ステートメントは READLOB ステートメントを参照してはいけません。

例 1 - READ ループからのレコード番号の取得

DEFINE DATA LOCAL
1 VIEW01 VIEW OF ..
  2 NAME 
  2 L@LOBFIELD
1 VIEW02 VIEW OF ..
  2 LOBFIELD_SEGMENT                /* LOB field defined in DDM with (A1000).
END-DEFINE
*
READ VIEW01 BY NAME = 'SMITH'       /* Outer statement reads all demanded record 
                                    /* fields, except the LOB field.
     IN SHARED HOLD MODE=Q          /* Set record into shared hold to enforce LOB 
                                    /* data stability during READLOB.
  DISPLAY NAME 'Total-length LOB-field' L@LOBFIELD 
  READLOB VIEW02                    /* Record number used from active record of 
                                    /* READ statement.
                                    /* LOB is read in segments with length 1000. 
      STARTING AT OFFSET = 2000     /* Start to read the LOB field at byte 2000.
    WRITE 'Loop counter:' *COUNTER  10X ' Next offset:' *NUMBER
    PRINT VIEW02.LOBFIELD_SEGMENT  
  END-READLOB
END-READ   
END

例 2 - ユーザー定義の値によるレコード番号の取得

DEFINE DATA LOCAL
1 #ISN  (I4)
1 #CNT  (I4)
1 #OFF  (I4)
1 VIEW02 VIEW OF ..
  2 LOBFIELD_SEGMENT            /* LOB field defined in DDM with (A1000).
END-DEFINE
*
INPUT (AD=T)
  / ' Read record (ISN):' #ISN
  / 'Number of segments:' #CNT
  / '   Start at offset:' #OFF
* 
READLOB (#CNT) VIEW02           /* Read max. (#CNT) segments with length 1000.
    WITH ISN = #ISN             /* Record number provided by user.
                                /* Record is not in hold.
    STARTING AT OFFSET = #OFF   /* Start to read the LOB field at byte (#OFF).
  WRITE 'Loop counter:' *COUNTER  10X ' Next offset:' *NUMBER
  PRINT VIEW02.LOBFIELD_SEGMENT  
END-READLOB
END

例 3 - READ ループからのレコード番号の取得(排他的ホールドあり)

DEFINE DATA LOCAL
1 VIEW01 VIEW OF ..
  2 NAME 
1 VIEW02 VIEW OF ..
  2 LOBFIELD_SEGMENT           /* LOB field defined in DDM with (A1000).
END-DEFINE
*
R1. READ VIEW01 BY NAME = 'SMITH'/* Outer statement reads all demanded  
                                 /* record fields, except the LOB field.
  DISPLAY NAME 
  READLOB VIEW02            /* Record number from active record of READ.
                            /* LOB is read in segments with length 1000. 
      STARTING AT OFFSET = 2000 /* Start to read LOB field at byte 2000. 
    WRITE 'Loop counter:' *COUNTER 10X ' Next offset:' *NUMBER
    PRINT VIEW02.LOBFIELD_SEGMENT  
  END-READLOB
  ...
  UPDATE (R1.)            /* Set record into exclusive hold that 
                          /* enforces LOB data stability during READLOB.
  END OF TRANSACTION
END-READ   
END