FIND

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

関連ステートメント: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 ステートメントを発行する必要はありません。

プログラミングガイド』の次のセクションも参照してください。

データベース固有の考慮事項

データベース 説明
SQL

FIND FIRST および PASSWORDCIPHERCOUPLEDRETAIN の各節も使用できません。

FIND UNIQUE は許可されていません。

SORTED BY 節は SQL の ORDER BY 節に相当します。

SQL データベーステーブルに対する基本検索条件は Adabas ファイルの場合と同じ方法で指定できます。本文で使用する用語レコードは SQL 用語の "行" に相当します。

XML

FIND FIRST、および PASSWORDCIPHERCOUPLEDRETAIN の各節も使用できません。

FIND UNIQUE は許可されていません。

XML データベースに対する基本検索条件は Adabas ファイルの場合と同じ方法で指定できます。本文で使用する用語レコードは XML 用語の "XML オブジェクト"に相当します。

FIND ステートメントで使用可能な Natural システム変数

発行された FIND ステートメントごとに *ISN*NUMBER および *COUNTER の各 Natural システム変数が自動的に生成されます。実行中の処理ループの外側や、FIND UNIQUEFIND FIRSTFIND NUMBER のステートメントで生成されたシステム変数を参照する場合は、参照番号を指定する必要があります。これらのシステム変数のフォーマットおよび長さは P10 です。これを変更することはできません。

システム変数 可用性/使用状況
*ISN
  • Adabas

    *ISN には、現在処理中のレコードの Adabas 内部シーケンス番号(ISN)が含まれます。

    *ISN は、FIND NUMBER ステートメントでは使用できません。

  • Tamino

    *ISN には XML オブジェクト ID が含まれます。

  • SQL

    *ISN は使用できません。

  • Entire System Server

    *ISN は使用できません。

*NUMBER

システム変数』ドキュメントのシステム変数「*NUMBER」を参照してください。

Entire System Server では *NUMBER を使用できません。

*COUNTER システム変数 *COUNTER には、入力した処理ループの回数が含まれます。

例 13 - FIND ステートメントで使用可能な Natural システム変数」も参照してください。

複数の FIND ステートメント

複数の FIND ステートメントを発行してループのネスト構造を作成することができます。その際に、外側の選択レコードごとに内側のループ処理が行われます。

例 14 - 複数の FIND ステートメント」も参照してください。

制限

Entire System Server では、FIND NUMBERFIND UNIQUE および PASSWORDCIPHERCOUPLEDRETAIN の各節も使用できません。

構文 1 - 処理ループのある FIND ステートメント

FIND

ALL
(operand1)

