7.105.1 SELECT のパラメータ

END_FILE

FIELDS

FROM_FILE

GENERIC

IO_ERROR

IO_STATUS

ISSUE_MSG

LOCK

NBR_KEYS

OPTIONS

RETURN_RRN

VAL_ERROR

WHERE

WITH_KEY

FIELDS

ファイル内のレコードから選択するフィールド、または選択するフィールドを指定するグループの名前を指定します。または、このパラメータに拡張可能なグループ式を入力することもできます。

以下の特別な値を指定できます。

注:OTHERによって保守されている論理ファイルからすべてのフィールドを選択すると、基になっている物理ファイルのすべてのフィールドがフィールド・リストに含められます。

パラメータFIELDSでは、特別な値*ALL、*ALL_REAL、または*ALL_VIRTを必要な場合にのみ慎重に使用することを強くお勧めします。必要のないフィールドを選択すると、クロスリファレンスの詳細(ファンクション内で使用されていないフィールドを示す)が無効になり、ファンクションのCRUDE項目の複雑度が無意味に高くなります。

BLOBまたはCLOBデータを取得すると、*SQLNULLまたはファイル名になることに注意してください。ファイル名の場合、データベース・ファイルのデータがそのファイルにコピーされています。

警告:ファイルからBLOBまたはCLOBフィールドを取得する操作には時間がかかります。

BLOBおよびCLOBフィールドを使用する場合に推奨されるデータベース設計

BLOBとCLOBフィールドを使用する場合に、それらのフィールドを他のフィールドとは別のファイルに配置してメイン・ファイルと同じキーを使用する設計をお勧めします。これによりプログラマは、BLOBやCLOBデータのアクセスに別々のI/O操作を行わなければならなくなり、このデータの無差別な使用によるデータベース・パフォーマンス上の影響を軽減することができます。またこれは最も移植性の高い設計で、BLOB以外またはCLOB以外のデータに常に迅速にアクセスできるようになります。

FROM_FILE

「I/Oコマンドでのファイル名の指定」を参照してください。

WHERE

「条件および式の指定」および「I/OコマンドでのWHEREパラメータの指定」を参照してください。

SELECT/ENDSELECTループでWHERE条件を使用した後のフィールドの内容は予測できません。WHERE条件に一致するレコードのみがSELECT/ENDSELECTループで処理されます。

WITH_KEY

「I/Oコマンドでのファイル・キー・リストの指定」を参照してください。

NBR_KEYS

このパラメータをWITH_KEYパラメータと組み合わせて使用すると、レコードを取得するために実際に使用されるキー・フィールドの数を実行時に変更することができます。

デフォルト値*WITHKEYを指定すると、キー・フィールドの数が、WITH_KEYパラメータに指定された数と常に同じになり、実行時にこの値は変更されません。

このパラメータに*COMPUTEを指定することもできます。この場合、キーの数は、WITH_KEYパラメータで指定されたフィールドの内容を実行時に検査することによって決定されます。

キーの数を決定するためのロジックは以下のように動作します。

<n>を、WITH_KEYパラメータで指定されたフィールド数に設定
Dowhile nが0より大きく、keyfield(n)が*NULLまたは*SQLNULL
nから1を引く
Endwhile
<キーの数>を<n>に設定
 

各フィールド・タイプにおける*NULL値の定義については、「7.12.1 CHANGE のパラメータ 」を参照してください。

直接的なRDMLロジックによってキー・フィールドの数を変化させる場合は、このパラメータに数値フィールドの名前を指定します。指定するフィールドには、実行時にキー数の値が保持されていなければなりません。指定するフィールドは、数値タイプで、このファンクションまたはデータ・ディクショナリで定義されていなければなりません。

実行時にNBR_KEYSフィールドに保持されている値が、0未満であったり、WITH_KEYパラメータで指定されたキー・フィールドの数を超えていてはなりません。

SELECTコマンドの実行時にNBR_KEYSフィールドが0に設定されていると、事実上、選択においてWITH_KEYパラメータ全体が無視されます。

詳細については、使用例を参照してください。

GENERIC

総称検索を要求するかどうかを指定します。総称検索では、検索キーとファイル・キーとの比較時にキー値のブランク以外または0以外の部分のみが使用されるため、全キー検索または部分キー検索とは異なります。

GENERIC は、Date、Time、DatetimeおよびFloatでは無視されます。

英数字フィールドに対して総称検索を使用すると、検索フィールドの一番左にあるブランク以外の部分のみがファイル・キーと比較されます(すなわち、比較において末尾ブランクは無視されます)。

