sysシステムのデータベースdbがある。
データベースdbの中にテーブルtblがある。
テーブルtblの項目に項目fld1・項目fld2がある。
項目fld1の一覧を表示する。
※データソース名をdsnとする。
<cfquery name="qry" datasource="dsn"> select fld1 from tbl </cfquery> <cfoutput> <table border="1"> <tr> <td>fld1</td> </tr> <cfloop query="qry"> <tr> <td>#qry.fld1#</td> </tr> </cfloop> </table> </cfoutput>
dsnの設定はColdFusionのAdministrator(管理画面)で
設定する必要があります。
この設定によって、プログラムの変更なしで、
データベースの指定を変更することができます。
利用方法としては、本番データを一時的に参照したい場合など
使ったりすることがあります。
実際はdsnと直接指定ではなく、
例えば以下のようにすることがほとんどだと思います。
<cfset tmp_dsn = "dsn"> <cfquery name="qry" datasource="#tmp_dsn#">
上記のようにtmp_dsn変数にセットすることで、
条件によっては違うdatasourceを使うことができます。
このようにすると、tmp_dsn変数の値を変更することで
同じように複数設定してあるcfqueryタグ部分は
変更しなくてよいですね。
cfqueryタグ内は、SQLを書くわけですが、
SQLでも関数を使う場合があります。
その関数は、使用するデータベースシステムの関数が使用できます。
例えばマイクロソフトのSQLServerで、個人的によく使う関数はISNULLです。
通常は
(fld1 = '') or (fld1 is null)
という条件を
ISNULL(fld1,'')=''
と書くことができます。
わかりやすいですね。
しかしながら、ISNULL関数はオラクル(同様の関数はNVL)にはないので
オラクルのデータベースを使う場合は、使うことができません。
将来、他のデータベースシステムに置き換える場合は、
注意が必要です。
今回は簡単なSQLでしたが、
cfqueryタグでかこんだ書き方が見やすいですね。
Javaや他の言語を使った人で、ColdFusionのSQLを使う場合、
以下のようなソースを見たことがあります。
<cfset sSQL = ""> <cfset sSQL = sSQL & "select fld1 "> <cfset sSQL = sSQL & "from tbl "> <cfset execSql(sSQL)>
execSqlという自作関数にSQL文を渡して実行する
というやり方です。
その関数内でcfqueryタグを使用しています。
間違いではありませんが、SQL文がわかりづらいし、
修正や追加もしにくいでしょう。
そんなときは、cfsavecontentタグを使うとよいです。
<cfsavecontent variable = "sSQL"> <cfoutput> select fld1 from tbl </cfoutput> </cfsavecontent> <cfset execSql(sSQL)>
cfsavecontentタグ内のcfoutputタグが、ちょっと目障りですね。
関数内での利用の場合は、必要となる場合があります。
以下のように全体をcfoutputでくくると
プログラムとしてはすっきりします。
<cfoutput> <cfsavecontent variable = "sSQL"> select fld1 from tbl </cfsavecontent> <cfset execSql(sSQL)> </cfoutput>
あとはSQLのinsert,update,deleteなど覚えると
データの登録・修正・削除を
行うことができます。