このドキュメントでは、次のトピックについて説明します。
関連ステートメント:ACCEPT/REJECT
| AT BREAK
| AT START OF DATA
| AT END OF DATA
| BACKOUT TRANSACTION
| BEFORE BREAK PROCESSING
| DELETE
| END TRANSACTION
| GET
| GET SAME
| GET
TRANSACTION
| HISTOGRAM
| LIMIT
| PASSW
| PERFORM BREAK PROCESSING
| READ
| RETRY
| STORE
| UPDATE
関連機能グループ:データベースへのアクセスと更新
FIND
ステートメントは、ディスクリプタ(キー)として定義したフィールドの検索条件をもとに、データベースからレコードの集合を選択します。
このステートメントは処理ループを開始させ、選択された各レコードに対してループ内の処理が行われます。各レコードのすべてのフィールドを処理ループ内で参照できます。そのため、選択した各レコード内のフィールドを参照するために、FIND
ステートメントに続けて READ
ステートメントを発行する必要はありません。
『プログラミングガイド』の次のセクションも参照してください。
発行された FIND
ステートメントごとに *ISN
、*NUMBER
および *COUNTER
の各 Natural システム変数が自動的に生成されます。実行中の処理ループの外側や、FIND UNIQUE
、FIND FIRST
、FIND NUMBER
のステートメントで生成されたシステム変数を参照する場合は、参照番号を指定する必要があります。これらのシステム変数のフォーマットおよび長さは P10 です。これを変更することはできません。
システム変数 | 可用性/使用状況 |
---|---|
*ISN |
|
*NUMBER |
『システム変数』ドキュメントのシステム変数「*NUMBER」を参照してください。 Entire System Server では |
*COUNTER |
システム変数 *COUNTER には、入力した処理ループの回数が含まれます。
|
「例 13 - FIND ステートメントで使用可能な Natural システム変数」も参照してください。
複数の FIND
ステートメントを発行してループのネスト構造を作成することができます。その際に、外側の選択レコードごとに内側のループ処理が行われます。
「例 14 - 複数の FIND ステートメント」も参照してください。
Entire System Server では、FIND
NUMBER
と FIND
UNIQUE
および PASSWORD
、CIPHER
、COUPLED
、RETAIN
の各節も使用できません。
FIND |
[MULTI-FETCH-clause] [RECORDS ] [IN ] [FILE ] view-name |
|||||||||||
[PASSWORD= operand2]
|
||||||||||||
[CIPHER= operand3]
|
||||||||||||
[WITH ] [[LIMIT ] (operand4)] basic-search-criteria |
||||||||||||
[COUPLED-clause] 4/42 | ||||||||||||
[STARTING WITH
ISN= operand5] |
||||||||||||
[SORTED-BY-clause] | ||||||||||||
[RETAIN-clause] | ||||||||||||
[[IN ] SHARED HOLD [MODE =option]]
|
||||||||||||
[SKIP [RECORDS ] IN
HOLD ]
|
||||||||||||
[WHERE-clause] | ||||||||||||
[IF-NO-RECORDS-FOUND-clause] | ||||||||||||
statement | ||||||||||||
END-FIND |
(ストラクチャードモードのみ) | |||||||||||
LOOP |
(レポーティングモードのみ) |
構文図で使用されている記号については、「構文記号」を参照してください。
FIND |
[RECORDS ] [IN ] [FILE ] view-name |
|||||||||||
[PASSWORD= operand2]
|
||||||||||||
[CIPHER= operand3]
|
||||||||||||
[WITH ] [[LIMIT ] (operand4)] basic-search-criteria |
||||||||||||
[COUPLED-clause] 4/42 | ||||||||||||
[SORTED-BY-clause] | (only for FIND FIRST) | |||||||||||
[RETAIN-clause] | ||||||||||||
[WHERE-clause] |
構文図で使用されている記号については、「構文記号」を参照してください。
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | オペランド参照 | ダイナミック定義 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 以下の長さでのみ使用できます。
構文要素の説明:
構文要素 | 説明 | ||
---|---|---|---|
ALL/operand1 |
処理制限:
選択された集合から処理するレコード件数は、定数(
FIND (5) IN EMPLOYEES WITH ... MOVE 10 TO #CNT(N2) FIND (#CNT) EMPLOYEES WITH ... このステートメントでは、指定した制限が、
注意:
|
||
FIND
FIRST | FIND NUMBER | FIND UNIQUE |
FIND FIRST, FIND NUMBER, FIND UNIQUE オプション:
これらのオプションは、
|
||
MULTI-FETCH-clause |
MULTI-FETCH 節:
Adabas データベースの場合、Natural はデータベースアクセス当たり 1 回以上の読み取りを許可する |
||
view-name |
ビュー名:
レポーティングモードでは、 |
||
PASSWORD=operand2 |
PASSWORD 節:
パスワードの値は、処理ループの実行中に変更しないでください。 「例 1 - PASSWORD 節」も参照してください。 |
||
CIPHER=operand3 |
CIPHER 節:
サイファキーは、数値定数(8 桁)またはユーザー定義変数(N8)で指定できます。 サイファキーの値は、 「例 2 - CIPHER 節」も参照してください。 |
||
WITH LIMIT
operand4
basic-search-criteria |
WITH 節:
次のデータベース固有の考慮事項が適用されます。
注意: |
||
COUPLED-clause |
COUPLED 節:
この節は、Adabas のカップリング機能を使用した検索を行います。「COUPLED 節」を参照してください。 |
||
STARTING WITH
ISN=operand5 |
STARTING WITH 節:
この節は、処理を継続する次のレコードを簡単に指定するために、中断された |
||
SORTED-BY-clause |
SORTED BY 節:
SORTED BY 節は、選択したレコードを 1 個~3 個のディスクリプタを基準に Adabas ソートします。「SORTED BY 節」を参照してください。 |
||
RETAIN-clause |
RETAIN 節:
この節を使用して、大規模ファイルの検索結果を以降の処理のために保持しておくことができます。「RETAIN 節」を参照してください。 |
||
[[IN] SHARED HOLD
[MODE=option]] |
SHARED HOLD 節
注意: この節は"共有ホールド"状態で読み取られるレコードの配置に使用できます。レコードは、多数のユーザーが同時に共有ホールドにできます。レコードが共有ホールド状態にある限り、同時ユーザーによって排他的ホールドに設定できないため、更新から保護されます。このため、処理中はユーザーがレコードを更新できないので、レコードデータのデータ整合性が確保されます。 特に、異なる MU/PE オカレンス( このようなホールド状態は読み込み順序を保護する効果的な手段ですが、レコードをこの"ソフトロック"からいつ解放するかという基本的で重要な問題が生じます。この問題は個々のアプリケーションの局面によって異なるので、 |
||
MODE オプション
|
ホールド期間
|
説明
|
|
C |
レコードの読み込み時のみ。 | 読み込まれるレコードのバージョンのみが、レコードを最後に更新したユーザーによってコミットされるようにします。このオプションは実際にホールド状態でロックを設定するのではなく、読み込み時に別のユーザーによってレコードが排他的にホールドされないようにチェックするだけです。 | |
Q |
次の順序のレコードが読み込まれるまで。 | 次の場合に、レコードを共有ホールドから解放します。
|
|
S |
論理トランザクションが終了するまで。 | END TRANSACTION または BACKOUT TRANSACTION ステートメントで論理トランザクションが終了すると、レコードが共有ホールドから解放されます。
|
|
MODE=Q および MODE=S では、読み取り中のレコードが再度ホールドからリリースされるまで、他のユーザーが同時に更新できないようにします。
「例 15 - SHARED HOLD 節」も参照してください。 |
|||
SKIP
RECORDS IN HOLD |
SKIP RECORDS 節
注意: ホールド状態のレコードを読み込むとき、このレコードが別のユーザーによって同時にホールドされていると、Natural エラー NAT3145(Adabas レスポンスコード エラー NAT3145 は "クリーンデータ処理"を保証するための適切な対処ですが、ホールドされているレコードをスキップできると便利です。このようなレコードを処理せずにループ処理を続行しても問題がない場合は、
レコードがすでにホールドされていて、Natural エラー NAT3145 が発生する場合、以下の原因が考えられます。
「例 16 - SKIP RECORDS 節」も参照してください。 |
||
WHERE-clause |
WHERE 節:
この節を使用して、追加の選択条件( |
||
IF-NO-RECORDS-FOUND-clause |
IF NO RECORDS FOUND 節:
この節を使用すると、 |
||
END-FIND |
End of FIND ステートメント:
処理ループのあるストラクチャードモードの場合、Natural の予約キーワード 処理ループのあるレポーティングモードの場合、Natural のステートメント |
||
LOOP |
FIND FIRST
ステートメントは、WITH
条件および WHERE
条件を満たす最初の 1 件のレコードを選択し、処理します。
Adabas データベースでは、選択レコードのうち最も低い Adabas ISN 値を持つレコードが処理されます。
このステートメントは処理ループを開始しません。
FIND FIRST
はレポーティングモードでのみ使用できます。
FIND FIRST
は、 SQL データベースでは使用できません。
次の Natural システム変数を FIND FIRST
ステートメントで使用できます。
システム変数 | 説明 |
---|---|
*ISN |
システム変数 *ISN には選択レコードの Adabas ISN が含まれます。*ISN は、WITH および WHERE 条件の評価後にレコードが 1 件も見つからなかった場合、ゼロになります。
|
*NUMBER |
システム変数 *NUMBER には、WITH 条件の評価後、WHERE 条件が評価される前のレコード数が含まれます。*NUMBER は、WITH 条件を満たすレコードがなければ、ゼロになります。
|
*COUNTER |
レコードが見つかった場合は 1 、レコードが見つからなかった場合は 0 が、システム変数 *COUNTER に含まれます。
|
FIND FIRST
ステートメントの例:プログラム FNDFIR
(レポーティングモード)を参照してください
FIND NUMBER
ステートメントは、指定した WITH
/WHERE
条件を満たすレコード件数を得るために使用します。処理ループは開始されず、データベースのフィールドも使用できません。
注意:WHERE
節を使用すると、負荷が生じることがあります。
WHERE
節はレポーティングモードでのみ使用できます。
FIND NUMBER
は、 Entire System Server では使用できません。
次の Natural システム変数を FIND NUMBER
ステートメントで使用できます。
システム変数 | 説明 |
---|---|
*NUMBER |
システム変数 *NUMBER には、WITH 条件の評価後に見つかったレコード数が含まれます。
|
*COUNTER |
システム変数 *COUNTER には、WHERE 条件の評価後に見つかったレコード数が含まれます。
|
FIND NUMBER
の例:プログラム FNDNUM
(レポーティングモード)を参照してください。
FIND UNIQUE
ステートメントは、処理のために選択されたレコードが 1 件だけであることを保証するために使用します。処理ループは開始しません。WHERE
節の指定がある場合、WHERE
節を評価する内部処理ループが自動的に生成されます。
条件を満たすレコードがないとき、あるいは条件を満たすレコードが複数あるときは、エラーメッセージが返されます。ON
ERROR
ステートメントで、エラー条件をチェックできます。
FIND UNIQUE
はレポーティングモードでのみ使用できます。
FIND UNIQUE
は、 Entire System Server では使用できません。
SQL データベースに、FIND UNIQUE
は使用できません(例外:メインフレームコンピュータでは、FIND UNIQUE
はプライマリキーに対して使用できますが、これは互換性のためだけであるため使用しないでください)。
システム変数 | 説明 |
---|---|
*ISN |
システム変数 *ISN は、レコードの一意な ISN 番号を持ちます。レコード自体が一意である必要があります。
|
*NUMBER |
システム変数 *NUMBER は、有効な FIND UNIQUE 実行に対しては常に 1 です。
|
*COUNTER |
システム変数 *COUNTER には、WHERE 条件の評価後に見つかったレコード数が含まれます。*COUNTER は、WHERE 節が指定されていない場合、使用できません。
|
FIND UNIQUE
の例:プログラム FNDUNQ
(レポーティングモード)を参照してください
注意:
この節は、Adabas データベースでのみ使用できます。
MULTI-FETCH |
|
注意:[MULTI-FETCH OF
multi-fetch-factor]
は、データベースタイプ ADA
および ADA2
に対して評価されません。デフォルト処理モードが適用されます(プロファイルパラメータ MFSET
を参照)。MULTI-FETCH
節は、データベースタイプ ADA2
, で使用しても完全に無視されます(『コンフィグレーションユーティリティ』ドキュメントの「データベース管理システムの割り当て」を参照)。
詳細については、『プログラミングガイド』の「MULTI-FETCH 節」(Adabas)
1 descriptor [(i)]
|
|
value | OR |
|
value | |||||||||||
THRU value[BUT
NOT value[THRU value]]
|
||||||||||||||||
2
descriptor [(i)]
|
|
value | ||||||||||||||
3 set-name |
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | オペランド参照 | ダイナミック定義 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
descriptor |
S | A | A | U | N | P | I | F | B | D | T | L | × | × | ||||||
value |
C | S | A | U | N | P | I | F | B | D | T | L | ○ | × | ||||||
set-name |
C | S | A | × | × |
構文要素の説明:
以下の項目も参照してください。
null-indicator |
|
value |
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | オペランド参照 | ダイナミック定義 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
null-indicator |
S | I | × | × | |||||||||||||||
value |
C | S | N | P | I | F | B | ○ | × |
構文要素の説明:
構文要素 | 説明 | |
---|---|---|
null-indicator |
空値インジケータ。 | |
value |
指定可能な値
|
意味
|
-1 |
対応するフィールドは値を含んでいません。 | |
0 |
対応するフィールドは値を含んでいます。 |
basic-search-criteria
は、ブール演算子 AND、OR および NOT を使用して結合できます。カッコで囲んで評価の優先順位を制御することもできます。評価の順序は次のとおりです。
( )
:カッコ
NOT
:否定([2] の形式の basic-search-criteria
専用)
AND
:AND 操作
OR
:OR 操作
basic-search-criteria
は論理演算子で複合 search-expression
の形に結合できます。複合 search-expression
の構文は次のようになります。
[NOT ]
|
basic-search-criteria |
|
search-expression |
「例 5 - WITH 節のさまざまな複合検索式の例」も参照してください。
Adabas ユーザーは、ディスクリプタとして定義されているデータベースフィールドを基本検索条件に使用できます。
Adabas では、検索条件にサブディスクリプタ、スーパーディスクリプタ、ハイパーディスクリプタ、およびフォネティックディスクリプタが使用できます。
サブディスクリプタは、フィールドの一部で作られたディスクリプタです。
スーパーディスクリプタは、1 つ以上のフィールドまたはフィールドの一部から構成されたディスクリプタです。
ハイパーディスクリプタは、ユーザー定義アルゴリズムを使用して作ったディスクリプタです。
フォネティックディスクリプタは、発音による検索(例:人の名前)を行うディスクリプタです。フォネティック検索では、発音が検索値に類似するすべての値が返されます。
どのファイルのどのフィールドをディスクリプタ、サブディスクリプタ、スーパーディスクリプタ、ハイパーディスクリプタ、フォネティックディスクリプタとして使用できるかは対応する DDM に定義されます。
これらのディスクリプタ値は、ディスクリプタの内部フォーマットに対して変換できる必要があります。サブディスクリプタの内部フォーマットは、そのサブディスクリプタを作り出したもとのフィールドのフォーマットと同じです。スーパーディスクリプタの内部フォーマットは、もとのフィールドがすべて数字フォーマットのときはバイナリであり、そうでなければ英数字フォーマットです。フォネティックディスクリプタは、常に英数字フォーマットです。
サブディスクリプタやスーパーディスクリプタの値は、次のように指定できます。
数字または 16 進定数。ただしバイナリフォーマットのスーパーディスクリプタに対しては、16 進定数を使用する必要があります(上記参照)。
サブディスクリプタやスーパーディスクリプタの各部分を、REDEFINE
ステートメントで再定義した形のユーザー定義変数内の値。
データベース内の配列に含まれるディスクリプタも、基本検索条件の中に使用できます。Adabas データベースを使用している場合、MU または PE に含まれるディスクリプタのことです。
ピリオディックグループに含まれるディスクリプタをインデックス付きまたはなしで指定できます。インデックスなしで指定した場合、レコードは指定した値がいずれかのオカレンスに見つかった場合に選択されます。インデックス付きで指定した場合、レコードは値がインデックスで指定したオカレンス内に見つかった場合にのみ選択されます。インデックスは定数で指定する必要があります。インデックス範囲は使用できません。
マルチプルバリューフィールドのディスクリプタは、インデックスなしで指定する必要があります。レコードは、値がレコード内で位置に関係なく見つかった場合に選択されます。
「例 6 - データベース配列のさまざまな使用例」も参照してください。
この節は Adabas データベースにのみ適用されます。
この節は Entire System Server では使用できません。
|
COUPLED |
[TO ] [FILE ] view-name |
||||||||
VIA descriptor1 |
|
descriptor2 | ||||||||
[WITH ] basic-search-criteria |
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | オペランド参照 | ダイナミック定義 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
descriptor1 |
S | A | A | N | P | B | × | × | |||||||||||
descriptor2 |
S | A | A | N | P | B | × | × |
注意:VIA
節を指定しない場合は、COUPLED
節を 4 回まで指定できますが、VIA
節を使用すると、42 回まで指定できます。
COUPLED
節は、Adabas のカップリング機能を使用した検索を行います。この機能により、1 つの FIND
ステートメントの検索条件の中に、異なるファイルのデータベースディスクリプタを指定することができます。
同じ Adabas ファイルを、1 つの FIND
ステートメントの異なる FIND
COUPLED
節に使用しないでください。
set-name
(RETAIN 節参照)を basic-search-criteria
に指定しないでください。
COUPLED
節内で指定したファイルのデータベースフィールドは、別の FIND
や READ
ステートメントをカップリングされたファイルに発行しない限り、プログラム内で後から参照することはできません。
注意:COUPLED
節を使用する場合は、メインの WITH
節を省略できます。メインの WITH
節を省略するときは、COUPLED
節でキーワード AND
/OR
を指定しないでください。
VIA
を指定しない COUPLED
節に使用するファイルは、所定の Adabas ユーティリティ(Adabas ドキュメントを参照)を使用して物理的にカップリングされている必要があります。
「例 7 - 物理カップリングファイルの使用」も参照してください。
上の例の DISPLAY
ステートメントにある NAME
は、EMPLOYEES
ファイル内にこのフィールドがあるので参照できますが、MAKE
は COUPLED
節に指定された VEHICLES
ファイル内にあるため MAKE
を参照することはできません。
EMPLOYEES
と VEHICLES
が物理的にカップリングされている場合にのみ、レコードの検索が行われます。
オプション VIA descriptor1 =
descriptor2
により、検索参照で複数の Adabas ファイルの論理カップリングが可能となります。
2 つのファイルは Adabas で物理的にカップリングする必要はありません。
「例 8 - VIA 節」も参照してください。
この節は、Adabas データベースにのみ適用されます。
operand5
として、Adabas ISN(内部シーケンス番号)を指定するために、この節を使用すると、レコードの選択のための開始値として使用されます。
この節は、処理を継続する次のレコードを簡単に指定するために、処理が中断された FIND
ループ内での再位置決めに使用できます。これは特に、次のレコードをディスクリプタ値で一意に識別できない場合に役立ちます。また、分散クライアント/サーバーアプリケーションで、レコードをサーバープログラムで読み取ってクライアントプログラムで処理し、レコードを順次処理ではなくバッチ処理する場合にも役立ちます。
注意:
実際に使用される開始値は operand5
の値ではなく、次に高い値になります。
ライブラリ SYSEXSYN
のプログラム FNDSISN
を参照してください。
この節は、Adabas、Tamino、または SQL データベースにのみ適用されます。
この節は Entire System Server では使用できません。
SORTED [BY ] descriptor 3 [DESCENDING ]
|
SORTED BY
節は、選択したレコードを 1 個~3 個のディスクリプタを基準に Adabas ソートします。ソートの順番を制御するディスクリプタと、レコードの選択に使用するディスクリプタは、異なるものを指定できます。
デフォルトで、レコードは昇順にソートされます。降順にソートする場合は、キーワード DESCENDING
を指定します。ソートは、レコードを読み込まず、Adabas インバーテッドリストを使用して行われます。
注意:
ソート順を制御するディスクリプタの値の数が多くなると負荷も大きくなります。これは、選択された全レコードがリスト内に位置づけられるまで値のリスト全体をスキャンするからです。大量のレコードをソートするときには、SORT
ステートメントを使用してください。
Adabas のソート制限(Adabas ドキュメントの ADARUN LS
パラメータを参照)は、SORTED BY
節を使用するときに影響します。
ピリオディックグループ内のディスクリプタを SORTED BY
節に使用しないでください。MU(添字指定なし)は指定できます。
SORTED BY
節にディスクリプタ以外も指定できます。ただし、メインフレーム環境では、この機能は利用できません。
SORTED BY
節を使用する場合、RETAIN
節を一緒に使用しないでください。
「例 9 - SORTED BY 節」も参照してください。
STARTING WITH
節と SORTED BY
節の両方が同じ FIND
ステートメントで使用され、基準データベースが Adabas の場合は、次の点を考慮する必要があります。
Adabas for Mainframes では、FIND
ステートメントは次の手順で実行されます。
検索条件に一致するすべてのレコードが収集され、ISN 順序で配置されます。
レコードは、SORTED BY
節で指定されたディスクリプタの順にソートされます。
ISN 値が STARTING
WITH
節で指定されているレコードは、"sorted-by-descriptor" レコードリストに配置されます。
手順 3 で見つかったレコードに続くレコードが、FIND
ループで返されます。
Adabas for OpenSystems(UNIX、OpenVMS、Windows)では、同じステートメントは次のように実行されます。
検索条件に一致するすべてのレコードが収集され、ISN 順序で配置されます。
ISN 値が STARTING
WITH
節で指定されているレコードは、"sorted-by-ISN" レコードリストに配置されます。
手順 2 で見つかったレコードに続くすべてのレコードは、SORTED BY
節で指定されたディスクリプタ順にソートされ、FIND
ループで返されます。
例:
次のプログラムが Adabas for Mainframes および Adabas for UNIX/OpenVMS/Windows で実行される場合:
DEFINE DATA LOCAL 1 V1 VIEW OF EMPLOYEES 2 NAME 2 FIRST-NAME 2 CITY 1 #ISN (I4) END-DEFINE FORMAT NL=5 SG=OFF PS=43 AL=15 * PRINT 'FIND' (I) FIND V1 WITH NAME = 'B' THRU 'BALBIN' RETAIN AS 'SET1' IF *COUNTER = 4 THEN #ISN := *ISN END-IF DISPLAY *ISN V1 END-FIND * PRINT / 'FIND .. SORTED BY NAME' (I) FIND V1 WITH 'SET1' SORTED BY NAME DISPLAY *ISN V1 END-FIND * PRINT / 'FIND .. STARTING WITH ISN = ' (I) #ISN (AD=I) FIND V1 WITH 'SET1' STARTING WITH ISN = #ISN DISPLAY *ISN V1 END-FIND * PRINT / 'FIND .. STARTING WITH ISN = ' (I) #ISN (AD=I) ' .. SORTED BY NAME' (I) FIND V1 WITH 'SET1' STARTING WITH ISN = #ISN SORTED BY NAME DISPLAY *ISN V1 END-FIND END
結果は次のとおりです。
- Natural for Mainframes での結果
ISN NAME FIRST-NAME CITY ----- --------------- --------------- --------------- FIND V1 WITH NAME = 'B' THRU 'BALBIN' 12 BAILLET PATRICK LYS LEZ LANNOY 58 BAGAZJA MARJAN MONTHERME 351 BAECKER JOHANNES FRANKFURT 355 BAECKER KARL SINDELFINGEN 370 BACHMANN HANS MUENCHEN 490 BALBIN ENRIQUE BARCELONA 650 BAKER SYLVIA OAK BROOK 913 BAKER PAULINE DERBY FIND .. SORTED BY NAME 370 BACHMANN HANS MUENCHEN 351 BAECKER JOHANNES FRANKFURT 355 BAECKER KARL SINDELFINGEN 58 BAGAZJA MARJAN MONTHERME 12 BAILLET PATRICK LYS LEZ LANNOY 650 BAKER SYLVIA OAK BROOK 913 BAKER PAULINE DERBY 490 BALBIN ENRIQUE BARCELONA FIND .. STARTING WITH ISN = 355 370 BACHMANN HANS MUENCHEN 490 BALBIN ENRIQUE BARCELONA 650 BAKER SYLVIA OAK BROOK 913 BAKER PAULINE DERBY FIND .. STARTING WITH ISN = 355 .. SORTED BY NAME 58 BAGAZJA MARJAN MONTHERME 12 BAILLET PATRICK LYS LEZ LANNOY 650 BAKER SYLVIA OAK BROOK 913 BAKER PAULINE DERBY 490 BALBIN ENRIQUE BARCELONA- Natural for OpenSystems での結果
ISN NAME FIRST-NAME CITY ----- --------------- --------------- --------------- FIND V1 WITH NAME = 'B' THRU 'BALBIN' 12 BAILLET PATRICK LYS LEZ LANNOY 58 BAGAZJA MARJAN MONTHERME 351 BAECKER JOHANNES FRANKFURT 355 BAECKER KARL SINDELFINGEN 370 BACHMANN HANS MUENCHEN 490 BALBIN ENRIQUE BARCELONA 650 BAKER SYLVIA OAK BROOK 913 BAKER PAULINE DERBY FIND .. SORTED BY NAME 370 BACHMANN HANS MUENCHEN 351 BAECKER JOHANNES FRANKFURT 355 BAECKER KARL SINDELFINGEN 58 BAGAZJA MARJAN MONTHERME 12 BAILLET PATRICK LYS LEZ LANNOY 650 BAKER SYLVIA OAK BROOK 913 BAKER PAULINE DERBY 490 BALBIN ENRIQUE BARCELONA FIND .. STARTING WITH ISN = 355 370 BACHMANN HANS MUENCHEN 490 BALBIN ENRIQUE BARCELONA 650 BAKER SYLVIA OAK BROOK 913 BAKER PAULINE DERBY FIND .. STARTING WITH ISN = 355 .. SORTED BY NAME 370 BACHMANN HANS MUENCHEN 650 BAKER SYLVIA OAK BROOK 913 BAKER PAULINE DERBY 490 BALBIN ENRIQUE BARCELONA
これらのオプション(SORTED BY
または STARTING WITH ISN
)の 1 つを指定した FIND
ステートメントは、ステートメントが実行されたシステムにかかわらず、同じ順序で同じレコードを返します。一方、両方の節が一緒に使用されている場合、返される結果は、データベースステートメントの処理に使用されている Adabas プラットフォームによって異なります。
したがって、Natural プログラムが複数のプラットフォームで使用されることを意図している場合は、同じ FIND
ステートメントで SORTED BY
節と STARTING WITH
ISN
節を組み合わせて使用することは避ける必要があります。
この節は Adabas データベースにのみ適用されます。
この節は Entire System Server では使用できません。
RETAIN AS operand6 |
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | オペランド参照 | ダイナミック定義 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand6 |
C | S | A | ○ | × |
構文要素の説明:
「例 10 - RETAIN 節」も参照してください。
保持できる集合数や集合内の ISN の件数については、特別な制限はありません。ただし、一度に定義する ISN の集合数は、最小限にとどめておくことをお勧めします。不要になった集合は、RELEASE SETS
ステートメントで解放してください。
RELEASE
ステートメントで集合を解放しないと、保持された集合は自動的には解放されず、Natural セッション全体を通して存在します。また、別のライブラリにログオンするまで存在します。あるプログラムで作成した集合を、他のプログラムで処理したり、検索条件を追加してさらにしぼり込んだりするために参照できます。
保持された集合内の ISN で識別されたレコードは、他のユーザーのアクセスおよび(または)更新をロックすることはありません。このため、その集合からレコードを処理する前に、集合の作成に使用した元の検索条件が有効であるかどうかを確認する場合に便利です。この確認は、別の
FIND
ステートメントの基本検索条件として WITH
節に集合名を指定し、WHERE
節に元の検索条件(集合作成時に FIND
ステートメントの WITH
節で指定した基本検索条件)を指定します。
RETAIN
節を使用する場合、SORTED BY
節を一緒に使用しないでください。
WHERE logical-condition |
WHERE
節は、追加の選択条件(logical-condition
)を指定するために使用できます。この条件は、値が読み取られた後、値に対する処理が実行される前に評価されます(AT BREAK
評価を含む)。
logical-condition
の構文については、『プログラミングガイド』の「論理条件基準」で説明しています。
WHERE
節を持つ FIND
ステートメントに、処理数制限の指定がある場合、WHERE
節により除かれたレコードは制限数の合計数から除かれます。しかし、これらのレコードは、Natural セッションパラメータ LT
、GLOBALS
コマンド、LIMIT
ステートメントに指定されたグローバルリミットに対しては、合計されます。
「例 11 - WHERE 節」も参照してください。
IF NO [RECORDS ] [FOUND ] |
||
END-NOREC |
IF NO [RECORDS ] [FOUND ] |
|||
構文要素の説明:
構文要素 | 説明 |
---|---|
IF NO RECORDS
FOUND |
IF NO RECORDS FOUND 節:
これが望ましくない場合は、 |
ステートメントの実行:
1 つ以上のステートメントが ループに入る前に実行するステートメントがない場合は、キーワード |
|
END-NOREC |
IF NO RECORDS FOUND 節の終了:
ストラクチャードモードでは、 レポーティングモードでは、状況に応じて、 |
「例 12 - IF NO RECORDS FOUND 節」も参照してください。
IF NO RECORDS FOUND
節内のステートメントで値が割り当てられない限り、Natural はループで指定されたファイルを参照するすべてのデータベースフィールドをリセットして空にします。
Natural システム機能は、IF NO RECORDS FOUND
節の結果として処理用に作成される空のレコードに対して 1 回評価されます。
この節は、FIND FIRST
、FIND NUMBER
および FIND UNIQUE
では使用できません。
FIND NUMBER
:プログラム FNDNUM
の例も参照してください。
** Example 'FNDPWD': FIND (with PASSWORD clause) ************************************************************************ DEFINE DATA LOCAL 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 NAME 2 PERSONNEL-ID * 1 #PASSWORD (A8) END-DEFINE * INPUT 'ENTER PASSWORD FOR EMPLOYEE FILE:' #PASSWORD (AD=N) LIMIT 2 * FIND EMPLOY-VIEW PASSWORD = #PASSWORD WITH NAME = 'SMITH' DISPLAY NOTITLE NAME PERSONNEL-ID END-FIND * END
ENTER PASSWORD FOR EMPLOYEE FILE:
** Example 'FNDCIP': FIND (with PASSWORD/CIPHER clause) ************************************************************************ DEFINE DATA LOCAL 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 NAME 2 PERSONNEL-ID * 1 #PASSWORD (A8) 1 #CIPHER (N8) END-DEFINE * LIMIT 2 INPUT 'ENTER PASSWORD FOR EMPLOYEE FILE: ' #PASSWORD (AD=N) / 'ENTER CIPHER KEY FOR EMPLOYEE FILE: ' #CIPHER (AD=N) * FIND EMPLOY-VIEW PASSWORD = #PASSWORD CIPHER = #CIPHER WITH NAME = 'SMITH' DISPLAY NOTITLE NAME PERSONNEL-ID END-FIND * END Output of Program FNDCIP:
ENTER PASSWORD FOR EMPLOYEE FILE: ENTER CIPHER KEY FOR EMPLOYEE FILE:
FIND STAFF WITH NAME = 'SMITH' FIND STAFF WITH CITY NE 'BOSTON' FIND STAFF WITH BIRTH = 610803 FIND STAFF WITH BIRTH = 610803 THRU 610811 FIND STAFF WITH NAME = 'O HARA' OR = 'JONES' OR = 'JACKSON' FIND STAFF WITH PERSONNEL-ID = 100082 THRU 100100 BUT NOT 100087 THRU 100095
基本検索条件に使用するディスクリプタがマルチプルバリューフィールドのとき、基本的に 4 種類の異なる結果を取得できます。次の例では、MU-FIELD
フィールドはマルチプルバリューフィールドとします。
FIND XYZ-VIEW WITH MU-FIELD = 'A'
MU-FIELD
のいずれかのオカレンスで A
値を持っているレコードが選択されます。
FIND XYZ-VIEW WITH MU-FIELD NOT EQUAL 'A'
MU-FIELD
のいずれかのオカレンスに A
の値がないレコードが返されます。
FIND XYZ-VIEW WITH NOT MU-FIELD NOT EQUAL 'A'
MU-FIELD
のすべてのオカレンスで A
値を持っているレコードが選択されます。
FIND XYZ-VIEW WITH NOT MU-FIELD = 'A'
このステートメントは、MU-FIELD
のすべてのオカレンスが A
以外の値を持つレコードを返します。
FIND STAFF WITH BIRTH LT 19770101 AND DEPT = 'DEPT06'
FIND STAFF WITH JOB-TITLE = 'CLERK TYPIST' AND (BIRTH GT 19560101 OR LANG = 'SPANISH')
FIND STAFF WITH JOB-TITLE = 'CLERK TYPIST' AND NOT (BIRTH GT 19560101 OR LANG = 'SPANISH')
FIND STAFF WITH DEPT = 'ABC' THRU 'DEF' AND CITY = 'WASHINGTON' OR = 'LOS ANGELES' AND BIRTH GT 19360101
FIND CARS WITH MAKE = 'VOLKSWAGEN' AND COLOR = 'RED' OR = 'BLUE' OR = 'BLACK'
次の例では、SALARY
フィールドをピリオディックグループに属するディスクリプタ、LANG
フィールドをマルチプルバリューフィールドであるとします。
FIND EMPLOYEES WITH SALARY LT 20000
SALARY
の全オカレンスを検索します。
FIND EMPLOYEES WITH SALARY (1) LT 20000
SALARY の第 1 オカレンスだけを検索します。
FIND EMPLOYEES WITH SALARY (1:4) LT 20000 /* invalid
検索条件に使用されている PE 内のフィールドに範囲を指定しないでください。
FIND EMPLOYEES WITH LANG = 'FRENCH'
LANG
のすべての値を検索します。
FIND EMPLOYEES WITH LANG (1) = 'FRENCH' /* invalid
検索条件で使用されている MU に添字を指定しないでください。
** Example 'FNDCPL': FIND (using coupled files) ** NOTE: Adabas files must be physically coupled when using the ** COUPLED clause without the VIA clause. ************************************************************************ DEFINE DATA LOCAL 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 NAME 1 VEHIC-VIEW VIEW OF VEHICLES 2 MAKE END-DEFINE * FIND EMPLOY-VIEW WITH CITY = 'FRANKFURT' AND COUPLED TO VEHIC-VIEW WITH MAKE = 'VW' DISPLAY NOTITLE NAME END-FIND * END
** Example 'FNDVIA': FIND (with VIA clause) ************************************************************************ DEFINE DATA LOCAL 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 PERSONNEL-ID 2 NAME 2 FIRST-NAME 1 VEHIC-VIEW VIEW OF VEHICLES 2 PERSONNEL-ID END-DEFINE * FIND EMPLOY-VIEW WITH NAME = 'ADKINSON' AND COUPLED TO VEHIC-VIEW VIA PERSONNEL-ID = PERSONNEL-ID WITH MAKE = 'VOLVO' DISPLAY PERSONNEL-ID NAME FIRST-NAME END-FIND * END
Page 1 05-01-17 13:18:22 PERSONNEL NAME FIRST-NAME ID --------- -------------------- -------------------- 20011000 ADKINSON BOB
** Example 'FNDSOR': FIND (with SORTED BY clause) ************************************************************************ DEFINE DATA LOCAL 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 CITY 2 NAME 2 FIRST-NAME 2 PERSONNEL-ID END-DEFINE * LIMIT 10 FIND EMPLOY-VIEW WITH CITY = 'FRANKFURT' SORTED BY NAME PERSONNEL-ID DISPLAY NOTITLE NAME (IS=ON) FIRST-NAME PERSONNEL-ID END-FIND * END
NAME FIRST-NAME PERSONNEL ID -------------------- -------------------- --------- BAECKER JOHANNES 11500345 BECKER HERMANN 11100311 BERGMANN HANS 11100301 BLAU SARAH 11100305 BLOEMER JOHANNES 11200312 DIEDRICHS HUBERT 11600301 DOLLINGER MARGA 11500322 FALTER CLAUDIA 11300311 HEIDE 11400311 FREI REINHILD 11500301
** Example 'RELEX1': FIND (with RETAIN clause and RELEASE statement) ************************************************************************ DEFINE DATA LOCAL 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 CITY 2 BIRTH 2 NAME * 1 #BIRTH (D) END-DEFINE * MOVE EDITED '19400101' TO #BIRTH (EM=YYYYMMDD) * FIND NUMBER EMPLOY-VIEW WITH BIRTH GT #BIRTH RETAIN AS 'AGESET1' IF *NUMBER = 0 STOP END-IF * FIND EMPLOY-VIEW WITH 'AGESET1' AND CITY = 'NEW YORK' DISPLAY NOTITLE NAME CITY BIRTH (EM=YYYY-MM-DD) END-FIND * RELEASE SET 'AGESET1' * END
NAME CITY DATE OF BIRTH -------------------- -------------------- ---------- RUBIN NEW YORK 1945-10-27 WALLACE NEW YORK 1945-08-04
** Example 'FNDWHE': FIND (with WHERE clause) ************************************************************************ DEFINE DATA LOCAL 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 PERSONNEL-ID 2 NAME 2 JOB-TITLE 2 CITY END-DEFINE * FIND EMPLOY-VIEW WITH CITY = 'PARIS' WHERE JOB-TITLE = 'INGENIEUR COMMERCIAL' DISPLAY NOTITLE CITY JOB-TITLE PERSONNEL-ID NAME END-FIND * END
CITY CURRENT PERSONNEL NAME POSITION ID -------------------- ------------------------- --------- -------------------- PARIS INGENIEUR COMMERCIAL 50007300 CAHN PARIS INGENIEUR COMMERCIAL 50006500 MAZUY PARIS INGENIEUR COMMERCIAL 50004700 FAURIE PARIS INGENIEUR COMMERCIAL 50004400 VALLY PARIS INGENIEUR COMMERCIAL 50002800 BRETON PARIS INGENIEUR COMMERCIAL 50001000 GIGLEUX PARIS INGENIEUR COMMERCIAL 50000400 KORAB-BRZOZOWSKI
** Example 'FNDIFN': FIND (using IF NO RECORDS FOUND) ************************************************************************ DEFINE DATA LOCAL 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 PERSONNEL-ID 2 NAME 2 FIRST-NAME 1 VEHIC-VIEW VIEW OF VEHICLES 2 PERSONNEL-ID 2 MAKE END-DEFINE * LIMIT 15 EMP. READ EMPLOY-VIEW BY NAME STARTING FROM 'JONES' /* VEH. FIND VEHIC-VIEW WITH PERSONNEL-ID = PERSONNEL-ID (EMP.) IF NO RECORDS FOUND MOVE '*** NO CAR ***' TO MAKE END-NOREC /* DISPLAY NOTITLE NAME (EMP.) (IS=ON) FIRST-NAME (EMP.) (IS=ON) MAKE (VEH.) END-FIND /* END-READ END
NAME FIRST-NAME MAKE -------------------- -------------------- -------------------- JONES VIRGINIA CHRYSLER MARSHA CHRYSLER CHRYSLER ROBERT GENERAL MOTORS LILLY FORD MG EDWARD GENERAL MOTORS MARTHA GENERAL MOTORS LAUREL GENERAL MOTORS KEVIN DATSUN GREGORY FORD JOPER MANFRED *** NO CAR *** JOUSSELIN DANIEL RENAULT JUBE GABRIEL *** NO CAR *** JUNG ERNST *** NO CAR *** JUNKIN JEREMY *** NO CAR *** KAISER REINER *** NO CAR ***
** Example 'FNDVAR': FIND (using *ISN, *NUMBER, *COUNTER) ************************************************************************ DEFINE DATA LOCAL 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 PERSONNEL-ID 2 NAME 2 CITY END-DEFINE * LIMIT 3 FIND EMPLOY-VIEW WITH CITY = 'MADRID' DISPLAY NOTITLE PERSONNEL-ID NAME *ISN *NUMBER *COUNTER END-FIND * END
PERSONNEL NAME ISN NMBR CNT ID --------- -------------------- ----------- ----------- ----------- 60000114 DE JUAN 400 41 1 60000136 DE LA MADRID 401 41 2 60000209 PINERO 405 41 3
まず、EMPLOYEES
ファイルから、姓が SMITH である人をすべて選択します。この EMPLOYEES
ファイルの PERSONNEL-ID
を検索キーにして、VEHICLES
ファイルにアクセスします。
** Example 'FNDMUL': FIND (with multiple files) ************************************************************************ DEFINE DATA LOCAL 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 PERSONNEL-ID 2 NAME 2 FIRST-NAME 1 VEHIC-VIEW VIEW OF VEHICLES 2 PERSONNEL-ID 2 MAKE END-DEFINE * LIMIT 15 EMP. FIND EMPLOY-VIEW WITH NAME = 'SMITH' /* VEH. FIND VEHIC-VIEW WITH PERSONNEL-ID = EMP.PERSONNEL-ID IF NO RECORDS FOUND MOVE '*** NO CAR ***' TO MAKE END-NOREC DISPLAY NOTITLE EMP.NAME (IS=ON) EMP.FIRST-NAME (IS=ON) VEH.MAKE END-FIND END-FIND END
レポートに表示されるのは、姓が SMITH であるすべての人の NAME
と FIRST-NAME
(姓名)(EMPLOYEES
ファイルより入手)および彼らの所有する車の MAKE
(型)(VEHICLES
ファイルより入手)です。
NAME FIRST-NAME MAKE -------------------- -------------------- -------------------- SMITH GERHARD ROVER SEYMOUR *** NO CAR *** MATILDA FORD ANN *** NO CAR *** TONI TOYOTA MARTIN *** NO CAR *** THOMAS FORD SUNNY *** NO CAR *** MARK FORD LOUISE CHRYSLER MAXWELL MERCEDES-BENZ MERCEDES-BENZ ELSA CHRYSLER CHARLY CHRYSLER LEE *** NO CAR *** FRANK FORD
FIND 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-FIND
FIND 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-FIND