7.107.2 SELECT についてのコメント/警告
SQLでは、すべてのテーブル操作がIBM iでのファイル操作と同じ方法で処理されるわけではありません。認識しておかなければならない重要な点を以下に挙げます。
- SQL ベースのSELECT操作では、最初の実行時に一致するすべての行を選択し(一時ファイルに保管)、その後、選択した一連の行を(1行ずつ)処理することができます。
この処理形式が原因で、行を「選択可能」な行に含めるためにSELECTループで実際にその行を挿入または更新する際に、IBM iアプリケーションとVisual LANSAアプリケーションとで機能が変化する場合があります。
IBM i 環境では、このような行はSELECTループで処理されます。一方、Visual LANSA環境では、これらの行は最初に選択された行に含まれていないため、SELECTループで処理されない可能性があります。
この処理形式は無限ループに陥る可能性があるため、IBM i 環境で使用されることは稀ですが、この処理の違いを理解し、この形式の処理を行わないようにしてください。
- SELECT ループをGOTOコマンドによって中断しないでください。このような操作を行うと、SQLカーソルが開いたままになる可能性があります。SELECTループを終了する場合は、代わりにLEAVE RDMLコマンドを使用してください。
- いかなる状況でも、SELECTループの途中に分岐しないでください。このように不自然なコーディング技法を使用すると、プラットフォームに関係なく予期しない結果になります。
- 上記の重要点と同様の理由で、SELECTループ内の選択条件の値を変更すると、プラットフォームによって異なる結果になる可能性があります。
以下のSELECTループについて考えます。ここで、SALARYはSQLテーブルの列、REQSALARYは何らかの選択値です。
SELECT FIELDS(...) FROM_FILE(...) WHERE('#SALARY <
#REQSALARY')
.......
.......
.......
CHANGE #REQSALARY ('#REQSALARY * 1.1')
ENDSELECT
- 上記のロジックは、適切に作成されているとは言えません。また、プラットフォームによって結果が異なる可能性があります。
- Visual LANSAは、SELECTが最初に実行された時点の値に従って評価と選択を行います。すでに確立されている選択条件の値を変更しないでください。変更すると、予期しない結果になる可能性があります。
- SQL ベースのSELECT操作に、指定ファイル内の「実」フィールドのみが関与するWHERE条件が含まれている場合、そのファイルから一致する一連の行のみが選択されます。すなわち、読み取り後のトリガーは、WHERE条件に一致しない行に対して呼び出されません。
これは、WHERE条件の検査前にすべての行が読み取られるIBM iのRDMLと機能的に異なる場合があります。
WHERE条件に、ファイル内の「実」フィールド以外のフィールドが関与する場合は、Visual LANSA環境とIBM i 環境(RDMLおよびRDMLX)で実行される処理はまったく同じです。
- 検索文字列に'%'文字が含まれる場合、総称検索の動作がIBM iとは異なることがあります。
該当するSQLリファレンス・マニュアルのSQL LIKEに関する説明を参照してください。
- SELECT のオプション*STARTKEYを使用すると、SQL要求によって「ファイル・カーソル」の配置をエミュレートするときにパフォーマンスに悪影響を及ぼす可能性があるため、このオプションの使用はお勧めしません。