7.108.1 自由形式のSELECT_SQLのパラメータ

FIELDS

FROM_FILES

IO_ERROR

IO_STATUS

USING

FIELDS

USINGパラメータで指定したSQLコマンドの結果を受け取るフィールドを指定します。このパラメータに指定できるのは、フィールド、グループ、および拡張可能なグループのみです。

このパラメータで指定するすべての列は、現在のファンクションまたはLANSAデータ・ディクショナリで有効なRDML変数として定義されていなければなりません。

SELECT_SQLコマンドでは、タイプBLOBおよびCLOBのフィールドはサポートされません。これらのフィールドを指定すると、コマンドのコンパイル時に致命的エラーが発生します。

USING

SQL_SELECTのUSINGパラメータには、有効な任意の「拡張可能な式」を指定できます。文字列を区切る際は一重引用符を使用することをお勧めします。これにより、二重引用符を、SQL識別子を囲むために使用できるようになります。すなわち、文字列リテラルを囲む一重引用符を倍にする必要があります。最初および2番目の例は、SQLリテラルを終了するための最後の一重引用符が異なる方法(''''と"'")で指定されていることを除き、同じ結果になります。4番目の例では、値と引用符を1つの作業フィールド内で指定しています。これが最もわかりやすく保守しやすい方法でしょう。

. . . USING('SELECT "EMPNO" FROM "XDEMOLIB"."PSLMST" WHERE "EMPNO" < ''' + #EMPNO + '''')

. . . USING('SELECT "EMPNO" FROM "XDEMOLIB"."PSLMST" WHERE "EMPNO" < ''' + #EMPNO + "'")

. . . USING('SELECT "EMPNO" FROM "XDEMOLIB"."PSLMST" WHERE NOT "EMPNO" LIKE ''%a''')

. . . #STD_TEXT := "'%a'"

. . . USING('SELECT "EMPNO" FROM "XDEMOLIB"."PSLMST" WHERE NOT "EMPNO" LIKE ' + #STD_TEXT)

 

SQL言語では、SQL構文として解釈される可能性のある識別子を囲むために二重引用符 (一部のデータベースでは、引用符文字が異なる場合がある) が使用されます。識別子を引用符で囲むことで、データベース上で識別子とSQL構文の競合を防ぐことができます。

WHEREパラメータとは異なり、USINGパラメータでは、埋め込みフィールド (KARTICなど) はサポートされません。

移植性に関する考慮事項

Visual LANSAでは、Visual LANSA外部ファイルを使用して複数のデータベースにアクセスすることができます。Visual LANSA外部ファイルは、SELECT_SQLで使用できますが、すべて同じデータベースのものでなければなりません。Visual LANSA外部ファイルがLANSAファイルと同じデータベースにある場合、同じSELECT_SQLコマンドで2つのファイルを使用できます。

 

例えば、名前に @、#、または $ が含まれている場合、SQLテーブル名がLANSAファイル名と異なることがあります。この名前は、オペレーティング・システムによっても異なる可能性があります。SQLコマンドを複数のプラットフォームで実行する場合は、テーブル名を同じにするか、テーブル名をUSINGパラメータで変数として指定してください。

 

USING句のヒント

通常、テーブルが属しているコレクションを指定する必要がありますが、WHEREパラメータでは不要です。これは、LANSAによってSQLが解析され、使用すべき適切なコレクションが判断されるためです。

すべての識別子は、データベースの要件に従って正確に記述する必要があります。例えば、外部ファイルのLANSA名は、同じテーブル名がすでに存在していたり、テーブル名が10文字を超えていたりすると、実際のテーブル名と異なる場合があります。指定しなければならないのはテーブル名です。以下の例では、"Long Field Name 1" および "Long Field Name 2" という列が含まれる、"Long Table Name With Spaces" というテーブルを使用しています。LANSAはこのテーブルを "LONG_TABLE" としてロードし、フィールドに "LONG_FIEL" および "LONG_FIE1" という名前を付けています。

SELECT_SQL FIELDS(#LONG_FIEL #LONG_FIE1) FROM_FILES((LONG_TABLE)) IO_ERROR(*NEXT) USING('select "Long Field Name 1", "Long Field Name 2" FROM LX_DTA."Long Table Name With Spaces"')

like条件を使用してデータを検索する場合、SQLにとって特別な意味を持つ文字をそのまま使用する必要があるときは、その文字をエスケープする必要があります。例えば、文字'_'は任意の文字に一致します。'_'という文字に一致させるには、以下の構文を使用する必要があります。これにより、'B_'で始まるすべての状態が検索されます。

CHANGE FIELDS(#TABLE) TO('SELECT "CUSTNUM" FROM "XDEMOLIB"."CUSTOMERS" ')

CHANGE FIELDS(#SELECTION) TO('WHERE STATE LIKE ''B!_%'' ESCAPE ''!''')

SELECT_SQL FIELDS(#CUSTNUM") USING(#TABLE + #SELECTION)

         DISPLAY FIELDS(#CUSTNUM)

ENDSELECT
 

注:この例では、エスケープ文字として感嘆符記号を指定していますが、ASCIIテーブルの127以下の任意の「標準」文字を使用できます(文字%、_、[は、すべてのDBMSシステムで使用できるわけではないため、これらの記号の使用はお勧めしません)。

これは、ASA、DB2400、SQL Server、およびOracleで検査済みです。MS Accessのみが例外で、代わりにエスケープする文字を[]で囲む必要があります。例えば、WHERE "STATE" LIKE 'B[_]%' と指定します。

条件の指定の詳細については、「条件および式の指定を参照してください。この句の構造に関する詳細については、SQLのガイドを参照してください。

Unicodeフィールドを含むRDMLX IBM i外部ファイル

IBM i 上の SQL は、グラフィックUnicodeフィールドと文字列リテラルまたはCharタイプの列を直接比較することができず、変換エラーが発生します。

変換エラーを回避しながら式をUnicodeに変換するには、以下の3通りの方法を使用します。

1.  リテラルをUnicode (UX'ssss') リテラルとして渡します。例えば、以下の指定があるとします。

     'WHERE "UNIFLD" LIKE ''C%'''

     これを以下のように指定します。

     'WHERE "UNIFLD" LIKE UX''00430025''').

2.  SQLファンクションを使用してリテラルまたは列を変換します。これにより、Unicode式になります。例えば、CHARFLD がCharタイプの列の場合、以下の指定があるとします。

     'WHERE "UNIFLD" = "CHARFLD"')

     これを以下のように指定します。

     'WHERE "UNIFLD" = CAST "CHARFLD" AS GRAPHIC(6) CCSID 13488)')

詳細については、IBMマニュアル『DB2 UDB for iSeries SQL Reference』を参照してください。

FROM_FILES

I/Oコマンドでのファイル名の指定」を参照してください。

これは、LANSAで解析される形式のSELECT_SQLコマンドにおける同名のパラメータとは異なり、任意指定のパラメータです。これは、ここで使用されるファイル名が、実行時にアクセスされるファイルに影響しないためです。このパラメータには2つの目的があり、その1つは、他のデータベース内の外部ファイルへのアクセス時に使用することです。ファイル名を指定することで、LANSAは、外部ファイルをLANSAにロードするために使用されたデータベース接続情報を見つけることができます。これは、DEFINE_DB_SERVERおよびCONNECT_FILE BIFを使用することによって、さらに洗練することができます。

2つ目の目的は、クロスリファレンス情報を生成し、USINGパラメータのファイルの使用を追跡できるようにすることです。この情報は、後で影響分析に使用できますが、明らかに手作業によるクロスリファレンスであるため、プログラマが最新の状態に保つ必要があります。これについて、プログラム文書化規則にすることをお勧めします。

. . . FROM_FILES(ORDLIN) 
. . . USING('SELECT * FROM "MYLIB"."ORDLIN", "MYLIB"."ORDDTL" 
. . . . . . WHERE "MYLIB"."ORDLIN"."CUSTNO" = "MYLIB"."ORDDTL"."CUSTNO"')

IO_STATUS

I/O操作の結果の「戻りコード」を受け取るフィールドの名前を指定します。

デフォルト値*STATUSを指定すると、戻りコードは、#IO$STSという特別なフィールドに保管されます。このフィールドは、他のフィールドと同様にRDMLプログラムで参照できます。

I/O戻りコードを受け取るフィールドとしてユーザー・フィールドを指定する場合、このフィールドは、長さ2文字の英数字フィールドである必要があります。ユーザー・フィールドを指定した場合も、特別なフィールド#IO$STSは更新されます。

値については、「I/O コマンド戻りコード表」を参照してください。

IO_ERROR

コマンドの実行時にI/Oエラーが発生した場合に実行するアクションを指定します。

I/Oエラーは、「致命的」エラーと見なされます。ファイルが見つからなかった、ファイルが壊れている、ファイルを割り当てることができない、などがこれに該当します。これらのタイプのエラーが発生すると、ファンクションにおいて、そのファイルが関与しているすべての処理が停止します。

デフォルト値*ABORTを指定すると、ファンクションが異常終了し、I/Oエラーの性質を示すエラー・メッセージが発行されます。

*NEXTを指定すると、制御が次のコマンドに渡されます。

*RETURNを指定すると、プログラム・メインラインでは制御が呼び出し元に戻され、サブルーチンでは制御が呼び出し元ルーチンまたはプログラム・メインラインに戻されます。

上記の値をどれも使用しない場合は、制御を渡す先の有効なコマンド・ラベルを指定してください。