READ |
ALL |
[MULTI-FETCH-clause] [RECORDS ] [IN ] [FILE ] view-name |
||||||
BROWSE |
(operand1) | |||||||
[PASSWORD= operand2]
|
||||||||
[CIPHER= operand3]
|
||||||||
[WITH REPOSITION ]
|
||||||||
[sequence/range-specification] | ||||||||
[STARTING WITH ISN= operand4]
|
||||||||
[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 | RETRY | STORE | UPDATE
関連機能グループ:「データベースへのアクセスと更新」
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 |
読み取るレコード数:
読み取るレコード数は、operand1 を(キーワード READ (5) IN EMPLOYEES ... MOVE 10 TO CNT(N2) READ (CNT) EMPLOYEES ... このステートメントでは、指定した制限が、 プロファイルまたはセッションパラメータ 注意:
|
---|---|
ALL | 全レコードを読み取ることを強調するために、オプションでキーワード ALL を指定できます。
|
MULTI-FETCH-clause | 以下の「MULTI-FETCH 節」を参照してください。 |
view-name |
ビュー名:
view-name として、ビューの名前を指定します。この名前は、 レポーティングモードでは、view-name を DDM の名前にすることもできます。 |
PASSWORD |
PASSWORD および CYPHER 節:
これらの節は Adabas または VSAM データベースにのみ適用可能です。 Entire System Server では使用できません。
|
WITH REPOSITION | このオプションは、READ ステートメントを再位置決めイベントに反応するように設定するために使用します。 「WITH REPOSITION オプション」を参照してください。
|
sequence/range-specification | このオプションでは、取得順序/範囲を指定します。 「順序/範囲の指定」を参照してください。 |
STARTING WITH ISN=operand4 |
この節は Adabas および VSAM データベースにのみ適用されます。 Adabas へのアクセス
この節は、物理順または論理順(昇順/降順)の
VSAM へのアクセス
この節は物理順でのみ使用できます。 指定される値(operand4)は、VSAM RBA(ESDS の相対バイトアドレス)または RRN(RRDS の相対レコード番号)を表し、読み取り操作の開始値として使用されます。 例
この節は、処理を継続する次のレコードを簡単に指定するために、処理が中断された 例については、下記のプログラム REASISND を参照してください。 |
WHERE logical-condition | 「WHERE 節」を参照してください。 |
END-READ | READ ステートメントを終了するには、Natural 予約キーワード END-READ を使用する必要があります。
|
注意:
この節は、Adabas または DB2 データベースでのみ使用できます。
MULTI-FETCH |
|
詳細については、『プログラミングガイド』の「MULTI-FETCH 節」(Adabas)、または『データベース管理システムインターフェイス』ドキュメントの「Natural for DB2」で「複数行の処理」(SQL)を参照してください。
注意:
このオプションは、基準データベースが Adabas、VSAM、または DL/I の場合にのみ適用されます。
WITH REPOSITION
オプションでは、READ
ステートメントを再位置決めイベントに反応するように設定できます。 これにより、アクティブな READ
ループ内で別の開始値に再位置決めを行うことができます。 READ
ステートメントの処理は新しい開始値で継続します。
READ
ステートメントを WITH REPOSITION
オプション付きで使用すると、再位置決めイベントが 2 つの方法のいずれかで起動されます。
ESCAPE TOP REPOSITION
ステートメントが実行されるとき。 ESCAPE TOP REPOSITION
ステートメントの実行時、Natural はループ開始への即時分岐を行い、再スタートを実行します。つまり、データベースは、検索値変数の現在の内容に従って、ファイルの新しいレコードに再位置決めを行います。 同時に、ループカウンタ *COUNTER
をゼロにリセットします。
READ
ループがデータベースから次のレコードを取り出そうとして、システム変数 *COUNTER
の値が 0
であるとき。
注意:
アクティブな READ
ループ内で *COUNTER
が 0
に設定される場合、現在のレコードの処理は継続します。ループ開始への即時分岐は行われません。
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 BY ISN |
注意: |
READ IN LOGICAL SEQUENCE |
ディスクリプタが指定されると、レコードはそのディスクプタの値の順序で読み取られます。 順序制御には、ディスクリプタ、サブディスクリプタ、スーパーディスクリプタ、またはハイパーディスクリプタを使用できます。 フォネティックディスクリプタ、ピリオディックグループ内のディスクリプタ、またはピリオディックグループフィールドを含むスーパーディスクリプタは使用できません。 ディスクリプタを指定しなかった場合、DDM に指定されたデフォルトのディスクリプタ( 注意:
順序制御に使用するディスクリプタが空値省略で定義されている場合(Adabas のみ)、ディスクリプタ値が空値であるレコードは読み取られません。 順序制御に使用するディスクリプタがマルチプルバリューフィールドの場合(Adabas のみ)、存在する値の個数に応じて同じレコードが何回も読み取られます。 注意: |
ASCENDING | DESCENDING | VARIABLE | DYNAMIC SEQUENCE |
この節は、Adabas、XML データベース、VSAM、および SQL データベースにのみ適用されます。 この節を使用して、レコードを昇順または降順のどちらで読み取るかを指定できます。
注意:
|
STARTING FROM ... ENDING AT/TO |
レコードを終了値に制限するには、包括的な範囲を示す用語 |
THRU/ENDING AT |
内部的に、読み取る範囲の終了を決定するために、Natural は終了値を超えるレコードを 1 件読み取ります。 終了値に到達したために
|
TO |
キーワード
|
次のリストは、THRU/ENDING AT
および TO
オプションの機能上の違いを示しています。
THRU/ENDING AT | TO |
---|---|
終了値に達したために READ ループが終了するとき、ビューには "範囲外" の最初のレコードが含まれます。
|
終了値に達したために READ ループが終了するとき、ビューには指定した範囲の最後のレコードが含まれます。
|
終了値変数が READ ループ中に修正された場合、次のレコードの読み取り時に新しい値が終了値チェックに使用されます。
|
終了値変数は READ ループ開始時にのみ評価されます。 READ ループ中の以降の修正はすべて無効です。
|
範囲が不正な場合(例えば、READ .. = 'B' THRU 'A' )、レコードが返されないだけで、データベースエラーは発生しません。
|
値範囲を降順で供給してはならないため、不正な範囲はデータベースエラー(例:Adabas RC=61)となります。 |
READ .. DESCENDING が、開始値および終了値と一緒に使用される場合、開始値はファイルでの位置決めに使用され、終了値は Natural で "範囲終了" をチェックするために使用されます。 したがって、開始値は終了値以上の値です。
|
両方の値がデータベースに渡されるため、それらは昇順で出現する必要があります。 つまり、昇順または降順で読み取っているかどうかに関係なく、開始値は終了値以下の値です。 |
範囲のオーバーフローをチェックするために、ディスクリプタ値は基準データベースビューに出現する必要があります。つまり、それはレコードバッファに返される必要があります。 | ディスクリプタは、返されるレコードフィールドに必要ではありません。 |
Adabas マルチバリューフィールド(MU フィールド)またはサブ/スーパー/ハイパーディスクリプタに対して終了値チェックはできません。また、プログラムコンパイル時に構文エラー NAT0160 を引き起こします。 | MU フィールドおよびサブ/スーパー/ハイパーディスクリプタに対して終了値を指定できます。 |
すべてのデータベースに使用できます。 | Adabas バージョン 7(またはそれ以降)、DB2、VSAM、または DL/Iに対してのみ使用できます。 |
WHERE logical-condition |
WHERE
節は、追加の選択条件(logical-condition)を指定するために使用できます。この条件は、値が読み取られた後、値に対する処理が実行される前に評価されます(AT BREAK
評価を含む)。
logical-condition の構文については、『プログラミングガイド』の「論理条件基準」で説明しています。
WHERE
節を含む READ
ステートメントに LIMIT
ステートメントや処理回数の制限を指定した場合、WHERE
節で排除されたレコードは制限数にカウントされません。
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
レポーティングモードの例はライブラリ SYSEXRM のプログラム 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 ファイルの PERSONNEL-ID(人事番号)を検索条件として、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