演習 2: ダイナミック SQL を使用するクエリーの作成

ダイナミック SQL とは、SQL が実行される前にプログラムが変数を利用して生成する SQL コードのことです。ダイナミック SQL を利用すると、検索基準ページで入力されたフィールドに基づいて、検索に WHERE 節を追加するといったタスクを実行できます。

このチュートリアルのクエリー対象列に基づいて、検索結果を表示する SQL クエリーは次のようになります。

SELECT tripName,  tripLocation, departureDate, returnDate, price, tripID
FROM trips

「Trip Search」フォームの目的は、ユーザーの入力に従って、SQL SELECT ステートメントを完成させる WHERE 節を作成するのに必要なデータを提供し、クエリーを制限することです。

ユーザーが検索基準を旅行検索フォームに入力し、[Search] ボタンをクリックすると、フォームフィールドが「Trip Search Results」ページに転送されます。転送されたフィールドの値によって、SQL SELECT ステートメントの WHERE 節が構成されます。次の例は、検索ページで設定された検索基準に従って生成される WHERE 節の例です。

WHERE tripLocation = 'Aruba'
WHERE tripLocation Like 'C%'
WHERE tripLocation = 'China' 
   AND departureDate > 2001/1/1
   AND price < 1500

上の例では、SQL の AND 演算子によって検索条件節が結合されます。旅行検索の例を簡単にするために、SQL の AND 演算子を使用してすべての検索条件節を結合します。検索基準を他の基準と結合するときに AND と OR を選択できれば、より高機能な検索基準ページとなります。

アクションページは、ユーザーが要求した情報を SQL SELECT ステートメントを使って取り出せるよう、WHERE 節が設定されたメソッドを呼び出します。すると、ユーザークエリーの結果を含む HTML テーブルが、cfoutput ブロックを使ってアクションページに表示されます。

cfif と cfset タグによる WHERE 節の作成

SQL SELECT ステートメントの中の WHERE 節は文字列です。CFML の cfset タグと cfif タグを使用して、検索アクションページに渡される値に従って条件付きで WHERE 節を作成します。cfset ステートメントでは、変数が作成されたり、既存の変数の値が変更されます。たとえば、color という名前の変数を作成し、その値を red に初期化するには、次のステートメントを使用します。

<cfset color = "red">

cfif タグは、テストで true になるか false になるかによって、コードの異なる部分にブランチするようにプログラムに指示します。たとえば、color 変数が red に等しいときにあるコードを実行し、それ以外の場合は別のコードを実行するように設定するには、次の擬似コードを使用します。

<cfif color EQ "red">
... color が red のときのステートメント
<cfelse>
... color が red 以外のときのステートメント
</cfif>

SQL WHERE 節を作成することは、主に文字列連結の作業です。ColdFusion では & 演算子で 2 つの文字列を連結できます。たとえば、次のコードを見てください。

<cfset FirstName = "Wilson">
<cfset LastName = "Gato">
<cfset FullName = FirstName & " " & LastName>
<cfoutput>私の名前は、#FullName# です。</cfoutput>

結果は次のテキストになります。

私の名前は、Wilson Gato です。

旅行検索フォームの個々の検索基準について、「Trip Search Results」ページ内のコードで次の作業を実行する必要があります。

WHERE サブ節のコードは、次のようになります。

<cfif Form.tripLocationOperator EQ "EQUALS">         
   <cfset WhereClause = WhereClause & " AND tripLocation = '" &
      form.tripLocationValue & "'" >
<cfelse>
   <cfset WhereClause = WhereClause & " AND tripLocation like '" &
      form.tripLocationValue & "%'" >
</cfif>

SQL SELECT ステートメントの WHERE 節内にある文字列の列をテストするときは、引用符でテスト値を囲む必要があります。

変数を使用して WHERE 節を構成するときは、データベースサーバーがエラーを返さないように、引用符を保護する必要があります。引用符を保護するには、ColdFusion の PreserveSingleQuotes 関数を使用する必要があります。PreserveSingleQuotes 関数を使用すると、ColdFusion は、その関数に渡された変数文字列に含まれている引用符にエスケープ文字を自動的に追加できなくなります。

メモ: cfqueryparam タグも、引用符をエスケープします。詳細については、『CFML リファレンス』を参照してください。


ColdFusion MX 7 | ColdFusion MX 6.1 | ColdFusion MX* | ColdFusion 5* | フォーラム* | デベロッパーセンター | サポート情報 | バグ報告

バージョン7

 

このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート

現在のページ: http://livedocs.adobe.com/coldfusion/7_jp/htmldocs/dynamic6.htm