7.107 SELECT
注意:利用オプション
SELECTコマンドは、ENDSELECTコマンドと対で使用して、ファイル内で特定の条件に一致した1つ以上のレコードを処理するための「ループ」を作成するために使用します。
SELECT/ENDSELECTループの例を以下に示します。
--->SELECT FIELDS(#ORDLIN #PRODUCT #QUANTITY)
| FROM_FILE(ORDLIN) WITH_KEY(#ORDER)
|
| DISPLAY FIELDS(#ORDER #ORDLIN #PRODUCT #QUANTITY)
|
----ENDSELECT
これにより、ファイルORDLINから、受注番号がフィールド#ORDERの値に一致しているすべてのレコードを読み取るループが作成されます。
レコードが読み取られるたびに、SELECT/ENDSELECTループ内に定義されたDISPLAYコマンドによって、そのレコードの明細が表示されます。
SELECTコマンドは、LANSA RDMLで最も柔軟なコマンドでしょう。このコマンドを最大限に活用するには、ある程度の経験が必要です。このコマンドでサポートされるデータベース処理のタイプの例を以下に示します。
- 項目の順次処理
- 全体キー処理
- 部分キー処理
- 総称キー処理
- 実行時における使用キー数の変更
- レコードの条件付き選択
- 選択されたレコードの正方向または逆方向処理
- キー(またはキーの近く)で開始して逆方向または正方向に処理
また、SELECTコマンドを、IBM i オペレーティング・システム・コマンドOPNQRYF (オープン・クエリー・ファイル)と組み合わせて使用することもできます。この場合、SELECTコマンドの機能が拡張され、以下の操作が可能になります。
- 実行時におけるレコード選択条件の変更
- 実行時におけるレコード処理順序の変更
- フィールド内容の検索
- 選択比較時のフィールドのサブストリング操作
- フィールドの大文字/小文字を区別しない検索
IBM i オペレーティング・システム・コマンドOPNQRYFの使用方法の詳細については、まずこのガイドに記載されているOPENコマンドのセクションを参照してください。
回避すべきSELECTループ・ロジック
以下のように、SELECTループでフィールドA、B、およびCが選択される場合について考えます。
SELECT FIELDS(#A #B #C)
FROM_FILE(...)
WHERE(...............)
.......
.......
ENDSELECT
このループ内では、これらのフィールド値は予測可能で、すべてのプラットフォームに渡って一定です。
ただし、ループ外では、フィールド値は予測不可能で一定になりません。そこで、以下のように指定します。
SELECT FIELDS(#A #B #C) FROM_FILE(...)
.......
IF COND(#A < 35.5)
.......
ENDIF
.......
ENDSELECT
上記の例は、予測可能なロジックです。一方、以下のように指定したとします。
SELECT FIELDS(#A #B #C)
FROM_FILE(...)
WHERE(...............)
.......
.......
ENDSELECT
IF COND(#A < 35.5)
.......
ENDIF
このロジックは、その形式やバリエーションに関係なく予測不可能です。
A (BおよびC)の値は、選択テーブルから読み取られたデータであるという観点から、実際にはSELECTループの終了後に「未定義」として定義されます。すなわち、SELECT/ENDSELECTループ終了時におけるこれらのフィールド値は予測不可能で、プラットフォームに渡って一定ではありません。
次のトピックも参照してください。
必須
SELECT ---------- FIELDS ---------- フィールド名 フィールド属性 ----->
| | | |
| ----- 最大7 ----- |
|*ALL |
|*ALL_REAL |
|*ALL_VIRT |
|*INCLUDING |
|*EXCLUDING |
|拡張可能なグループ |
| |
|------ RDMLXの場合は最大1000 ----|
------ RDMLの場合は最大100 ------
>-- FROM_FILE -------- ファイル名 . *FIRST ------------------>
ライブラリ名
-----------------------------------------------------------------------------------
任意指定
>-- WHERE ----------- '条件' ----------------------------------->
>-- WITH_KEY --------- キー・フィールド値 ----------------->
拡張可能なグループ式
>-- NBR_KEYS -------- *WITHKEY ----------------------------->
*COMPUTE
数値フィールド名
>-- GENERIC ---------- *NO ------------------------------------>
*YES
>-- IO_STATUS -------- *STATUS ------------------------------->
フィールド名
>-- IO_ERROR --------- *ABORT ------------------------------->
*NEXT
*RETURN
ラベル
>-- VAL_ERROR ------- *LASTDIS ------------------------------>
*NEXT
*RETURN
ラベル
>-- END_FILE --------- *NEXT --------------------------------->
*RETURN
ラベル
>-- ISSUE_MSG ------ *NO ------------------------------------>
*YES
>-- LOCK ------------ *NO ------------------------------------>
*YES
>-- RETURN_RRN --- *NONE --------------------------------->
フィールド名
>-- OPTIONS ------- 最大5個のオプションを指定可能 --------|
*BACKWARDS
*STARTKEY
*ENDWHERE
*ENDWHERESQL
*BLOCKnnn