Page History
[ |../../index.htm#lansa/select_sql_free.htm]
現在地:
...
7.110 自由形式のSELECT_SQL
| Note |
|---|
...
注意:利用オプション |
SELECT_SQLコマンドには2つの形式があります。このセクションでは、特定のデータベース・エンジンで有効な任意のSQLを使用できる自由形式のSELECT_SQLコマンドについて説明します。コンパイル時にも実行時にもSQLの解析は実行されません。入力されたSQLコマンドは、そのままデータベース・エンジンに渡されます。RDMLプログラマの責任で、データベース・エンジンから返されるデータがFIELDSパラメータのフィールド・リストと一致するようにしてください。SELECT_SQLのもう1つの形式については、「7.109 SELECT_SQL」を参照してください。
この形式のSELECT_SQLコマンドは、RDMLXファンクションおよびコンポーネントでのみ使用できます。
SELECT_SQLコマンドは、ENDSELECTコマンドと対で使用し、1つ以上のテーブル(ファイル)の、1行以上の行(レコード)を処理するための「ループ」を作成します。
例として、以下のSELECT_SQL / ENDSELECT ループはテーブルORDLINの製品および数量の値がすべて選択され、リストに1つずつセットされます。
---
...
-> DEF_LIST NAME(#ALIST)
...
FIELDS(#PRODUCT #QUANTITY)
--> SELECT_SQL FIELDS(#PRODUCT #QUANTITY)
| USING('SELECT "PRODUCT",
...
"QUANTITY"
...
FROM "MYDTALIB"."ORDLIN"')
|
...
| ADD_ENTRY(#ALIST)
...
|
----
...
ENDSELECT自由形式のSELECT_SQLを使用する前に、以下の点を認識しておいてください。 SQLを使用する前に、以下の点を認識しておいてください。 1. SELECT
- SELECT_SQLによってアクセスする情報は読み取り専用です。USINGパラメータでINSERTまたはUPDATEステートメントを使用する場合は、各自の責任において行ってください。
...
- SELECT_SQLはIOモジュール/OAMを使用しないため、リポジトリの検証およびトリガーは省略されます。
...
- SELECT_SQLコマンドは、主に、レポート、画面、または他のテーブルに出力するために、1つ以上のSQLデータベース・テーブル(ファイル)からの複雑な抽出/結合/
...
- 要約抽出を実行するためのものです。大容量または頻繁に使用される対話型アプリケーションでの使用は想定されていません。
このように使用目的に制限がある一方、SELECT_SQLは、結果の出力先が画面、プリンター、または別ファイル(テーブル)のどれであっても、多くの結合/抽出/要約アプリケーションを大幅に単純化し、高速化することのできる非常に強力で便利なコマンドです。
...
- SELECT_SQLコマンドは、SQLデータベース機能で直接サポートされる、非常に強力なデータベース抽出/結合/要約機能を提供します。ただし、現時点では、IBM i におけるSQLの実装に、状況によって大量のリソースが必要になる場合があります。このコマンドでもたらされる大きな利点と必要リソースのバランスの比較検討およびその適切な使用は、すべてユーザーの責任において行ってください。考慮すべき要因の1つに、USINGパラメータで、非キー・フィールドを使用するかどうかがあります。使用する場合、通常、SELECT_SQLの方がSELECTより高速です。使用しない場合は、SELECTの方が高速です。このことは、IBM iでも実行予定のプログラムをまずVisual LANSAで開発する場合に特に重要になります。これは、Visual LANSAでは、SELECTおよびSELECT_
...
- SQL間のパフォーマンスの差がそれほど大きくないためです。
...
- GOTO コマンドで SELECT_SQL ループを出ないようにしてください。これにより、SQL カーソルがオープン状態のままになる場合があります。SELECT_SQL ループから出る場合は、LEAVE RDML コマンドを利用してください。
...
- このセクションでは、ユーザーにSQLの'SELECT'コマンドに関する知識があることを前提としています。ここでは、RDMLファンクションからSQLの'SELECT'コマンドに直接アクセスする方法について説明しますが、SQLの'SELECT'コマンドの構文、形式、および使用については扱いません。
コマンドが正しくない場合、以下の診断を行えます。
- SQLを使用する際は、SELECT_SQLコマンドにコンパイルする前に、対話型SQLを使用してコマンド(およびその構文)が「期待どおりに動作するかを検査」すると便利です。
- 実行時。自由形式のSELECT_SQLコマンドのコンパイルは、ほとんど不要であることがわかっています。ほとんどの解析はSQLデータベース・エンジンで実行されます。この場合、発行されたすべてのエラー・メッセージを調べ、正確な原因を突き止めてください。
- 実行時エラーに対処する際に、ファンクションに対してトレース機能を使用すると、SELECT_SQLコマンドから生成された正確なSQLをキャプチャすることができます。最新のトレース・ファイルを開き、SQLコマンドから生成された正確なSQLをキャプチャすることができます。
最新のトレース・ファイルを開き、"***ERROR"を検索してください。これは、エラー・メッセージ内のテキストと同じです。8行目または"Preparing"メッセージに戻ると、エラー原因になっているSELECTステートメントがわかります。これをコピーして対話型SQLに貼り付け、問題をさらに診断することができます。 - 構文エラーを除き、最も一般的な実行エラーの1つとして、フィールド・リストが、USINGパラメータ内のSQLステートメントによって返されたデータと一致しないことが挙げられます。
- サポートを受けるためにSELECT_SQLに関する問題を報告する場合は、トレース・ファイルと、生成されたCソース・コードを提出してください。
以下の理由から、SELECT_SQLコマンドを多用することはお勧めしません。SQLコマンドを多用することはお勧めしません。
- SQLアクセス・コマンドは、RDMLファンクションに直接埋め込まれます。DBMSアクセスは直接的であり、IOM/OAMアクセス・ルーチンを経由しません。この方法では、読み取り前後のトリガーや、LANSA/スーパーサーバーによって実装された「シン・クライアント」型設計を適切に使用できなくなる可能性があります。
- SELECT_SQL の内容が画面上のフィールドからのものである場合、エンド・ユーザーは SELECT 以外の処理を実行することができます。特に自由形式では以下のようなコーディングが可能なため、簡単です。
...
REQUEST FIELD(#ANYSQL)
...
Select_Sql Fields(#STD_NUM) Using(#ANYSQL)
endselect
そして、エンド・ユーザーは画面に endselect.
そして、エンド・ユーザーは画面に "delete from mylib.afile;select count from (*) from mylib.afile" と入力することができます。
- 埋め込まれたSQL機能を使用すると、アプリケーションがプラットフォームに依存するようになる可能性があります。すべてのSQL機能がすべてのDBMSでサポートされるわけではありません。テーブルに関連付けられたIOM/OAMを省略すると、IOM/OAMによって提供される機能分離が省略されます。DBMSで定義された、プラットフォームに依存する拡張機能であるSQL機能は、アプリケーション設計者の判断で、アプリケーション設計者の責任において使用してください。
- SELECT_SQLを使用する場合は、その使用を特定のファンクション内に限定し、ユーザー・インターフェース操作から分離してください。こうすることで、クライアント設計モデルでファンクションを"RPC" (リモート・プロシージャ・コール)として呼び出せるようになります。
移植性に関する考慮事項 | Visual LANSAから IBM i上のデータベースに接続するためにこのコマンドを使用しないでください。この目的でSELECT_SQLコマンドを使用しても、IBM i上のデータベースではなく、PC上へのデータベースにアクセスします。このタイプの接続を行うには、リモート・プロシージャ・コール (すなわち、call_server_function) を使用する必要があります。 |
...
次のトピックも参照してください。
| Panel |
|---|
...
| ||
必須 SELECT_SQL ----- FIELDS --------- フィールド名 - |
...
--------------------> |
...
>-- USING -------- SQL select コマンド ---- |
...
------------>
|
...
------------------------------------------------------------------------------ |
...
任意指定 >-- FROM_FILES --- ファイル名 -------------------------> |
...
| | |
...
---------- |
...
>-- IO_STATUS ---- フィールド名 -----------------------> |
...
*STATUS |
...
>-- IO_ERROR ---- |
...
*ABORT -------------------------------| |
...
*NEXT |