[
|../../index.htm#lansa/select_sql.htm]
現在地:
注: 利用オプション SELECT_SQL ステートメント ウィザード を参照
ネイティブIBM i データベース・アクセスを使用する標準のSELECTコマンドとは異なり、SELECT_SQLコマンドは、SQL/400製品を使用してデータベース・アクセスを実行します。
SELECT_SQLコマンドには2つの形式があります。1つは、このセクションで説明する十分に構造化された形式です。この形式では、SQLを正しく構成し、プラットフォームによって異なるオブジェクト名に対応することができますが、SELECTステートメントのタイプは非常に単純なものに制限されます。もう1つは、自由形式のSELECT_SQLです。この形式では、データベース・エンジンが有効な構文として受け入れる任意のSELECTステートメントを入力できますが、LANSAでは、複数のプラットフォームに渡るオブジェクト名の互換性維持について考慮されません。これらの2つの違いにより、SQLが複数のデータベースに渡って予想どおりに実行されない可能性が高くなります。詳細については、「7.110 自由形式のSELECT_SQL」を参照してください。
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の実装方法は、IBM i 上でRPGとして生成されたオブジェクトと、Cとして生成されたオブジェクトとでは異なります。RPGは、SELECT_SQLを静的な埋め込みSQLに実装します。一方、Cは、SELECT_SQLを呼び出しレベル・インターフェース(CLI)に実装するため、動的になります。この違いの効果については、以降、関連する箇所で説明していきます。
SELECT_SQLを使用する前に、以下の点を認識しておいてください。
1. SELECT_SQLコマンドを含むファンクションをコンパイルするには、ライセンス交付された以下の製品が必要です。
IBM i RPGファンクション: |
IBM - SQL DevKit |
C実行可能プログラム: |
他の製品は不要 |
SELECT_SQLを使用するIBM i RPGアプリケーションをコンパイル済みの形式で特定のIBM iから別のIBM i に移植する場合、移植先マシンにライセンス交付済みのIBM製品がインストールされていなくても、そのアプリケーションを実行できます。ただし、移植先マシンでアプリケーションの再コンパイルが必要になった場合、問題が発生します。
2. SELECT_SQLによってアクセスする情報は読み取り専用です。情報を更新する場合は、一般に、標準のSELECTコマンドを使用する方が簡単です。
3. SELECT_SQLコマンドは、主に、レポート、画面、または他のテーブルに出力するために、1つ以上のSQLデータベース・テーブル(ファイル)からの複雑な抽出/結合/要約抽出を実行するためのものです。大容量または頻繁に使用される対話型アプリケーションでの使用は想定されていません。このように使用目的に制限がある一方、SELECT_SQLは、結果の出力先が画面、プリンター、または別ファイル(テーブル)のどれであっても、多くの結合/抽出/要約アプリケーションを大幅に単純化し、高速化することのできる非常に強力で便利なコマンドです。
4. GOTO コマンドで SELECT_SQL ループを出ないようにしてください。これにより、SQL カーソルがオープン状態のままになる場合があります。SELECT_SQL ループから出る場合は、LEAVE RDML コマンドを利用してください。
5. SELECT_SQLコマンドは、SQLデータベース機能で直接サポートされる、非常に強力なデータベース抽出/結合/要約機能を提供します。ただし現時点では、状況によって、IBM i におけるSQLの実装に大量のリソースが必要になる場合があります。このコマンドでもたらされる大きな利点と必要リソースのバランスの比較検討およびその適切な使用は、すべてユーザーの責任において行ってください。考慮すべき要因の1つに、WHEREパラメータで非キー・フィールドを使用するかどうかがあります。使用する場合、通常、SELECT_SQLの方がSELECTより高速です。使用しない場合は、SELECTの方が高速です。このことは、IBM i でも実行予定のプログラムをまずVisual LANSAで開発する場合に特に重要になります。これは、Visual LANSAでは、SELECTおよびSELECT_SQL間のパフォーマンスの差がそれほど大きくないためです。
6. ここでは、ユーザーにSQLの'SELECT'コマンドに関する知識があることを前提としています。ここでは、RDMLファンクションからSQLの'SELECT'コマンドに直接アクセスする方法について説明しますが、SQLの'SELECT'コマンドの構文、形式、および使用については扱いません。
7. WHERE、GROUP_BY、HAVING、およびORDER_BYパラメータが正しく指定されているかどうかの検査は非常に限定的です。
8. SELECT_SQLはIOモジュール/OAMを使用しないため、リポジトリの検証およびトリガーは省略されます。
9. ファイルがIBM i 以外のプラッフォームに配布される場合、省略値ではターゲット・プラットフォームのデータ・ライブラリを使用してテーブルが作成されます。ただし、SELECT_SQLへの呼び出しはソース区画のデータ・ライブラリでコンパイルされています。ですから、名前が異なる場合は、組み込み関数DEFINE_OVERRIDE_FILEを使ってテーブル・オーナーを変更する必要があります。
エラー処理
SQL機能がSELECT_SQLにより正しく 使用されていない場合エラーになります。SQLサーバーでは、エラーは例えば次のように表示されます。"SQL error code 16954… Executing SQL directly; no cursor" 同じ理由でも別のエラーコードになることもあります。またデータベースによって異なるエラーコードになります。
これはLANSAにより機能が認識されていない場合に起こり、単語が識別子だと仮定されて表示されています。この回避策としては、SELECT_SQLの自由形式のバージョンのコマンドを使用することです。
IBM i RPGファンクション
コマンドが正しくない場合、以下の2つの時点で失敗する可能性があります。
C実行可能プログラム
コマンドが正しくない場合、以下の診断を行えます。
IBM i RPGファンクションのみ
SELECT_SQL FIELDS(#A$ #B) FROM_FILES((#MYFILE)) WHERE('A_ = ''A VALUE''') DISPLAY FIELDS(#A$ #B) ENDSELECT
このRDMLは、IBM i 以外のプラットフォームでは正常に動作しますが、IBM i では失敗します。A_が、FROM_FILESパラメータで指定されたいずれかのファイルの物理フィールドでない場合、Visual LANSAにより警告PRC1065が発行されます。すべてのLANSAプラットフォームで動作するよう可搬性のある方法で作成するには、以下のようにします。
SELECT_SQL FIELDS(#A$ #B) FROM_FILES((#MYFILE)) WHERE('A$ = ''A VALUE''') DISPLAY FIELDS(#A$ #B) ENDSELECT
Visual LANSA Cファンクションのみ
以下の理由から、SELECT_SQLコマンドを多用することはお勧めしません。
REQUEST FIELD(#ANYSQL)
Select_Sql Fields(#STD_NUM) Using(#ANYSQL)
endselect.
作成時にVisual LANSAから発行されるメッセージ
LII0898W |
あいまいです。フィールド#A$は複数のファイルに存在しており、異なる命名規則を使用しています。 |
実行時およびIBM iでの実行中の成功率を高めるには、以下の警告に対処してください。
PRC1064 |
|
PRC1065 |
|
PRC1067 |
|
移植性に関する考慮事項 |
複数のプラットフォームを使用する場合、各プラットフォームで使用されるフィールド長を考慮してください。WHERE パラメータを参照してください。 |
参照
7.109.1 SELECT_SQL のパラメータ
7.109.2 SELECT_SQL の列名と列値
7.109.3 SELECT_SQL の使用例
7.109.4 SELECT_SQL の参考文献
7.109.5 SELECT-SQL の強制変換
必須
SELECT_SQL -- FIELDS ----- フィールド名 - *SAME ---------->
| SQLフィールド・ソース |
----- 最大1000 -------------
>- FROM_FILES ----- フィールド名 相関 -->
| |
------------ 最大20 -----------
-----------------------------------------------------------------
任意指定
>- WHERE ------ 'SQL where条件' --------->
>- GROUP_BY --- 'SQL group by句' --------->
>- HAVING ----- 'SQL having条件' -------->
>- ORDER_BY --- 'SQL order byパラメータ' ------>
>- DISTINCT --- *NO --------------------------->
*YES
>- IO_STATUS -- フィールド名 -------------------->
*STATUS
>- IO_ERROR --- *ABORT ------------------------|
*NEXT
*RETURN
ラベル
[
|../../index.htm#lansa/select_sql.htm]