[MULTI-FETCH-clause] [RECORDS ] [IN ] [FILE ] view-name |
||||||||||||||
[PASSWORD= operand2]
|
||||||||||||||
[CIPHER= operand3]
|
||||||||||||||
[WITH
REPOSITION ]
|
||||||||||||||
[sequence/range-specification] | ||||||||||||||
[STARTING WITH
ISN= operand4]
|
||||||||||||||
[[IN ] SHARED HOLD [MODE =option]]
|
||||||||||||||
[SKIP [RECORDS ] IN
HOLD ] |
||||||||||||||
[WHERE logical-condition]
|
||||||||||||||
statement | ||||||||||||||
END-READ |
(ストラクチャードモードのみ) | |||||||||||||
LOOP |
(レポーティングモードのみ) |
このドキュメントでは、次のトピックについて説明します。
構文図で使用されている記号については、「構文記号」を参照してください。
関連ステートメント:ACCEPT/REJECT
| AT BREAK
| AT START OF DATA
| AT END OF DATA
| BACKOUT TRANSACTION
| BEFORE BREAK PROCESSING
| GET TRANSACTION DATA
| DELETE
| END TRANSACTION
| FIND
| HISTOGRAM
| GET
| GET SAME
| LIMIT
| PASSW
| PERFORM BREAK PROCESSING
| READLOB
| RETRY
| STORE
| UPDATE
| UPDATELOB
関連機能グループ:データベースへのアクセスと更新
READ
ステートメントは、データベースからレコードを読み取るために使用します。レコードは物理順、Adabas ISN 順、またはディスクリプタ(キー)フィールドの値順で取得できます。この READ
ステートメントでは、処理ループを開始します。
『プログラミングガイド』の次のセクションも参照してください。
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | オペランド参照 | ダイナミック定義 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand1 |
C | S | N | P | I | B * | ○ | × | ||||||||||||
operand2 |
C | S | A | ○ | × | |||||||||||||||
operand3 |
C | S | N | ○ | × | |||||||||||||||
operand4 |
C | S | N | P | I | B * | ○ | × |
* operand1
および operand4
のフォーマット B は、4 以下の長さで使用できます。
構文要素の説明:
構文要素 | 説明 | ||
---|---|---|---|
operand1 |
読み取るレコード数:
読み取るレコード数は、定数( 例: READ (5) IN EMPLOYEES ... MOVE 10 TO CNT(N2) READ (CNT) EMPLOYEES ... このステートメントでは、指定した制限が、 プロファイルまたはセッションパラメータ 注意:
|
||
ALL |
ALL オプション:
全レコードを読み取ることを強調するために、オプションでキーワード
|
||
MULTI-FETCH-clause |
MULTI-FETCH 節:
以下の「MULTI-FETCH 節」を参照してください。 |
||
view-name |
ビュー名:
レポーティングモードでは、 |
||
PASSWORD=operand2
|
PASSWORD および CIPHER 節:
これらの節は Adabas データベースにのみ適用可能です。Entire System Server では使用できません。
|
||
WITH REPOSITION |
WITH REPOSITION オプション:
このオプションは、 |
||
sequence/range-specification |
順序/範囲の指定:
このオプションでは、取得順序/範囲を指定します。「順序/範囲の指定」を参照してください。 |
||
STARTING WITH
ISN=operand4 |
STARTING WITH ISN 節:
この節は Adabas データベースにのみ適用されます。 Adabas へのアクセス
この節は、物理順または論理順(昇順/降順)の
例
この節は、処理を継続する次のレコードを簡単に指定するために、処理が中断された 例については、下記のプログラム |
||
[[IN] SHARED HOLD
[MODE=option]] |
SHARED HOLD 節:
注意: この節は"共有ホールド"状態で読み取られるレコードの配置に使用できます。レコードは、多数のユーザーが同時に共有ホールドにできます。レコードが共有ホールド状態にある限り、同時ユーザーによって排他的ホールドに設定できないため、更新から保護されます。このため、処理中はユーザーがレコードを更新できないので、レコードデータのデータ整合性が確保されます。 特に、異なる MU/PE オカレンス( このようなホールド状態は読み込み順序を保護する効果的な手段ですが、レコードをこの"ソフトロック"からいつ解放するかという基本的で重要な問題が生じます。この問題は個々のアプリケーションの局面によって異なるので、 |
||
MODE オプション
|
ホールド期間
|
説明
|
|
C |
レコードの読み込み時のみ。 | 読み込まれるレコードのバージョンのみが、レコードを最後に更新したユーザーによってコミットされるようにします。このオプションは実際にホールド状態でロックを設定するのではなく、読み込み時に別のユーザーによってレコードが排他的にホールドされないようにチェックするだけです。 | |
Q |
次の順序のレコードが読み込まれるまで。 | 次の場合に、レコードを共有ホールドから解放します。
|
|
S |
論理トランザクションが終了するまで。 | END TRANSACTION または BACKOUT TRANSACTION ステートメントで論理トランザクションが終了すると、レコードが共有ホールドから解放されます。
|
|
MODE=Q および MODE=S では、読み取り中のレコードが再度ホールドからリリースされるまで、他のユーザーが同時に更新できないようにします。
「例 8 - SHARED HOLD 節」も参照してください。 |
|||
SKIP RECORDS IN
HOLD |
SKIP RECORDS 節
注意: ホールド状態のレコードを読み込むとき、このレコードが別のユーザーによって同時にホールドされていると、Natural エラー NAT3145(Adabas レスポンスコード エラー NAT3145 は "クリーンデータ処理"を保証するための適切な対処ですが、ホールドされているレコードをスキップできると便利です。このようなレコードを処理せずにループ処理を続行しても問題がない場合は、
レコードがすでにホールドされていて、Natural エラー NAT3145 が発生する場合、以下の原因が考えられます。
「例 9 - SKIP RECORDS 節」も参照してください。 |
||
WHERE
logical-condition |
WHERE 節:
|
||
END-READ |
End of READ ステートメント:
ストラクチャードモードの場合、Natural の予約キーワード レポーティングモードでは、Natural のステートメント |
||
LOOP |
注意:
この節は、Adabas データベースでのみ使用できます。
MULTI-FETCH |
|
注意:[MULTI-FETCH OF
multi-fetch-factor]
は、データベースタイプ ADA
および ADA2
に対して評価されません。デフォルト処理モードが適用されます(プロファイルパラメータ MFSET
を参照)。MULTI-FETCH
節は、データベースタイプ ADA2
, で使用しても完全に無視されます(『コンフィグレーションユーティリティ』ドキュメントの「データベース管理システムの割り当て」を参照)。
詳細については、『プログラミングガイド』の「MULTI-FETCH 節」(Adabas)
注意:
このオプションは、基準データベースが Adabas の場合にのみ適用されます。
WITH REPOSITION
オプションでは、READ
ステートメントを再位置決めイベントに反応するように設定できます。これにより、アクティブな READ
ループ内で別の開始値に再位置決めを行うことができます。READ
ステートメントの処理は新しい開始値で継続します。
READ
ステートメントを WITH REPOSITION
オプション付きで使用すると、再位置決めイベントが 2 つの方法のいずれかで起動されます。
ESCAPE TOP
REPOSITION
ステートメントが実行され、ESCAPE TOP REPOSITION
ステートメントの実行時、Natural はループ開始への即時分岐を行い、再スタートを実行します。つまり、データベースは、検索値変数の現在の内容に従って、ファイルの新しいレコードに再位置決めを行います。同時に、ループカウンタ *COUNTER
をゼロにリセットします。
READ
ループがデータベースから次のレコードを取り出そうとして、システム変数 *COUNTER
の値が 0
であるとき。
注意:*COUNTER
が、アクティブな READ
ループ内で 0
に設定されている場合、現在のレコードの処理は続行されます。ループ開始への即時分岐は実行されません。Natural for Windows、Natural for UNIX、および Natural for OpenVMS では、この方法で再位置決めイベントを起動することはできません。この機能は、Natural
for Mainframes バージョンの以前のバージョンとの互換性のためにのみ保持されています。したがって、このプロセスを使用することはお勧めしません。
READ
ステートメントにループ制限(READ
(10) EMPLOYEES WITH REPOSITION ..
)があり、再スタートイベントが起動された場合、再位置決めが発生するまでにすでに処理されたレコード件数にかかわらず、ループは別の新しい 10 レコードを取得します。
ESCAPE TOP
REPOSITION
ステートメントが実行される場合、ただし、(WITH REPOSITION
キーワードが READ
ステートメントに設定されていないか、事後ループステートメントが READ
以外であるために)最も内側のループが再位置決めできないときは、対応するランタイムエラーが発行されます。
ESCAPE TOP
ステートメントは参照を許可しないので、最も内側の処理ループが READ ..WITH REPOSITION
ステートメントであれば、再位置決めイベントの開始だけができます。
再位置決めイベントは AT START OF DATA
セクションの実行を起動せず、ループ制限オペランド(変数の場合)の再評価も起動しません。
検索値が変更されなかった場合、ループは最初のループ開始のように同じレコードに再位置決めします。
取得順序/範囲の指定には、3 つの構文オプションを使用できます。
構文オプション 1:
[IN ] [PHYSICAL ] |
[SEQUENCE ]
|
構文オプション 2:
|
|||||||||||||||||
ISN |
operand6 | operand7 | |||||||||||||||
構文オプション 3:
[IN ] [LOGICAL ] |
[SEQUENCE ]
|
descriptor | ||||||||||||
|
operand6 | operand7 | ||||||||||||
|
operand6 TO operand7 |
|||||||||||||
|
operand6 |
注意:
ENDING
AT
、THRU
、TO
は使用できません。これらの比較演算子は HISTOGRAM
ステートメントにも有効です。
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | オペランド参照 | ダイナミック定義 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand5 |
S | A | ○ | × | ||||||||||||||||
operand6 |
C | S | A | N | P | I | F | B * | D | T | L | ○ | × | |||||||
operand7 |
C | S | A | N | P | I | F | B * | D | T | L | ○ | × |
* operand6
および operand7
のフォーマット B は、4 以下の長さでのみ使用できます。
構文要素の説明:
構文要素 | 説明 |
---|---|
READ
IN PHYSICAL SEQUENCE |
Read in Physical Sequence:
このオプションは、データベースに物理的に保存されている順にレコードを読み取る場合に使用します。
|
READ BY
ISN |
Read by ISN:
このオプションは、レコードを Adabas ISN(内部シーケンス番号)順に読み取るときに使用します。(キーワード
注意: |
READ IN
LOGICAL SEQUENCE |
Read in Logical Sequence:
このオプションは、レコードをディスクリプタ(キー)フィールドの値の順に読み取るために使用します。 ディスクリプタが指定されると、レコードはそのディスクプタの値の順序で読み取られます。順序制御には、ディスクリプタ、サブディスクリプタ、スーパーディスクリプタ、またはハイパーディスクリプタを使用できます。フォネティックディスクリプタ、ピリオディックグループ内のディスクリプタ、またはピリオディックグループフィールドを含むスーパーディスクリプタは使用できません。 ディスクリプタを指定しなかった場合、DDM に指定されたデフォルトのディスクリプタ( 順序制御に使用するディスクリプタが空値省略で定義されている場合(Adabas のみ)、ディスクリプタ値が空値であるレコードは読み取られません。 順序制御に使用するディスクリプタがマルチプルバリューフィールドの場合(Adabas のみ)、存在する値の個数に応じて同じレコードが何回も読み取られます。 注意: |
ASCENDING | DESCENDING | VARIABLE | DYNAMIC
SEQUENCE |
昇順/降順:
この節は、Adabas、XML データベース、および SQL データベースにのみ適用されます。 この節を使用して、レコードを昇順または降順のどちらで読み取るかを指定できます。
注意: |
STARTING
FROM ... ENDING AT/TO |
STARTING FROM/ENDING AT 節
レコードを終了値に制限するには、包括的な範囲を示す用語 |
THRU/ENDING AT |
THRU/ENDING AT オプション:
内部的に、読み取る範囲の終了を決定するために、Natural は終了値を超えるレコードを 1 件読み取ります。終了値に到達したために
|
TO |
TO オプション:
キーワード |
次のリストは、THRU/ENDING
AT
および TO
オプションの機能上の違いを示しています。
THRU/ENDING AT | TO |
---|---|
終了値に達したために READ ループが終了するとき、ビューには "範囲外" の最初のレコードが含まれます。
|
終了値に達したために READ ループが終了するとき、ビューには指定した範囲の最後のレコードが含まれます。
|
終了値変数が READ ループ中に修正された場合、次のレコードの読み取り時に新しい値が終了値チェックに使用されます。
|
終了値変数は READ ループ開始時にのみ評価されます。READ ループ中の以降の修正はすべて無効です。
|
範囲が不正な場合(例えば、READ .. = 'B' THRU
'A' )、レコードが返されないだけで、データベースエラーは発生しません。
|
値範囲を降順で供給してはならないため、不正な範囲はデータベースエラー(例:RC=61)となります。 |
READ .. DESCENDING が、開始値および終了値と一緒に使用される場合、開始値はファイルでの位置決めに使用され、終了値は Natural で "範囲終了" をチェックするために使用されます。したがって、開始値は終了値以上の値です。
|
両方の値がデータベースに渡されるため、それらは昇順で出現する必要があります。つまり、昇順または降順で読み取っているかどうかに関係なく、開始値は終了値以下の値です。 |
範囲のオーバーフローをチェックするために、ディスクリプタ値は基準データベースビューに出現する必要があります。つまり、それはレコードバッファに返される必要があります。 | ディスクリプタは、返されるレコードフィールドに必要ではありません。 |
Adabas マルチバリューフィールド(MU フィールド)またはサブ/スーパー/ハイパーディスクリプタに対して終了値チェックはできません。また、プログラムコンパイル時に構文エラー NAT0160 を引き起こします。 | MU フィールドおよびサブ/スーパー/ハイパーディスクリプタに対して終了値を指定できます。 |
すべてのデータベースに使用できます。 | すべてのデータベースに使用できます。 |
注意:READ
/HISTOGRAM
THRU
/ENDING AT
の結果は、Natural とアクセスされたデータベースが別のプラットフォーム上にあり、照合順序が異なる場合、READ
/HISTOGRAM
TO
の結果とは異なる可能性があります。
Natural システム変数 *ISN
および *COUNTER
が READ
ステートメントで使用可能です。
これらのシステム変数は、P10 のフォーマットと長さで定義されています。このフォーマット/長さは変更できません。
システム変数の使用方法について次に説明します。
システム変数 | 説明 |
---|---|
*ISN |
システム変数 |
*COUNTER |
システム変数 *COUNTER には、入力した処理ループの回数が含まれます。
|
** Example 'REAEX1S': READ (structured mode) ************************************************************************ DEFINE DATA LOCAL 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 PERSONNEL-ID 2 NAME 1 VEHIC-VIEW VIEW OF VEHICLES 2 PERSONNEL-ID 2 MAKE END-DEFINE * LIMIT 3 * WRITE 'READ IN PHYSICAL SEQUENCE' READ EMPLOY-VIEW IN PHYSICAL SEQUENCE DISPLAY NOTITLE PERSONNEL-ID NAME *ISN *COUNTER END-READ * WRITE / 'READ IN ISN SEQUENCE' READ EMPLOY-VIEW BY ISN STARTING FROM 1 ENDING AT 3 DISPLAY PERSONNEL-ID NAME *ISN *COUNTER END-READ * WRITE / 'READ IN NAME SEQUENCE' READ EMPLOY-VIEW BY NAME DISPLAY PERSONNEL-ID NAME *ISN *COUNTER END-READ * WRITE / 'READ IN NAME SEQUENCE STARTING FROM ''M''' READ EMPLOY-VIEW BY NAME STARTING FROM 'M' DISPLAY PERSONNEL-ID NAME *ISN *COUNTER END-READ * END
PERSONNEL NAME ISN CNT ID --------- -------------------- ----------- ----------- READ IN PHYSICAL SEQUENCE 50005800 ADAM 1 1 50005600 MORENO 2 2 50005500 BLOND 3 3 READ IN ISN SEQUENCE 50005800 ADAM 1 1 50005600 MORENO 2 2 50005500 BLOND 3 3 READ IN NAME SEQUENCE 60008339 ABELLAN 478 1 30000231 ACHIESON 878 2 50005800 ADAM 1 3 READ IN NAME SEQUENCE STARTING FROM 'M' 30008125 MACDONALD 923 1 20028700 MACKARNESS 765 2 40000045 MADSEN 508 3
レポーティングモードの例については、次のプログラムを参照してください:REAEX1R
DEFINE DATA LOCAL 1 MYVIEW VIEW OF ... 2 NAME 1 #STARTVAL (A20) INIT <'A'> 1 #ATTR (C) END-DEFINE ... SET KEY PF3 ... READ MYVIEW WITH REPOSITION BY NAME = #STARTVAL INPUT (IP=OFF AD=O) 'NAME:' NAME / 'Enter new start value for repositioning:' #STARTVAL (AD=MT CV=#ATTR) / 'Press PF3 to stop' IF *PF-KEY = 'PF3' THEN STOP END-IF IF #ATTR MODIFIED THEN ESCAPE TOP REPOSITION END-IF END-READ ...
DEFINE DATA LOCAL 1 MYVIEW VIEW OF ... 2 NAME 1 #STARTVAL (A20) INIT <'A'> 1 #ATTR (C) END-DEFINE ... SET KEY PF3 ... READ MYVIEW WITH REPOSITION BY NAME = #STARTVAL INPUT (IP=OFF AD=O) 'NAME:' NAME / 'Enter new start value for repositioning:' #STARTVAL (AD=MT CV=#ATTR) / 'Press PF3 to stop' IF *PF-KEY = 'PF3' THEN STOP END-IF IF #ATTR MODIFIED THEN RESET *COUNTER END-IF END-READ ...
次の例では、まず EMPLOYEES
ファイルから、ディスクリプタ NAME
の値で論理順にレコードを読み取ります。次に、EMPLOYEES
ファイルの人事番号を検索条件として、VEHICLES
ファイルを FIND
ステートメントで検索します。結果のレポートには、読み取られた従業員の名前(EMPLOYEES
ファイルから読み取られる)と、この従業員が所有する自動車のモデル(VEHICLES
ファイルから読み取られる)が示されます。1 人で何台も自動車を所有している場合、同一名で複数行が出力されます。
** Example 'REAEX2': READ and FIND combination ************************************************************************ DEFINE DATA LOCAL 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 PERSONNEL-ID 2 FIRST-NAME 2 NAME 2 CITY 1 VEH-VIEW VIEW OF VEHICLES 2 PERSONNEL-ID 2 MAKE END-DEFINE * LIMIT 10 * RD. READ EMPLOY-VIEW BY NAME STARTING FROM 'JONES' SUSPEND IDENTICAL SUPPRESS FD. FIND VEH-VIEW WITH PERSONNEL-ID = PERSONNEL-ID (RD.) IF NO RECORDS FOUND ENTER END-NOREC DISPLAY NOTITLE (ES=OFF IS=ON ZP=ON AL=15) PERSONNEL-ID (RD.) FIRST-NAME (RD.) MAKE (FD.) (IS=OFF) END-FIND END-READ END
PERSONNEL FIRST-NAME MAKE ID --------------- --------------- --------------- 20007500 VIRGINIA CHRYSLER 20008400 MARSHA CHRYSLER CHRYSLER 20021100 ROBERT GENERAL MOTORS 20000800 LILLY FORD MG 20001100 EDWARD GENERAL MOTORS 20002000 MARTHA GENERAL MOTORS 20003400 LAUREL GENERAL MOTORS 30034045 KEVIN DATSUN 30034233 GREGORY FORD 11400319 MANFRED
** Example 'READSCND': READ (with DESCENDING SEQUENCE) ************************************************************************ DEFINE DATA LOCAL 1 EMPL VIEW OF EMPLOYEES 2 NAME 2 FIRST-NAME 2 BIRTH END-DEFINE * READ (10) EMPL IN DESCENDING SEQUENCE BY NAME FROM 'ZZZ' DISPLAY *ISN NAME FIRST-NAME BIRTH (EM=YYYY-MM-DD) END-READ END
** Example 'REAVSEQ': READ (with VARIABLE SEQUENCE) ************************************************************************ DEFINE DATA LOCAL 1 EMPL VIEW OF EMPLOYEES 2 NAME 2 FIRST-NAME 2 BIRTH * 1 #DIR (A1) 1 #STARTVALUE (A20) END-DEFINE * SET KEY PF7 PF8 * INPUT 'Select READ direction' // 'Press' 08T 'PF7' (I) 21T 'to read backward' / 08T 'PF8' (I) 'or' 'ENTER' (I) 21T 'to read forward' * IF *PF-KEY = 'PF7' MOVE 'D' TO #DIR MOVE 'ZZZ' TO #STARTVALUE ELSE MOVE 'A' TO #DIR MOVE 'A' TO #STARTVALUE END-IF * READ (10) EMPL IN VARIABLE #DIR SEQUENCE BY NAME FROM #STARTVALUE DISPLAY *ISN NAME FIRST-NAME BIRTH (EM=YYYY-MM-DD) END-READ END
DEFINE DATA LOCAL 1 #DIRECTION (A1) INIT <'A'> /* 'A' = ASCENDING 1 #EMPVIEW VIEW OF EMPLOYEES 2 NAME ... END-DEFINE ... READ #EMPVIEW IN DYNAMIC #DIRECTION SEQUENCE BY NAME = 'SMITH' INPUT (AD=O) NAME / 'Press PF7 to scroll in DESCENDING sequence' / 'Press PF8 to scroll in ASCENDING sequence' .. IF *PF-KEY = 'PF7' THEN MOVE 'D' TO #DIRECTION END-IF IF *PF-KEY = 'PF8' THEN MOVE 'A' TO #DIRECTION END-IF END-READ ...
** Example 'REASISND': READ (with STARTING WITH ISN) ************************************************************************ DEFINE DATA LOCAL 1 EMPL VIEW OF EMPLOYEES 2 NAME 2 FIRST-NAME 2 BIRTH * 1 #DIR (A1) 1 #STARTVAL (A20) 1 #STARTISN (N8) END-DEFINE * SET KEY PF3 PF7 PF8 * MOVE 'ADKINSON' TO #STARTVAL * READ (9) EMPL BY NAME = #STARTVAL WRITE *ISN NAME FIRST-NAME BIRTH (EM=YYYY-MM-DD) *COUNTER IF *COUNTER = 5 THEN MOVE NAME TO #STARTVAL MOVE *ISN TO #STARTISN END-IF END-READ * #DIR := 'A' * REPEAT READ EMPL IN VARIABLE #DIR BY NAME = #STARTVAL STARTING WITH ISN = #STARTISN MOVE NAME TO #STARTVAL MOVE *ISN TO #STARTISN INPUT NO ERASE (IP=OFF AD=O) 15/01 *ISN NAME FIRST-NAME BIRTH (EM=YYYY-MM-DD) // 'Direction:' #DIR // 'Press PF3 to stop' / ' PF7 to go step back' / ' PF8 to go step forward' / ' ENTER to continue in that direction' /* IF *PF-KEY = 'PF7' AND #DIR = 'A' MOVE 'D' TO #DIR ESCAPE BOTTOM END-IF IF *PF-KEY = 'PF8' AND #DIR = 'D' MOVE 'A' TO #DIR ESCAPE BOTTOM END-IF IF *PF-KEY = 'PF3' STOP END-IF END-READ /* IF *COUNTER(0290) = 0 STOP END-IF END-REPEAT END
READ EMPL-VIEW WITH NAME = ... IN SHARED HOLD MODE=Q /* Record in shared hold until next record is read. ... GET EMPL-VIEW *ISN /* The record remains unchanged! ... END-READ
READ EMPL-VIEW WITH NAME = ... /* Records found are put in hold while reading. SKIP RECORDS IN HOLD /* Records already held by other users are skipped ... /* to prevent error NAT3145. UPDATE END TRANSACTION END-READ