数値フィールドに対して総称検索を使用すると、検索フィールドの一番左にある0以外の部分のみがファイル・キーと比較されます(すなわち、比較において末尾ゼロは無視されます)。また、数値フィールドの総称比較は、検索キーとファイル・キーの実際の値に関わらず、どちらの数値も正であるものとして実行されます。

これらの総称検索の規則により、ブランクの英数字検索キーまたは0の数値キーは、選択されたすべてのレコードに一致することに注意してください。

例えば、ファイルに名前フィールドのキーが指定され、以下の値が保持されているとします。

SM

SMIT

SMITH

SMITHS

SMITHY

SMYTHE

 

ここで、以下のSELECTステートメントを使用します。

SELECT  WITH_KEY('SM')
 

この場合、ファイル内では、完全なキー値'SM'に一致するレコードは最初のレコードのみであるため、そのレコードのみが選択されます。SELECTステートメントを以下のように変更します。

SELECT  WITH_KEY('SM') GENERIC(*YES)
 

この場合、指定されたキー値の非ブランク部分のみがファイル・キーと比較されるため、ファイル内のすべてのレコードが選択されます。

デフォルト値*NOを指定すると、総称検索は要求されません。

*YESを指定すると、総称検索が実行されます。総称検索は、実際には、実行時に指定された最後のキーに対してのみ実行されます。WITH_KEYパラメータで指定された他の(それより前にある)キーは、ファイル内の値と正確に一致しなければなりません。ファイル内のデータとの総称的な比較は行われません。

例えば、州、郵便番号、および名前のキーが指定された名前/住所ファイルについて考えます。以下のコマンドを使用します。

SELECT  WITH_KEY('NSW' 2000 'SM') NBR_KEYS(3) GENERIC(*YES)
 

この場合、名前がSMで始まる、州がNSW、郵便番号が2000のすべての名前が選択されます。これは、英数字フィールドに対する総称検索の一例です。検索キーと、ファイルから読み取られたデータとの比較時には、末尾ブランクは無視されます。また、ファイルのデータと実際に総称的に比較されるのは、最後のキー('SM')のみであることに注意してください。他のキーである'NSW'および2000は、ファイルから読み取られたデータと正確に一致していなければなりません。実行時に、以下のように2つのキーを使用するようコマンドを動的に変更したとします。

SELECT  WITH_KEY('NSW' 2000 'SM') NBR_KEYS(2) GENERIC(*YES)
 

この場合、郵便番号が2で始まる(すなわち、2000~2999)、州がNSWのすべての名前が選択されます。これは、末尾ゼロが無視される、数値フィールドに対する総称検索の一例です。

移植性に関する考慮事項

ネイティブI/Oを使用する場合、総称的に検索キーに一致しないキーが検出されると、暗黙的に*ENDWHEREが使用されます。アプリケーションが要求どおりに機能することを検査によって確認する必要があります。

IO_STATUS

I/O操作の結果の「戻りコード」を受け取るフィールドの名前を指定します。

デフォルト値*STATUSを指定すると、戻りコードは、#IO$STSという特別なフィールドに保管されます。このフィールドは、他のフィールドと同様にRDMLプログラムで参照できます。

戻りコードを受け取るフィールドとしてユーザー・フィールドを指定する場合、このフィールドは、長さ2文字の英数字フィールドである必要があります。ユーザー・フィールドを指定した場合も、特別なフィールド#IO$STSは更新されます。

値については、「RDML I/O戻りコード」を参照してください。

IO_ERROR

コマンドの実行時にI/Oエラーが発生した場合に実行するアクションを指定します。

I/Oエラーは、「致命的」エラーと見なされます。ファイルが見つからなかった、ファイルが壊れている、ファイルを割り当てることができない、などがこれに該当します。これらのタイプのエラーが発生すると、ファンクションにおいて、そのファイルが関与しているすべての処理が停止します。

デフォルト値*ABORTを指定すると、ファンクションが異常終了し、I/Oエラーの性質を示すエラー・メッセージが発行されます。

*NEXTを指定すると、制御が次のコマンドに渡されます。*NEXTは、デフォルトのABORTを使用するのではなく、エラー・メッセージをRDMLで処理し、次にABORTで処理できるようにすることを目的としています(LANSA/ADおよびVisual LANSAの処理を続行することもできますが、この方法でLANSAを使用することはお勧めしません)。
データベース操作から返されるERは致命的エラーです。この場合、LANSAは、処理が続行されないものと想定します。IOモジュールがリセットされ、以降のIOは、そのファイルでこれまでにIOが行われなかったかのように実行されます。そのため、ファイルの状態について推定を行わないでください。例えば、最後に読み取られたレコードは設定されません。IO_ERRORの特別なケースとして、TRIG_RETCでERを返すようトリガー・ファンクションがコード化されている場合があります。上記の説明は、このケースにも当てはまります。
したがって、LANSAでは、さらにIOを実行する前にABORTまたはEXIT以外の何らかの処理を実行する目的で、トリガー・ファンクションから返された戻りコードERを使用しないことをお勧めします。

