7.83.2 SELECTについてのコメント/警告
SQLでは、すべ てのテーブル操作がSystem iでのファイル操作と同じ方法で処理されるわけではありません。認識しておかなければならない重要な点を以下に挙げます。
· SQL
ベースのSELECT操作では、最初の実行時
に一致するすべての行を選択し(一時ファイルに保管)、その後、選択した一連の行を(1行ずつ)処理することができます。
この処理形式が原因で、行を「選択可能」な行に含めるためにSELECTループで実際にその行を挿入または更新する際に、System
iアプリケーションとVisual LANSAアプリケーションとで機能が変化する場
合があります。
i5/OS環境では、このような行はSELECTループで処理されます。一方、Visual
LANSA環境では、これらの行は最初に選択された行に含まれていないため、SELECTループで処理されない可能性があります。
この処理形式は無限ループに陥る可能性があるため、i5/OS環境で使用されること
は稀で
すが、この処理の違いを理解し、この形式の処理を行わないようにしてください。
· 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環境とi5/OS環境(RDMLおよびRDMLX)で実行される処理はまったく同じです。
· 検
索文字列に'%'文字が含まれる場合、総称検索の動作がIBM iとは異なることがあります。
該当するSQLリファレンス・マニュアルのSQL LIKEに関する説明を参照してください。
· SELECT のオプション*STARTKEYを使用すると、SQL要求によって「ファイル・カーソル」の配置をエミュレートするときにパフォーマンスに悪影響を及ぼす 可能性があるため、このオプションの使用はお勧めしません。