[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   (レポーティングモードのみ)

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

構文 2 - 処理ループのない FIND ステートメント

FIND

FIRST
NUMBER
UNIQUE

[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 *             ×

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

構文要素の説明:

構文要素 説明
ALL/operand1
処理制限:

選択された集合から処理するレコード件数は、定数(04294967295 の範囲)や数値のユーザー定義変数名として、operand1(キーワード FIND の直後にカッコで囲む)を指定することで制限できます。

ALL は、オプションで指定できます。選択されたレコードをすべて処理することを明示的に指定します。

operand1 によって制限が指定された場合、この制限は FIND で開始した処理ループに適用されます。WHERE 節で除かれたレコードは、この制限値の対象とはなりません。

FIND (5) IN EMPLOYEES WITH ...
  
MOVE 10 TO #CNT(N2)
FIND (#CNT) EMPLOYEES WITH ...

このステートメントでは、指定した制限が、LIMIT ステートメントで設定した制限より優先されます。

LT パラメータで設定された制限の方が小さい場合は、LT 制限が有効になります。

注意:

  1. 4 桁のレコード数を処理する場合は、リーディングゼロを指定します。(0nnnn)。Natural ではカッコで囲まれた 4 桁の数値はステートメントを参照する行番号と解釈されるからです。
  2. operand1RETAIN 節で保持される ISN 集合のサイズには影響しません。operand1 は、FIND ループに入るときに評価されます。operand1 の値が FIND ループ内で変更されても、この値は処理するレコード数に影響を与えません。
FIND FIRST | FIND NUMBER | FIND UNIQUE
FIND FIRST, FIND NUMBER, FIND UNIQUE オプション:

これらのオプションは、

  • 選択されたレコードの集合の最初の 1 件を使用する(FIND FIRST)、

  • 選択された集合のレコード件数を得る(FIND NUMBER)、

  • または 1 レコードだけが検索条件を満たすことを保証する(FIND UNIQUE)ために使用します。

MULTI-FETCH-clause
MULTI-FETCH 節:

Adabas データベースの場合、Natural はデータベースアクセス当たり 1 回以上の読み取りを許可する MULTI-FETCH 節を提供します。詳細については、「MULTI-FETCH 節」を参照してください。

view-name
ビュー名:

DEFINE DATA ブロック内、または別のグローバルデータエリアやローカルデータエリアで定義されたビュー名です。

レポーティングモードでは、DEFINE DATA LOCAL ステートメントが使用されていない場合、DDM の名前は view-name です。

PASSWORD=operand2
PASSWORD 節:

PASSWORD 節は、Adabas データベースにのみ適用されます。この節は Entire System Server では使用できません。

PASSWORD 節は、パスワード保護された Adabas ファイルのデータを読み込むときまたは書き込むときに、そのパスワード(operand2)を指定するために使用します。パスワードで保護されたファイルにアクセスするときは、データベースセキュリティ責任者にパスワードの使用や割り当てについて相談してください。

PASSWORD 節を省略すると、PASSW ステートメントで指定したパスワードが適用されます。

パスワードの値は、処理ループの実行中に変更しないでください。

例 1 - PASSWORD 節」も参照してください。

CIPHER=operand3
CIPHER 節:

CIPHER 節は Adabas データベースにのみ適用されます。この節は Entire System Server では使用できません。

CIPHER 節は、サイファリング(暗号化)された Adabas ファイルからデータを読み込むとき、そのサイファキー(operand3)を指定します。サイファリングされたファイルにアクセスするときは、データベースセキュリティの責任者にサイファキーの使用や割り当てについて相談してください。

サイファキーは、数値定数(8 桁)またはユーザー定義変数(N8)で指定できます。

サイファキーの値は、FIND ステートメントで開始された処理ループ内では変更しないでください。

例 2 - CIPHER 節」も参照してください。

WITH LIMIT operand4 basic-search-criteria
WITH 節:

WITH 節は必須です。データベースで定義されているキーフィールド(ディスクリプタ)から構成される basic-search-criteria を指定するために使用されます(「Adabas ファイルに対する検索条件」を参照)。

次のデータベース固有の考慮事項が適用されます。

WITH 節でディスクリプタ、サブディスクリプタ、スーパーディスクリプタ、ハイパーディスクリプタ、およびフォネティックディスクリプタを使用できます。非ディスクリプタ(DDM に N と設定されたフィールド)も指定できます。

WITH 節で選択するレコード件数は、キーワード LIMIT とともに数値定数やユーザー定義変数をカッコで囲んだ制限値(operand4)で指定できます。選択レコード件数が制限値を超過した場合、エラーメッセージが出力されプログラムが終了します。

注意:
制限が 4 桁の数の場合、リーディングゼロを指定する必要があります(0nnnn)。これは、カッコで囲まれた 4 桁の数は、すべてステートメントを参照する行番号であると Natural が解釈するためです。

COUPLED-clause
COUPLED 節:

この節は、Adabas のカップリング機能を使用した検索を行います。「COUPLED 節」を参照してください。

STARTING WITH ISN=operand5
STARTING WITH 節:

この節は、処理を継続する次のレコードを簡単に指定するために、中断された FIND ループ内での再位置決めに使用できます。「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 節

注意:
この節は Adabas へのアクセスのみに使用できます。

この節は"共有ホールド"状態で読み取られるレコードの配置に使用できます。レコードは、多数のユーザーが同時に共有ホールドにできます。レコードが共有ホールド状態にある限り、同時ユーザーによって排他的ホールドに設定できないため、更新から保護されます。このため、処理中はユーザーがレコードを更新できないので、レコードデータのデータ整合性が確保されます。

特に、異なる MU/PE オカレンス(GET SAME ステートメント)を読み取るために同じレコードを複数のステートメントで取得したり、区分的手法(READLOB ステートメント)で LOB フィールドを参照したりする場合は、共有ホールドステートにより、他のユーザーのレコードをブロックすることなく、このトランザクションでのデータの安定性を保証できます。

このようなホールド状態は読み込み順序を保護する効果的な手段ですが、レコードをこの"ソフトロック"からいつ解放するかという基本的で重要な問題が生じます。この問題は個々のアプリケーションの局面によって異なるので、MODE 副節で異なるオプションを選択できます。

MODE オプション
ホールド期間
説明
C レコードの読み込み時のみ。 読み込まれるレコードのバージョンのみが、レコードを最後に更新したユーザーによってコミットされるようにします。このオプションは実際にホールド状態でロックを設定するのではなく、読み込み時に別のユーザーによってレコードが排他的にホールドされないようにチェックするだけです。
Q 次の順序のレコードが読み込まれるまで。 次の場合に、レコードを共有ホールドから解放します。
S 論理トランザクションが終了するまで。 END TRANSACTION または BACKOUT TRANSACTION ステートメントで論理トランザクションが終了すると、レコードが共有ホールドから解放されます。
MODE=Q および MODE=S では、読み取り中のレコードが再度ホールドからリリースされるまで、他のユーザーが同時に更新できないようにします。

MODE 副節が指定されていない場合、デフォルトは MODE=C です。

例 15 - SHARED HOLD 節」も参照してください。

SKIP RECORDS IN HOLD
SKIP RECORDS 節

注意:
この節は Adabas へのアクセスのみに使用できます。

ホールド状態のレコードを読み込むとき、このレコードが別のユーザーによって同時にホールドされていると、Natural エラー NAT3145(Adabas レスポンスコード 145)が発生する場合があります。共有ホールドが要求され、レコードが排他的ホールドの状態にある場合、または排他的ホールドが要求され、レコードが排他的または共有ホールドの状態にある場合に発生します。

エラー NAT3145 は "クリーンデータ処理"を保証するための適切な対処ですが、ホールドされているレコードをスキップできると便利です。このようなレコードを処理せずにループ処理を続行しても問題がない場合は、SKIP RECORDS 節を使用します。

SKIP RECORDS 節を適用すると、Natural はまずホールドされているレコードを読み込もうとします。

レコードがすでにホールドされていて、Natural エラー NAT3145 が発生する場合、以下の原因が考えられます。

  • エラー処理が開始されていない

  • レコード(別のユーザーによって現在ホールドされている)がホールドなしで即座に再フェッチされるが、プログラムロジックの面では処理されない

  • スキップされたレコードの次のレコードはホールド状態で読み込まれ、処理が続行する

例 16 - SKIP RECORDS 節」も参照してください。

WHERE-clause
WHERE 節:

この節を使用して、追加の選択条件(logical-condition)を指定できます。「WHERE 節」を参照してください。

IF-NO-RECORDS-FOUND-clause
IF NO RECORDS FOUND 節:

この節を使用すると、WITH 節および WHERE 節で指定された選択条件を満たすレコードがない場合でも、FIND ステートメントで始まる処理ループに入ります。「IF NO RECORDS FOUND 節」を参照してください。

END-FIND
End of FIND ステートメント:

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

処理ループのあるレポーティングモードの場合、Natural のステートメント LOOP を使用して FIND ステートメントを終了させます。

LOOP

FIND FIRST

FIND FIRST ステートメントは、WITH 条件および WHERE 条件を満たす最初の 1 件のレコードを選択し、処理します。

Adabas データベースでは、選択レコードのうち最も低い Adabas ISN 値を持つレコードが処理されます。

このステートメントは処理ループを開始しません

FIND FIRST の制限事項

  • FIND FIRST はレポーティングモードでのみ使用できます。

  • FIND FIRST は、 SQL データベースでは使用できません。

FIND FIRST で使用可能なシステム変数:

次の Natural システム変数を FIND FIRST ステートメントで使用できます。

システム変数 説明
*ISN システム変数 *ISN には選択レコードの Adabas ISN が含まれます。*ISN は、WITH および WHERE 条件の評価後にレコードが 1 件も見つからなかった場合、ゼロになります。

*ISN は、 Entire System Server では使用できません。

*NUMBER システム変数 *NUMBER には、WITH 条件の評価後、WHERE 条件が評価される前のレコード数が含まれます。*NUMBER は、WITH 条件を満たすレコードがなければ、ゼロになります。

*NUMBER は Entire System Server では使用できません。

*COUNTER レコードが見つかった場合は 1、レコードが見つからなかった場合は 0 が、システム変数 *COUNTER に含まれます。

FIND FIRST ステートメントの例:プログラム FNDFIR(レポーティングモード)を参照してください

FIND NUMBER

FIND NUMBER ステートメントは、指定した WITH/WHERE 条件を満たすレコード件数を得るために使用します。処理ループは開始されずデータベースのフィールドも使用できません

注意:
WHERE 節を使用すると、負荷が生じることがあります。

FIND NUMBER の制限事項

  • WHERE 節はレポーティングモードでのみ使用できます。

  • FIND NUMBER は、 Entire System Server では使用できません。

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

次の Natural システム変数を FIND NUMBER ステートメントで使用できます。

システム変数 説明
*NUMBER システム変数 *NUMBER には、WITH 条件の評価後に見つかったレコード数が含まれます。
*COUNTER システム変数 *COUNTER には、WHERE 条件の評価後に見つかったレコード数が含まれます。

*COUNTER は、FIND NUMBER ステートメントに WHERE 節が指定された場合にのみ有効です。

FIND NUMBER の例:プログラム FNDNUM(レポーティングモード)を参照してください。

FIND UNIQUE

FIND UNIQUE ステートメントは、処理のために選択されたレコードが 1 件だけであることを保証するために使用します。処理ループは開始しませんWHERE 節の指定がある場合、WHERE 節を評価する内部処理ループが自動的に生成されます。

条件を満たすレコードがないとき、あるいは条件を満たすレコードが複数あるときは、エラーメッセージが返されます。ON ERROR ステートメントで、エラー条件をチェックできます。

制限事項

  • FIND UNIQUE はレポーティングモードでのみ使用できます。

  • FIND UNIQUE は、 Entire System Server では使用できません。

  • SQL データベースに、FIND UNIQUE は使用できません(例外:メインフレームコンピュータでは、FIND UNIQUE はプライマリキーに対して使用できますが、これは互換性のためだけであるため使用しないでください)。

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

システム変数 説明
*ISN システム変数 *ISN は、レコードの一意な ISN 番号を持ちます。レコード自体が一意である必要があります。
*NUMBER システム変数 *NUMBER は、有効な FIND UNIQUE 実行に対しては常に 1 です。

*NUMBER は、エラーが発生した場合、他の値(= 0 または >= 2)を含んでいる可能性があります。このエラー条件は、ON ERROR ステートメントで使用することができます。*NUMBER は、WHERE 節が指定されていない場合、使用できません。

*COUNTER システム変数 *COUNTER には、WHERE 条件の評価後に見つかったレコード数が含まれます。*COUNTER は、WHERE 節が指定されていない場合、使用できません。

FIND UNIQUE の例:プログラム FNDUNQ(レポーティングモード)を参照してください

MULTI-FETCH 節

注意:
この節は、Adabas データベースでのみ使用できます。

MULTI-FETCH 

ON
OFF
[OF] multi-fetch-factor

注意:
[MULTI-FETCH OF multi-fetch-factor] は、データベースタイプ ADA および ADA2 に対して評価されません。デフォルト処理モードが適用されます(プロファイルパラメータ MFSET を参照)。MULTI-FETCH 節は、データベースタイプ ADA2, で使用しても完全に無視されます(『コンフィグレーションユーティリティ』ドキュメントの「データベース管理システムの割り当て」を参照)。

詳細については、『プログラミングガイド』の「MULTI-FETCH 節」(Adabas)

Adabas ファイルに対する検索条件

1 descriptor   [(i)]

EQ
=
EQUAL
EQUAL TO

value

OR

EQ
=
EQUAL
EQUAL TO

value

THRUvalue[BUT NOT value[THRU value]]
2 descriptor  [(i)]

EQ
=
EQUAL
EQUAL TO
NE
<>
NOT =
NOT EQ
NOTEQUAL
NOT EQUAL
NOT EQUAL TO
LT
LESS THAN
<
GE
GREATER EQUAL
>=
NOT <
NOT LT
GT
GREATER THAN
>
LE
LESS EQUAL
<=
NOT >
NOT GT

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                         × ×

構文要素の説明:

構文要素 説明
descriptor
ディスクリプタ:

Adabas ディスクリプタ、サブディスクリプタ、スーパーディスクリプタ、ハイパーディスクリプタ、またはフォネティックディスクリプタ。DDM でディスクリプタ以外としてマークされたフィールドも指定できます。

(i)
添字指定:

ピリオディックグループに含まれるディスクリプタをインデックス付きまたはなしで指定できます。インデックスなしで指定した場合、レコードは指定した値がいずれかのオカレンスに見つかった場合に選択されます。インデックス付きで指定した場合、レコードは値がインデックスで指定したオカレンス内に見つかった場合にのみ選択されます。インデックスは定数で指定する必要があります。インデックス範囲は使用できません。

マルチプルバリューフィールドのディスクリプタは、インデックスなしで指定する必要があります。レコードは、値がレコード内で位置に関係なく見つかった場合に選択されます。

value
検索値:

ディスクリプタと検索値のフォーマットは変換可能にする必要があります。

set-name
集合名:

RETAIN 節を指定した FIND ステートメントで、すでに選択されたレコードの集合の名前です。FIND で参照する集合名は、同じ物理 Adabas ファイルから作成する必要があります。set-name は、最大 32 文字の文字定数、あるいは英数字フォーマットの変数として指定します。

set-name は、Entire System Server では使用できません。

以下の項目も参照してください。

NULL インジケータでの検索条件

null-indicator

=
EQ
EQUAL [TO]

value

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

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
null-indicator   S             I                 × ×
value C S         N P I F B             ×

構文要素の説明:

構文要素 説明
null-indicator 空値インジケータ。
value
指定可能な値
意味
-1 対応するフィールドは値を含んでいません。
0 対応するフィールドは値を含んでいます。

検索条件の結合(Adabas ファイル使用時)

basic-search-criteria は、ブール演算子 AND、OR および NOT を使用して結合できます。カッコで囲んで評価の優先順位を制御することもできます。評価の順序は次のとおりです。

  1. ( ):カッコ

  2. NOT:否定([2] の形式の basic-search-criteria 専用)

  3. AND:AND 操作

  4. OR:OR 操作

basic-search-criteria は論理演算子で複合 search-expression の形に結合できます。複合 search-expression の構文は次のようになります。

[NOT]

basic-search-criteria
(search-expression)

OR
AND

search-expression

例 5 - WITH 節のさまざまな複合検索式の例」も参照してください。

ディスクリプタ(キー)の使用

Adabas ユーザーは、ディスクリプタとして定義されているデータベースフィールドを基本検索条件に使用できます。

サブディスクリプタ、スーパーディスクリプタ、ハイパーディスクリプタ、フォネティックディスクリプタ

Adabas では、検索条件にサブディスクリプタ、スーパーディスクリプタ、ハイパーディスクリプタ、およびフォネティックディスクリプタが使用できます。

  • サブディスクリプタは、フィールドの一部で作られたディスクリプタです。

  • スーパーディスクリプタは、1 つ以上のフィールドまたはフィールドの一部から構成されたディスクリプタです。

  • ハイパーディスクリプタは、ユーザー定義アルゴリズムを使用して作ったディスクリプタです。

  • フォネティックディスクリプタは、発音による検索(例:人の名前)を行うディスクリプタです。フォネティック検索では、発音が検索値に類似するすべての値が返されます。

どのファイルのどのフィールドをディスクリプタ、サブディスクリプタ、スーパーディスクリプタ、ハイパーディスクリプタ、フォネティックディスクリプタとして使用できるかは対応する DDM に定義されます。

サブディスクリプタ、スーパーディスクリプタ、フォネティックディスクリプタに対する値

これらのディスクリプタ値は、ディスクリプタの内部フォーマットに対して変換できる必要があります。サブディスクリプタの内部フォーマットは、そのサブディスクリプタを作り出したもとのフィールドのフォーマットと同じです。スーパーディスクリプタの内部フォーマットは、もとのフィールドがすべて数字フォーマットのときはバイナリであり、そうでなければ英数字フォーマットです。フォネティックディスクリプタは、常に英数字フォーマットです。

サブディスクリプタやスーパーディスクリプタの値は、次のように指定できます。

  • 数字または 16 進定数。ただしバイナリフォーマットのスーパーディスクリプタに対しては、16 進定数を使用する必要があります(上記参照)。

  • サブディスクリプタやスーパーディスクリプタの各部分を、REDEFINE ステートメントで再定義した形のユーザー定義変数内の値。

データベース配列内のディスクリプタの使用

データベース内の配列に含まれるディスクリプタも、基本検索条件の中に使用できます。Adabas データベースを使用している場合、MU または PE に含まれるディスクリプタのことです。

ピリオディックグループに含まれるディスクリプタをインデックス付きまたはなしで指定できます。インデックスなしで指定した場合、レコードは指定した値がいずれかのオカレンスに見つかった場合に選択されます。インデックス付きで指定した場合、レコードは値がインデックスで指定したオカレンス内に見つかった場合にのみ選択されます。インデックスは定数で指定する必要があります。インデックス範囲は使用できません。

マルチプルバリューフィールドのディスクリプタは、インデックスなしで指定する必要があります。レコードは、値がレコード内で位置に関係なく見つかった場合に選択されます。

例 6 - データベース配列のさまざまな使用例」も参照してください。

COUPLED 節

この節は Adabas データベースにのみ適用されます。

この節は Entire System Server では使用できません。

AND
OR

COUPLED   [TO] [FILE] view-name          
       

VIA descriptor1

EQ
=
EQUAL [TO]

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-nameRETAIN 節参照)を basic-search-criteria に指定しないでください。

COUPLED 節内で指定したファイルのデータベースフィールドは、別の FINDREAD ステートメントをカップリングされたファイルに発行しない限り、プログラム内で後から参照することはできません。

注意:
COUPLED 節を使用する場合は、メインの WITH 節を省略できます。メインの WITH 節を省略するときは、COUPLED 節でキーワード AND/OR を指定しないでください。

物理カップリング(VIA指定なし)

VIA を指定しない COUPLED 節に使用するファイルは、所定の Adabas ユーティリティ(Adabas ドキュメントを参照)を使用して物理的にカップリングされている必要があります。

例 7 - 物理カップリングファイルの使用」も参照してください。

上の例の DISPLAY ステートメントにある NAME は、EMPLOYEES ファイル内にこのフィールドがあるので参照できますが、MAKECOUPLED 節に指定された VEHICLES ファイル内にあるため MAKE を参照することはできません。

EMPLOYEESVEHICLES が物理的にカップリングされている場合にのみ、レコードの検索が行われます。

論理カップリング - VIA 節

オプション VIA descriptor1 = descriptor2 により、検索参照で複数の Adabas ファイルの論理カップリングが可能となります。

  • descriptor1 は最初のビューのフィールドであり、

  • descriptor2 は 2 番目のビューのフィールドです。

2 つのファイルは Adabas で物理的にカップリングする必要はありません。

例 8 - VIA 節」も参照してください。

STARTING WITH 節

この節は、Adabas データベースにのみ適用されます。

operand5 として、Adabas ISN(内部シーケンス番号)を指定するために、この節を使用すると、レコードの選択のための開始値として使用されます。

この節は、処理を継続する次のレコードを簡単に指定するために、処理が中断された FIND ループ内での再位置決めに使用できます。これは特に、次のレコードをディスクリプタ値で一意に識別できない場合に役立ちます。また、分散クライアント/サーバーアプリケーションで、レコードをサーバープログラムで読み取ってクライアントプログラムで処理し、レコードを順次処理ではなくバッチ処理する場合にも役立ちます。

注意:
実際に使用される開始値は operand5 の値ではなく、次に高い値になります。

例:

ライブラリ SYSEXSYN のプログラム FNDSISN を参照してください。

SORTED BY 節

この節は、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 節を組み合わせて使用する場合の考慮事項

STARTING WITH 節と SORTED BY 節の両方が同じ FIND ステートメントで使用され、基準データベースが Adabas の場合は、次の点を考慮する必要があります。

Adabas for Mainframes の場合

Adabas for Mainframes では、FIND ステートメントは次の手順で実行されます。

  1. 検索条件に一致するすべてのレコードが収集され、ISN 順序で配置されます。

  2. レコードは、SORTED BY 節で指定されたディスクリプタの順にソートされます。

  3. ISN 値が STARTING WITH 節で指定されているレコードは、"sorted-by-descriptor" レコードリストに配置されます。

  4. 手順 3 で見つかったレコードに続くレコードが、FIND ループで返されます。

Adabas for OpenSystems の場合

Adabas for OpenSystems(UNIX、OpenVMS、Windows)では、同じステートメントは次のように実行されます。

  1. 検索条件に一致するすべてのレコードが収集され、ISN 順序で配置されます。

  2. ISN 値が STARTING WITH 節で指定されているレコードは、"sorted-by-ISN" レコードリストに配置されます。

  3. 手順 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 節を組み合わせて使用することは避ける必要があります。

RETAIN 節

この節は Adabas データベースにのみ適用されます。

この節は Entire System Server では使用できません。

RETAIN AS operand6

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

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
operand6 C S       A                       ×

構文要素の説明:

構文要素 説明
RETAIN AS
結果を保持:

RETAIN 節を使用すると、大規模ファイルの検索結果を以降の処理のために保持しておくことができます。

選択されたレコードは、Adabas ワークファイルに ISN-set として保持されます。この集合を後続の FIND ステートメントの基本検索条件で指定して、さらにしぼり込んだり、レコードを処理したりできます。

生成された集合は、特定のファイルに属します。他の FIND ステートメントで集合を使用する場合は、同じファイルを処理する必要があります。集合は、どの Natural プログラムでも参照できます。

operand6
集合名:

集合名は、レコードの集合を識別するために使用します。英数字定数あるいは英数字のユーザー定義変数の内容として指定できます。集合名の重複はチェックされません。そのため、同じ集合名を指定すると、新しい集合が古い集合を置き換えます。

例 10 - RETAIN 節」も参照してください。

集合の解放

保持できる集合数や集合内の ISN の件数については、特別な制限はありません。ただし、一度に定義する ISN の集合数は、最小限にとどめておくことをお勧めします。不要になった集合は、RELEASE SETS ステートメントで解放してください。

RELEASE ステートメントで集合を解放しないと、保持された集合は自動的には解放されず、Natural セッション全体を通して存在します。また、別のライブラリにログオンするまで存在します。あるプログラムで作成した集合を、他のプログラムで処理したり、検索条件を追加してさらにしぼり込んだりするために参照できます。

他のユーザーによる更新処理

保持された集合内の ISN で識別されたレコードは、他のユーザーのアクセスおよび(または)更新をロックすることはありません。このため、その集合からレコードを処理する前に、集合の作成に使用した元の検索条件が有効であるかどうかを確認する場合に便利です。この確認は、別の FIND ステートメントの基本検索条件として WITH 節に集合名を指定し、WHERE 節に元の検索条件(集合作成時に FIND ステートメントの WITH 節で指定した基本検索条件)を指定します。

制限事項

RETAIN 節を使用する場合、SORTED BY 節を一緒に使用しないでください。

WHERE 節

WHERE logical-condition

WHERE 節は、追加の選択条件(logical-condition)を指定するために使用できます。この条件は、値が読み取られた、値に対する処理が実行されるに評価されます(AT BREAK 評価を含む)。

logical-condition の構文については、『プログラミングガイド』の「論理条件基準」で説明しています。

WHERE 節を持つ FIND ステートメントに、処理数制限の指定がある場合、WHERE 節により除かれたレコードは制限数の合計数から除かれます。しかし、これらのレコードは、Natural セッションパラメータ LTGLOBALS コマンド、LIMIT ステートメントに指定されたグローバルリミットに対しては、合計されます。

例 11 - WHERE 節」も参照してください。

IF NO RECORDS FOUND 節

ストラクチャードモード構文

IF NO [RECORDS] [FOUND]

ENTER
statement

END-NOREC

レポーティングモード構文

IF NO [RECORDS] [FOUND]

ENTER
statement
DO statement DOEND

構文要素の説明:

構文要素 説明
IF NO RECORDS FOUND
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 ステートメントを指定します。

ENTER
statement ...

ステートメントの実行:

1 つ以上のステートメントが IF NO RECORDS FOUND 節で指定されると、処理ループに入る直前にこれらのステートメントが実行されます。

ループに入る前に実行するステートメントがない場合は、キーワード ENTER を使用する必要があります。

END-NOREC
IF NO RECORDS FOUND 節の終了:

ストラクチャードモードでは、IF NO RECORDS FOUND 節を終了するには、Natural の予約語 END-NOREC を使用する必要があります。

レポーティングモードでは、状況に応じて、DO ... DOEND ステートメントを使用して 1 つ以上の適切なステートメントを指定し、IF NO RECORDS FOUND 節を終了します。単一のステートメントまたはキーワード ENTER(上記参照)のみを指定する場合は、DO ... DOEND ステートメントを省略できます。よいコーディング習慣に則して、これはお勧めしません。

ENTER
statement
DO statement ... DOEND

例 12 - IF NO RECORDS FOUND 節」も参照してください。

データベース値

IF NO RECORDS FOUND 節内のステートメントで値が割り当てられない限り、Natural はループで指定されたファイルを参照するすべてのデータベースフィールドをリセットして空にします。

システム機能の評価

Natural システム機能は、IF NO RECORDS FOUND 節の結果として処理用に作成される空のレコードに対して 1 回評価されます。

制限事項

この節は、FIND FIRSTFIND NUMBER および FIND UNIQUE では使用できません。

FIND NUMBER:プログラム FNDNUM の例も参照してください。

例 1 - PASSWORD節

** 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

プログラム FNDPWD の出力:

ENTER PASSWORD FOR EMPLOYEE FILE:

例 2 - CIPHER 節

** 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:

例 3 - WITH 節の基本検索条件

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 - マルチプルバリューフィールドの基本検索条件

基本検索条件に使用するディスクリプタがマルチプルバリューフィールドのとき、基本的に 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 以外の値を持つレコードを返します。

例 5 - WITH 節のさまざまな複合検索式の例

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'

例 6 - データベース配列のさまざまな使用例

次の例では、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 に添字を指定しないでください。

例 7 - 物理カップリングファイルの使用

** 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

例 8 - VIA 節の使用

** 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

プログラム FNDVIA の出力:

Page      1                                                  05-01-17  13:18:22
  
PERSONNEL         NAME              FIRST-NAME
   ID
--------- -------------------- --------------------
  
20011000  ADKINSON             BOB

例9 - SORTED BY 節

** 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

プログラム FNDSOR の出力:

        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

例 10 - RETAIN 節

** 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

例 10 の出力:

        NAME                 CITY            DATE   
                                              OF    
                                            BIRTH   
-------------------- -------------------- ----------
                                                    
RUBIN                NEW YORK             1945-10-27
WALLACE              NEW YORK             1945-08-04

例 11 - WHERE 節

** 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

プログラム FNDWHE の出力:

        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

例 12 - IF NO RECORDS FOUND 節

** 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

プログラム FNDIFN の出力:

        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 ***

例 13 - FIND ステートメントで使用可能な Natural システム変数

** 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

プログラム FNDVAR の出力

PERSONNEL         NAME            ISN         NMBR        CNT     
   ID                                                             
--------- -------------------- ----------- ----------- -----------
                                                                  
60000114  DE JUAN                      400          41           1
60000136  DE LA MADRID                 401          41           2
60000209  PINERO                       405          41           3

例 14 - 複数の FIND ステートメント

まず、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

プログラム FNDMUL の出力:

レポートに表示されるのは、姓が SMITH であるすべての人の NAMEFIRST-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

例 15 - SHARED HOLD 節

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

例16 - SKIP RECORDS 節

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