*RETURNを指定すると、プログラム・メインラインでは制御が呼び出し元に戻され、サブルーチンでは制御が呼び出し元ルーチンまたはプログラム・メインラインに戻されます。

上記の値をどれも使用しない場合は、制御を渡す先の有効なコマンド・ラベルを指定してください。

VAL_ERROR

このコマンドで妥当性検査エラーが検出された場合に実行するアクションを指定します。

妥当性検査エラーは、ファイルに対して追加、更新、または削除を行う情報が、そのファイル内のフィールドに関連付けられたFILEまたはDICTIONARYレベルの妥当性検査に合格しなかった場合に発生します。

デフォルト値*LASTDISを指定すると、直前の表示画面に制御が戻されます。この画面では、関連付けられた妥当性検査に失敗したフィールドが反転表示され、エラーのある最初のフィールドにカーソルが配置されます。

*NEXTを指定すると、制御が次のコマンドに渡されます。

*RETURNを指定すると、プログラム・メインラインでは制御が呼び出し元に戻され、サブルーチンでは制御が呼び出し元ルーチンまたはプログラム・メインラインに戻されます。

上記の値をどれも使用しない場合は、制御を渡す先の有効なコマンド・ラベルを指定してください。

*LASTDISは、「直前の表示画面」がない場合(バッチ・ファンクション内など)でも有効です。この場合、ファンクションが異常終了し、該当するエラー・メッセージが発行されます。

*LASTDISを使用する場合、「直前の表示画面」は、データベース・コマンド(INSERT、UPDATE、DELETE、FETCH、およびSELECT)と同じレベルでなければなりません。データベース・コマンドがSUBROUTINE内で指定され、「直前の表示画面」が呼び出し元ルーチンまたはメインラインの場合など、レベルが異なるとこのファンクションは異常終了し、該当するエラー・メッセージが発行されます。

これは、Visual LANSAでイベント・ルーチンとメソッド・ルーチンを使用する場合には当てはまりません。これらの場合、制御は呼び出しルーチンに戻されます。フィールドには、エラーがあることと、フォームの親階層で見つかった最初のステータス・パーに返されたメッセージが表示されます。または、メッセージがない場合は、実行スタック内で見つかったステータス・バーを持つ最初のフォーム(PRIM_OBJTから継承した再利用可能パーツなど)が表示されます。

END_FILE

「ファイルの末尾」に到達した場合の処理を指定します。「ファイルの末尾」とは、選択条件に一致する最後のレコードの処理が完了したことを表し、必ずしもファイル内の最後のレコードが処理されたことを意味するわけではありません。

*NEXTを指定すると、制御が次のコマンドに渡されます。

*RETURNを指定すると、プログラム・メインラインでは制御が呼び出し元に戻され、サブルーチンでは制御が呼び出し元ルーチンまたはプログラム・メインラインに戻されます。

上記の値をどれも使用しない場合は、制御を渡す先の有効なコマンド・ラベルを指定してください。

SELECTループを終了するタイミングを決定するために追加のレコードが読み取られるため、SELECTループ終了時の値が予期した値と異なる場合があります。

ISSUE_MSG

「ファイルの終わり」メッセージを自動的に発行するかどうかを指定します。

デフォルト値*NOを指定すると、メッセージは発行されません。

*NO以外に指定できる値は*YESのみです。この値を指定すると、メッセージが自動的に発行されます。メッセージは、ユーザーに表示される次の画面形式の22/24行目、またはバッチ・ジョブのジョブ・ログに表示されます。

LOCK

レコードを読み取る際に、そのレコードをロックするかどうかを指定します。

デフォルト値*NOを指定した場合、レコードはロックされません。

*YESを指定した場合は、レコードがロックされます。ロックしたレコードは、後でユーザーの責任により解放してください。

注:LOCK(*YES)は、レコード・レベルのロックを実行します。これにより、オペレーティング・システム内およびオペレーティング・システム間の動作(コミット制御による複数レコードのロック、デフォルトの待機時間など)が変化する場合があります。そのため、LOCK_OBJECT組み込み関数を使用して、適切かつ完全な「ユーザー・オブジェクト」のロック・プロトコルを開発することをお勧めします。

移植性に関する考慮事項

可搬性のあるアプリケーションではサポートされないため、使用しないでください。Visual LANSAで使用すると、ビルド警告が生成されます。

RETURN_RRN

