FIND |
[MULTI-FETCH-clause] [RECORDS ] [IN ] [FILE ] view-name |
|||||
[PASSWORD= operand2]
|
||||||
[CIPHER= operand3]
|
||||||
[WITH ] [[LIMIT ] (operand4)] basic-search-criterion |
||||||
[COUPLED-clause] 4/42 | ||||||
[STARTING WITH ISN= operand5] |
||||||
[SORTED-BY-clause] | ||||||
[RETAIN-clause] | ||||||
[WHERE-clause] | ||||||
[IF-NO-RECORDS-FOUND-clause] | ||||||
statement | ||||||
END-FIND |
(ストラクチャードモードのみ) | |||||
[LOOP ]
|
(レポーティングモードのみ) |
このドキュメントでは、次のトピックについて説明します。
構文図で使用されている記号については、「構文記号」を参照してください。
関連ステートメント:ACCEPT/REJECT | AT BREAK | AT START OF DATA | AT END OF DATA | BACKOUT TRANSACTION | BEFORE BREAK PROCESSING | DELETE | END TRANSACTION | FIND | GET | GET SAME | GET TRANSACTION | HISTOGRAM | LIMIT | PASSW | PERFORM BREAK PROCESSING | READ | RETRY | STORE | UPDATE
関連機能グループ:「データベースへのアクセスと更新」
FIND
ステートメントは、ディスクリプタ(キー)として定義したフィールドの検索条件をもとに、データベースからレコードの集合を選択します。
このステートメントは処理ループを開始させ、選択された各レコードに対してループ内の処理が行われます。 各レコードのすべてのフィールドを処理ループ内で参照できます。 そのため、選択した各レコード内のフィールドを参照するために、FIND
ステートメントに続けて READ
ステートメントを発行する必要はありません。
『プログラミングガイド』の「FIND ステートメント」も参照してください。
発行された FIND
ステートメントごとに *ISN
、*NUMBER
および *COUNTER
の各 Natural システム変数が自動的に生成されます。 実行中の処理ループの外側や、FIND UNIQUE
、FIND FIRST
、FIND NUMBER
のステートメントで生成されたシステム変数を参照する場合は、参照番号を指定する必要があります。 これらのシステム変数のフォーマットおよび長さは P10 です。これを変更することはできません。
*ISN |
|
||||||||
---|---|---|---|---|---|---|---|---|---|
*NUMBER |
|
||||||||
*COUNTER | システム変数 *COUNTER には、入力した処理ループの回数が含まれます。
|
「例 13 - FIND ステートメントで使用可能な Natural システム変数」も参照してください。
複数の FIND
ステートメントを発行してループのネスト構造を作成することができます。その際に、外側の選択レコードごとに内側のループ処理が行われます。
「例 14 - 複数の FIND ステートメント」も参照してください。
Entire System Server では、FIND NUMBER
および FIND UNIQUE
は使用できません。PASSWORD
、CIPHER
、COUPLED
、RETAIN
の各節も使用できません。
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | ステートメント参照 | ダイナミック定義 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 |
処理制限:
選択された集合から処理するレコード件数は、operand1 として定数(0~4294967295 の範囲)や数値のユーザー定義変数名をカッコで囲んで指定することで制限できます。
operand1 によって制限が指定された場合、この制限は FIND (5) IN EMPLOYEES WITH ... MOVE 10 TO #CNT(N2) FIND (#CNT) EMPLOYEES WITH ... このステートメントでは、指定した制限が、
注意:
|
||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
FIND FIRST | FIND NUMBER | FIND UNIQUE |
これらのオプションは、
これらのオプションの詳細な説明については、下記を参照してください。 |
||||||||||
MULTI-FETCH-clause |
Adabas データベースの場合、Natural はデータベースアクセス当たり 1 回以上の読み取りを許可する MULTI-FETCH 節を提供します。 詳細については、「MULTI-FETCH 節」を参照してください。 |
||||||||||
view-name |
レポーティングモードでは、view-name を DDM の名前にすることもできます。 |
||||||||||
PASSWORD=operand2 |
PASSWORD 節:
パスワードを定数で指定する場合、 TP モードでは、
パスワードの値は、処理ループの実行中に変更しないでください。 「例 1 - PASSWORD 節」も参照してください。 |
||||||||||
CIPHER=operand3 |
CIPHER 節:
サイファキーは、数値定数(8 桁)またはユーザー定義変数(N8)で指定できます。 サイファキーを定数で指定する場合、 サイファキーの値は、 「例 2 - CIPHER 節」も参照してください。 |
||||||||||
WITH LIMIT operand4 basic-search-criterion |
|
||||||||||
COUPLED-clause | この節は、Adabas のカップリング機能を使用した検索を行います。 「COUPLED 節」を参照してください。 | ||||||||||
STARTING WITH ISN=operand5 | この節は、処理を継続する次のレコードを簡単に指定するために、中断された FIND ループ内での再位置決めに使用できます。 「STARTING WITH 節」を参照してください。
|
||||||||||
SORTED-BY-clause | SORTED BY 節は、選択したレコードを 1 個~3 個のディスクリプタを基準に Adabas ソートします。 「SORTED BY 節」を参照してください。 | ||||||||||
RETAIN-clause | この節を使用して、大規模ファイルの検索結果を以降の処理のために保持しておくことができます。 「RETAIN 節」を参照してください。 | ||||||||||
WHERE-clause | この節を使用して、追加の選択条件(logical-condition)を指定できます。 「WHERE 節」を参照してください。 | ||||||||||
IF-NO-RECORDS-FOUND-clause | IF NO RECORDS FOUND 節を使用すると、WITH 節および WHERE 節で指定された選択条件を満たすレコードがない場合でも、FIND ステートメントで始まる処理ループに入ります。 「IF NO RECORDS FOUND 節」を参照してください。
|
||||||||||
END-FIND | FIND ステートメントを終了するには、Natural の予約キーワード END-FIND を使用する必要があります。
|
FIND FIRST
ステートメントは、WITH
条件および WHERE
条件を満たす最初の 1 件のレコードを選択し、処理します。
Adabas データベースでは、選択レコードのうち最も低い Adabas ISN 値を持つレコードが処理されます。
このステートメントは処理ループを開始しません。
FIND FIRST
はレポーティングモードでのみ使用可能です。
FIND FIRST
は、DL/I および SQL データベースでは使用できません。
IF NO RECORDS FOUND
節は FIND FIRST
ステートメントでは使用できません。
次の Natural システム変数が FIND FIRST
ステートメントで使用できます。
*ISN |
システム変数 VSAM データベースあるいは Entire System Server では、 |
---|---|
*NUMBER |
システム変数 Entire System Server では |
*COUNTER | レコードが見つかった場合は 1 、レコードが見つからなかった場合は 0 が、システム変数 *COUNTER に含まれます。
|
FIND FIRST
ステートメントの例:FNDFIR プログラム(レポーティングモード)を参照してください。
FIND NUMBER
ステートメントは、指定した WITH
/WHERE
条件を満たすレコード件数を得るために使用します。 処理ループは開始されず、データベースのフィールドも使用できません。
注意:
WHERE
節を使用すると、負荷が生じることがあります。
FIND NUMBER
ステートメントに、SORTED BY
や IF NO RECORDS FOUND
の各節を指定することはできません。
ストラクチャードモードでは、WHERE
節を使用できません。
FIND NUMBER
は、DL/I データベースまたは Entire System Server では使用できません。
次の Natural システム変数が FIND NUMBER
ステートメントで使用できます。
*NUMBER |
システム変数 |
---|---|
*COUNTER |
システム変数
|
FIND NUMBER
の例:FNDNUM プログラム(レポーティングモード)を参照してください。
FIND UNIQUE
ステートメントは、処理のために選択されたレコードが 1 件だけであることを保証するために使用します。 処理ループは開始しません。 WHERE
節の指定がある場合、WHERE
節を評価する内部処理ループが自動的に生成されます。
条件を満たすレコードがないとき、あるいは条件を満たすレコードが複数あるときは、エラーメッセージが返されます。 ON ERROR
ステートメントで、エラー条件をチェックできます。
*ISN | システム変数 *ISN は、レコードの一意な ISN 番号を持ちます。レコード自体が一意である必要があります。
|
---|---|
*NUMBER |
システム変数 エラーが発生した場合、 |
*COUNTER | システム変数 *COUNTER には、WHERE 条件の評価後に見つかったレコード数が含まれます。 WHERE 節が指定されていない場合、*COUNTER は評価されません。
|
FIND UNIQUE
はレポーティングモードでのみ使用可能です。
FIND UNIQUE
は、DL/I データベースまたは Entire System Server では使用できません。
SQL データベースに、FIND UNIQUE
は使用できません (例外:メインフレーム環境では、FIND UNIQUE
はプライマリキーに対して使用できますが、これは互換性のためだけであるため使用しないでください)。
SORTED BY
や IF NO RECORDS FOUND
の各節を FIND UNIQUE
ステートメントで使用しないでください。
FIND UNIQUE
の例:FNDUNQ プログラム(レポーティングモード)を参照してください
注意:
この節は、Adabas または DB2 データベースでのみ使用できます。
MULTI-FETCH |
|
詳細については、『プログラミングガイド』の「MULTI-FETCH 節」(Adabas)または『データベース管理システムインターフェイス』ドキュメントの「Natural for DB2」で「複数行の処理」(SQL)を参照してください。
1 descriptor [(i)]
|
|
value | OR |
|
value | |||||||||||
THRU value[BUT NOT value [THRU value]]
|
||||||||||||||||
2
descriptor [(i)]
|
|
value | ||||||||||||||
3 set-name
|
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | ステートメント参照 | ダイナミック定義 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
descriptor | S | A | A | N | P | I | F | B | D | T | L | 不可 | 不可 | |||||||
value | C | S | A | 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-criterion にのみ可)
AND:AND 結合
OR:OR 結合
Basic-search-criteria は論理演算子で複合 search-expression の形に結合できます。 複合 search-expression の構文は次のようになります。
[NOT ]
|
basic-search-criterion |
|
search-expression |
「例 5 - WITH 節のさまざまな複合検索式の例」も参照してください。
Adabas ユーザーは、ディスクリプタとして定義されているデータベースフィールドを基本検索条件に使用できます。
Adabas では、検索条件にサブディスクリプタ、スーパーディスクリプタ、ハイパーディスクリプタ、およびフォネティックディスクリプタが使用できます。
サブディスクリプタは、フィールドの一部で作られたディスクリプタです。
スーパーディスクリプタは、1 つ以上のフィールドまたはフィールドの一部から構成されたディスクリプタです。
ハイパーディスクリプタは、ユーザー定義アルゴリズムを使用して作ったディスクリプタです。
フォネティックディスクリプタは、発音による検索(例:人の名前)を行うディスクリプタです。 フォネティック検索では、発音が検索値に類似するすべての値が返されます。
どのファイルのどのフィールドをディスクリプタ、サブディスクリプタ、スーパーディスクリプタ、ハイパーディスクリプタ、フォネティックディスクリプタとして使用できるかは対応する DDM に定義されます。
これらのディスクリプタ値は、ディスクリプタの内部フォーマットに対して変換できる必要があります。 サブディスクリプタの内部フォーマットは、そのサブディスクリプタを作り出したもとのフィールドのフォーマットと同じです。 スーパーディスクリプタの内部フォーマットは、もとのフィールドがすべて数字フォーマットのときはバイナリであり、そうでなければ英数字フォーマットです。 フォネティックディスクリプタは、常に英数字フォーマットです。
サブディスクリプタやスーパーディスクリプタの値は、次のように指定できます。
数字または 16 進定数。 ただしバイナリフォーマットのスーパーディスクリプタに対しては、16 進定数を使用する必要があります(上記参照)。
サブディスクリプタやスーパーディスクリプタの各部分を、REDEFINE
ステートメントで再定義した形のユーザー定義変数内の値。
データベース内の配列に含まれるディスクリプタも、基本検索条件の中に使用できます。 Adabas データベースを使用している場合、MU または PE に含まれるディスクリプタのことです。
ピリオディックグループに含まれるディスクリプタをインデックス付きまたはなしで指定できます。 インデックスなしで指定した場合、レコードは指定した値がいずれかのオカレンスに見つかった場合に選択されます。 インデックス付きで指定した場合、レコードは値がインデックスで指定したオカレンス内に見つかった場合にのみ選択されます。 インデックスは定数で指定する必要があります。 インデックス範囲は使用できません。
マルチプルバリューフィールドのディスクリプタは、インデックスなしで指定する必要があります。 レコードは、値がレコード内で位置に関係なく見つかった場合に選択されます。
「例 6 - データベース配列のさまざまな使用例」も参照してください。
1 |
descriptor |
|
value | ||||
2 |
descriptor |
|
value THRU value
|
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | ステートメント参照 | ダイナミック定義 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
descriptor | S | A | A | N | P | B | 不可 | 不可 | |||||||||||
value | C | S | A | N | P | B | 可 | 不可 |
構文要素の説明:
descriptor | ディスクリプタは、VSAM キーフィールドとして VSAM ファイルに定義され、DDM 内に P (プライマリキー)または A (オルタネートキー)を設定する必要があります。
|
---|---|
value | 検索値。 |
descriptor と検索 value のフォーマットは変換可能にする必要があります。
1 |
descriptor |
|
value | ||||
2 |
descriptor |
|
value THRU value [BUT NOT value]
|
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | ステートメント参照 | ダイナミック定義 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
descriptor | S | A | A | N | P | B | 不可 | 不可 | |||||||||||
value | C | S | A | N | P | B | 可 | 不可 |
構文要素の説明:
descriptor | ディスクリプタは、DL/I 内で定義されたフィールドで、DDM 内に D と設定されている必要があります。
|
---|---|
value | 検索値。 |
HDAM データベースに対しては、次の basic-search-criterion だけが使用できます。
descriptor |
|
value |
[NOT ]
|
basic-search-criterion |
|
search-expression |
異なるセグメントタイプを参照する basic-search-criteria は、OR 論理演算子で結合しないでください。
FIND COURSE WITH COURSEN > 1 FIND COURSE WITH COURSEN > 1 AND COURSEN < 100 FIND OFFERING WITH (COURSEN-COURSE > 1 OR TITLE-COURSE = 'Natural') AND LOCATION = 'DARMSTADT'
FIND OFFERING WITH COURSEN-COURSE > 1 OR LOCATION = 'DARMSTADT'
この節は 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 ファイル内にあるので参照できません。
EMPLOYEES と VEHICLES が物理的にカップリングされている場合にのみ、レコードの検索が行われます。
オプション VIA descriptor1 = descriptor2
により、検索参照で複数の Adabas ファイルの論理カップリングが可能となります。
2 つのファイルは Adabas で物理的にカップリングする必要はありません。 この COUPLED
オプションは、Adabas のソフトカップリング機能(Adabas ドキュメントを参照)を使用します。
「例 8 - VIA 節」も参照してください。
この節は、Adabas および VSAM データベースにのみ適用されます。VSAM では、ESDS にのみ有効です。
operand5 として、Adabas ISN(内部シーケンス番号)または VSAM RBA(相対バイトアドレス)を指定するために、この節を使用すると、レコードの選択のための開始値として使用されます。
この節は、処理を継続する次のレコードを簡単に確定するために、処理が中断された FIND
ループ内で再位置決めに使用できます。 これは特に、次のレコードをディスクリプタ値で一意に識別できない場合に役立ちます。 また、分散クライアント/サーバーアプリケーションで、レコードをサーバープログラムで読み取ってクライアントプログラムで処理し、レコードを順次処理ではなくバッチ処理する場合にも役立ちます。
注意:
実際に使用される開始値は operand5 の値ではなく、次に高い値になります。
ライブラリ SYSEXSYN のプログラム FNDSISN を参照してください。
この節は、Adabas、または SQL データベースにのみ適用されます。
この節は Entire System Server では使用できません。
SORTED [BY ] descriptor 3 [DESCENDING ]
|
SORTED BY
節は、選択したレコードを 1 個~3 個のディスクリプタを基準に Adabas ソートします。 ソートの順番を制御するディスクリプタと、レコードの選択に使用するディスクリプタは、異なるものを指定できます。
デフォルトで、レコードは昇順にソートされます。降順にソートする場合は、キーワード DESCENDING
を指定します。 ソートは、レコードを読み込まず、Adabas インバーテッドリストを使用して行われます。
注意:
ソート順を制御するディスクリプタの値の数が多くなると負荷も大きくなります。 これは、選択された全レコードがリスト内に位置づけられるまで値のリスト全体をスキャンするからです。 大量のレコードをソートするときには、SORT
ステートメントを使用してください。
Adabas のソート制限(Adabas ドキュメントの ADARUN の LS
パラメータを参照)は、SORTED BY
節を使用するときに影響します。
PE 内のディスクリプタを 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 バージョン 8 および UNIX/OpenVMS/Windows 用の Adabas バージョン 6.1 で実行される場合:
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(Adabas バージョン 8)での結果 | Natural for OpenSystems(Adabas バージョン 6.1)での結果 |
---|---|
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 |
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
節を使用すると、WITH
節および WHERE
節で指定された選択条件を満たすレコードがない場合でも、FIND
ステートメントで始まる処理ループに入ります。
IF NO RECORDS FOUND
節は、WITH
および WHERE
条件の指定を満たすレコードがない場合、1 回だけ"空"のレコードの FIND
処理ループを実行します。 これが望ましくない場合は、IF NO RECORDS FOUND
節に ESCAPE BOTTOM
ステートメントを指定します。
1つ以上のステートメントが IF NO RECORDS FOUND
節で指定されると、処理ループに入る直前にこれらのステートメントが実行されます。 ループに入る前に実行するステートメントがない場合は、キーワード ENTER
を使用する必要があります。
「例 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
基本検索条件に使用するディスクリプタが MU のとき、基本的に 4 種類の異なる結果を取得できます。次の例では、MU-FIELD
は MU とします。
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
を PE に属するディスクリプタ、LANG
を MU であるとします。
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 ファイルを FIND し、姓が 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