7.85.1 SELECT_SQLのパラメータ

LANSA

7.85.1 SELECT_SQLのパラメータ


DISTINCT

FIELDS

FROM_FILE

GROUP_BY

HAVING

IO_ERROR

IO_STATUS

ORDER_BY

WHERE

また「SELECT_SQLの列名 と列値」も 参照してください。

FIELDS

列(フィールド)とそれに関連付けられた「SQLソース」またはファンクションを指定します。

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

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

指定する各列について、任意指定の「SQLソース」フィールドを指定することもできます。このフィールドの最大長は50文字です。

ソースを指定しない場合、デフォルト値*SAME (列名と同じ)が使用されます。すなわち、ファンクション内の列名と、SQLテーブル内のその「ソース」が同じであると見なされます。この値を使用する場 合、列が、FROM_FILESパラメータで指定する1つ以上のテーブル内の有効な実列として定義されていなければなりません。

例えば:

SELECT_SQL FIELDS((#CUSTNAM)) FROM_FILES(CUSTMST)
 

この場合、CUSTNAMという列がテーブルCUSTMSTから抽出され、その値がRDMLファンクションの#CUSTNAMというフィールドに返されま す。この例では、デフォルト値*SAMEが使用されます。次に、以下の例について考えます。

SELECT_SQL FIELDS((#CUSTNO CUSTNAM)) FROM_FILES(CUSTMST)
 

この場合、CUSTNAMという列がテーブルCUSTMSTから抽出され、その値がRDMLファンクションの#CUSTNOというフィールドに返されま す。

さらに、以下の例について考えます。

SELECT_SQL FIELDS((#SHORTNAME 'SUBSTR(CUSTNAM,3,10)'))
 

この場合、(SQLテーブルの)列CUSTNAMのサブストリングがRDMLファンクションのフィールド#SHORTNAMEに返されます。

また、以下の例では、CUSTNAMという列が含まれる2つのファイルが結合され、データ取得元のテーブルがCUSTMSTまたはCUSTMST2のどち らかを明確にするために相関が使用されます。

SELECT_SQL FIELDS((#CUSTNAM 'A.CUSTNAM')) FROM_FILES((CUSTMST A)(CUSTMST2 B)) WHERE('A.CUSTID = B.CUSTID')
 

最後に、以下の例について考えます。

SELECT_SQL FIELDS(#DEPTMENT (#VALUE1 'AVG(SALARY)') (#VALUE2 'SUM(SALARY)')(#VALUE3 'MAX(SALARY)')
 

この場合、SQLテーブルの列DEPTMENTがRDML変数#DEPTMENTに返され、SQLテーブルのフィールドSALARYの平均がRDML変数 #VALUE1に返されます。また、合計が#VALUE2に返され、最大値が#VALUE3に返されます。

FROM_FILES

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

注:こ のコマンドで使用するファイル(テーブル)名を最大20個指定できます。

注:他 のデータベースの外部ファイルにアクセスする場合、LANSAは、外部ファイルをLANSAにロードするために使用されたデータベース接続情報を見つけま す。これは、DEFINE_DB_SERVERおよびCONNECT_FILE BIFを使用することによって、さらに洗練することができます。

指定する各ファイル名について、任意指定の「相関」フィールドを指定することもできます。

相関を指定しない場合、デフォルト値*SAME (ファイル名と同じ)が使用されます。すなわち、特定のテーブル内の列を参照する場合は、実際のテーブル名を使用する必要があります。相関名を使用する場 合、その相関名で特定のテーブルの列を識別する必要があります。

. . . FROM_FILES((ORDLIN) (ORDDTL)) WHERE('ORDLIN.CUSTNO = ORDDTL.CUSTNO')
 

相関を使用した場合、このステートメントは以下のようになります。

. . . FROM_FILES((ORDLIN A) (ORDDTL B)) WHERE('A.CUSTNO = B.CUSTNO')
 

移 植性に関する考慮事項

Visual LANSAでは、テーブル名に@#$が使用されません。この変換は、FROM_FILESパラメータに対して行われ、他のパラメータ(WHEREパラメー タなど)のテーブル名に対しては行われません。そのため、SQLがすべてのLANSAプラットフォームで動作するようにするには、上記の2番目の例のよう に、必ず相関を使用してください。

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

 

WHERE

SQL_SELECTのWHERE句は、以下に示すように引用符で囲む必要があります。

. . . WHERE('EMPNO < ''A9999''')

. . . WHERE('NOT EMPNO LIKE ''%a''')

 

WHERE句では、LANSAフィールド名または列名を指定することができます(詳細については、FIELDSパラメータの説明を参照してください)。

SQL言語では、SQL構文として解釈される可能性のある識別子を二重引用符で囲みます。LNSAでは、二重引用符で囲まれたテキストに対して何の処理も 行われません。これは二重引用符(")であり、2つの一重引用符('')ではないことに注意してください。

移 植性に関する考慮事項

WHERE パラメータのLANSAフィールドが、FROM_FILESパラメータで指定されたいずれかのファイルのものであると認識されている限り、そのフィールド 名は、二重引用符で囲まれた列名としてSQLステートメントに作成されます。この列名が必ずしもフィールド名と同じでないことに注意してください。一般 に、このような状況は外部ファイルで起こりますが、LANSAファイルの特定のフィールド名でも起こることがあります。「[フィールド名の特 殊文字の変換]」を参照してください。

た だし、引用符で囲まれていないLANSAフィールド名がSQLキーワードと競合する場合は例外です。この場合、フィールド名は変換されません。詳細につい ては、「SQL/ODBC の文法:キーワードの重複」を参照してください。
例えば、SECTIONがSECTAB内のLANSAフィールドの場合、このフィールドは列S_CTIONとして作成されます。
WHEREパラメータがWHERE( 'SECTION = ''1''')と して指定されている場合、SECTIONは変更されないため、実行時にSQL構文エラーが発生します。
これを回避するには、相関を使用して、SECTIONをSQLキーワードとして使用せず、この列にアクセスしようとしていることをLANSAが認識できる ようにします。すなわち、FROM_FILES((SECTAB SEC)) WHERE('SEC.SECTION = ''1''')と 指定します。

同 じLANSAフィールドを含む複数のファイルから選択する場合、列名がファイルによって異なることがあります。「[フィールド名の特 殊文字の変換]」を参照してください。この場合、開発者は2通りの方法 でLANSAが生成するSQL WHERE句を制御できます。その1つは、LANSAがそのファイルの規則に従ってフィールド名を変更できるよう相関(FROM_FILESパラメータを 参照)を使用する方法です。2つ目は、列名を使用して、それを二重引用符で囲む方法です。

WHERE パラメータでフィールド名を使用する場合、LANSAがそのフィールド名を認識し、適切に変換できるよう、フィールド名の前後にスペースを残すことをお勧 めします。例えば、WHERE( 'a=b')の代わりにWHERE ( 'a = b' )と指定します。

 

Visual LANSAでは、以下に示すように、代わりに単一のフィールド名を指定できます。

CHANGE FIELDS(#SELECTION) TO('STATE = ''NSW''')
SELECT_SQL FIELDS(#STATE) FROM_FILES((#STATES)) WHERE(#SELECTION)
   DISPLAY FIELDS(#STATE)
ENDSELECT
 

フィールドの内容はWHERE句として使用されるため、以下の事柄を考慮する必要があります。

·         LANSA/AD RPGファンクションで単一のフィールド名を使用すると、ビルド警告が生成され、実行時にエラーが発生します。この機能を使用するコードは、この環境で実 行されないように条件付けすることができます。代替のプログラミング方法と移植可能なコードの作成方法については、*OPNQRYFコマンドのセクション を参照してください。

·         こ の例では、フィールド名STATEの前に# (ハッシュ(シャープ))記号がありません。これは、実際の選択要求がLANSAではなくSQLデータベースに対して行われるためです。すなわち、実際の 列名を使用する必要があります。Visual LANSAは、@、#、または$が含まれる列名を変更し、命名レベル0のファイルでこれらの記号をアンダースコアに置き換えます。ただし、LANSA/ADでは、この処理が行われません。すなわち、実際の列名ではなくLANSAフィールド名が使用されていれば、コードは移植可能です。例えば、フィールドが CUST$NAMの場合、CUST_NAMではなくCUST$NAMを使用する必要があります。Visual LANSAは、実行時にCUST$NAMをCUST_NAMに変更します(命名レベル0のファイル)。LANSA/ADでは、そのままになります。

·         :KARTIC などの変数比較値は置き換えられません。代わりに、値が#SELECTIONフィールドに連結されます。

WHERE句のヒント

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

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

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

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

変数比較値でのフィールドの使用

WHERE句に指定された名前を使用するよう指定するには、フィールド名の直前にコロン(:)を挿入します。このとき、コロンとフィールド名の間にはス ペースを入れません(フィールド名が6文字を超えていると、LANSA/AD RPGファンクションで予期しない結果になります)。

移 植性に関する考慮事項

LANSA では、WHERE句内で変数比較値を保管するために使用するフィールドが変換されません。すなわち、この方法でフィールドを使用する場合は、フィールド名 が6文字以下でなければなりません(これは、LANSA/ADの生成済みRPGでは、フィールド名が実際の名前で使用されるためです)。

LANSA/ADのRPGファンクションでは、コロンとフィールド名の間にスペースを入れることができますが、生成済みCコードでは、スペースは許可されません。可搬性を確 保するために、コロンとフィールド名の間にスペースを残さないでください。

コードをLANSA/AD RPGファンクションで実行し、長さが6文字を超えるフィールド名をWHERE句で使用する場合、以下の例のように、これらのフィールド名用の作業フィー ルドを6文字以下の名前で定義する必要があります。

DEFINE      #KARTIC REFFLD (#ARTICO)
DEFINE      #KADTRG REFFLD (#MADTRG)
 
. . . WHERE ('ARTICO = :KARTIC AND MADTRG > :KADTRG')
 

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

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

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

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

1.   比較にLANSAフィールドを使用します。例えば、WHERE('MYUNIGRPH = :STD_TEXT')の ように指定します。

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

      WHERE('UNIFLD LIKE 'C%')

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

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

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

      WHERE('UNIFLD = CHARFLD')

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

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

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

GROUP_BY

個々の行ではなく、行のグループの特性を見つけるために使用します。グループ化はソートではなく、選択された各行をグループに追加することであり、グルー プをSQLで処理することにより、そのグループの特性を導き出すことができます。

選択された行のグループ化の基準にする列を指定します。1列以上指定する場合、そのデータを分けるためにコンマを使用する必要が あります。例:GROUP_BY('EMPTSYEAR,EMPTSWEEK')

HAVING

GROUP_BY句に基づいて選択されたグループの検索条件を指定するために使用します。HAVINGパラメータによって、この句で指定する条件に適合す るグループのみが必要であることを示します。すなわち、HAVING句では、グループに含まれる個々の行のプロパティではなく、各グループのプロパティを 検査します。

HAVING句には、WHEREパラメータで使用できるものと同様の検索条件を指定できます。

ORDER_BY

選択された行 の取得順序を指定するために使用します。ORDER BYパラメータは、 GROUP_BYパラメータと同じ方法で使用できます。

列内の行を取得するときにSQLが使用する列の名前を指定します。1列以上指定する場合、そのデータを分けるためにコンマを使用する必要があります。例: ORDER_BY('SURNAME,GIVENAME')

DISTINCT

SELECT_SQLの結果で重複した行が必要ない場合は、このパラメータに*YESを指定します。

結果のテーブルで重複した行が必要な場合は、*NOを指定します。

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を指定すると、プログラム・メインラインでは制御が呼び出し元に戻され、サブルーチンでは制御が呼び出し元ルーチンまたはプログラム・メイ ンラインに戻されます。

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