選択されたレコードの相対レコード番号を返す先のフィールドの名前を指定します。

このパラメータで指定するフィールドは、数値タイプで、このファンクションまたはLANSAデータ・ディクショナリで定義されていなければなりません。

注:OPTIONS(*BLOCKnnn)を使用した場合にこのパラメータで返される値は、読み取られたばかりのレコード・ブロック内で最後のレコードの相対レコード番号を表し、必ずしもSELECT/ENDSELECTループで処理されているレコードの番号ではないため、役に立たない場合がほとんどです。

詳細については、『Visual LANSA開発者ガイド』「外部ファイルの読み込み」を参照してください。

OPTIONS

ファイルのレコードを処理する際に使用できる特別なオプションを1~4個指定します。指定できる特別なオプションは以下のとおりです。

*BACKWARDS:レコードは、通常とは逆の順序で処理されます。通常、レコードは、FROM_FILEパラメータで指定されたキーの順序で読み取られます。

*BACKWARDSオプションを指定した場合、レコードは逆の順序で読み取られます。順次キー、全体キー、または部分キーによる逆方向処理がサポートされます(RPGなど、他の高水準言語でサポートされていない場合も同様です)。総称キーによる逆方向処理もサポートされます(ただし、効果的な実装が困難な場合があります)。

*STARTKEY:WITH_KEYパラメータで指定されたキーは、最初の読み取り操作の開始位置を決定する目的にのみ使用されます。

読み取られる最初のレコードは、WITH_KEYパラメータで指定されたキー値以上のキーを持つ最初のレコードです。以降のすべてのレコードは、WITH_KEY値とは関係なく処理されます。このような状況では、通常、SELECTループをプログラム・ロジックまたは特別なオプション*ENDWHEREによって終了する必要があります。

*ENDWHERE:WHEREパラメータで指定された条件がfalseである(すなわち、trueでない)ことが判明した場合、SELECTループは終了します。その後、END_FILEパラメータで指定されたプログラム内の位置に制御が渡されます。

通常、SELECTループが終了するのは、SELECTループによって、選択条件に一致するすべてのレコードが読み取られ、選択の可能性が検査され、処理された場合のみです。*ENDWHEREオプションを指定した場合、WHERE条件がfalseになるレコードが初めて読み取られた時点でSELECTループが終了します。

移植性に関する考慮事項

可搬性のあるアプリケーションでSELECTオプション*STARTKEYおよび*ENDWHEREを使用することはお勧めしません。これらのオプションを使用すると、SQL要求を使用したときに、パフォーマンスに悪影響を及ぼす可能性があります。
*STARTKEYオプションは、「ファイル・カーソル」の配置をエミュレートします。
SQLを使用する場合、*ENDWHEREオプションは、SELECTループ内の条件を検査します。WHERE句内には配置しません。

 

*ENDWHERESQL:WHERE条件に従って、最適な方法でSELECTコマンドを処理することができます。

SQL (ODBCを使用)によるテーブル操作は、IBM iのネイティブI/Oと同じではありません。さまざまなテーブル(SQLおよびネイティブI/O)でのSELECTコマンドのパフォーマンスを高めるために、この値は*ENDWHEREより優先されます。

新しい値を適用するには、[区画の定義]タブで[*ENDWHERESQLを強制的に行う]オプションを選択します。この区画オプションは、SELECTコマンド内のすべての*ENDWHEREオプションを、*ENDWHERESQLがコーディングされているかのように解釈するようLANSAに指示します。コードを更新または新しいコードを作成する際は、適切な箇所でこの新しいオプションを使用するようSELECTコマンドを変更することをお勧めします。

移植性に関する考慮事項

この値を指定すると、実行時のSELECT操作の解釈が異なってきます。

- SQLを使用するようコードが生成されている場合、この*ENDWHERESQLオプションは事実上無視され、WHERE条件がSQL要求のWHERE句内に配置されます(実列がすべて指定されている場合)。

- ネイティブI/Oアクセスを使用するようコードが生成されている場合、*ENDWHERESQLオプションは、*ENDWHEREオプションと同ものとして解釈されます。

 

* BLOCKnnn:実行する実データベースI/O操作の数を減らすために、ファイルから選択されたレコードがブロックで読み取られます。

      このオプションを適切に使用すれば、SELECT/ENDSELECTループのパフォーマンスを大幅に向上させることができます。

      ただし、使用する際は、以下のLANSAおよびIBM i の条件が適用されます。

移植性に関する考慮事項

可搬性のあるアプリケーションではサポートされないため、使用しないでください。Visual LANSAで使用すると、全構文検査で致命的エラーが発行されます。*BLOCKnnnオプションは無視されるため、アプリケーションには何の効果もありません。