外だしSQLとは?
外だしSQL(OutsideSql)とは、外部テキストファイルに記載されたSQL文をアプリケーションから実行する機能のことを言います。
パラメータコメント
単にSQL文を実行するだけでなく、アプリケーションで導出される動的なパラメータを参照し、
SQL上で「分岐(IF文)」指定・「バインド変数」指定などを行うことが可能です。
ex) アプリで指定された会員IDがnullじゃなければ、その会員IDで等値条件(テスト値:3)
/*IF pmb.memberId != null*/MEMBER_ID = /*pmb.memberId*/3/*END*/
これらは「SQL構文のコメント」として表現されています。よって、DBFluteではこれらコメントのことを「パラメータコメント」と呼びます。
2Way-SQL
さらに、バインド変数指定時にはテスト値を含めることが可能なため、外だしSQLはアプリケーションでもSQLツールでもどちらでも実行可能です。記述したSQLはアプリケーションを起動することなく、SQLツールでそのSQLの文法の確認ができます。これは非常に大きなメリットであり、開発者はSQLの実装に集中できます。
プログラム上で文字列でSQLを埋め込んで生成していたときは、アプリケーションを実行するまでそのSQLが正しいかどうかを確認することができませんでした。結局実行すると「右カッコがありません」と怒られ再度修正し、アプリケーションを再起動してまた試します。その繰り返しが本当に時間を費やすものでした。
外だしSQLならその時間は非常に短いです。SQLツールで簡単に実行できてしまうからです。この「アプリケーション・SQLツールの両方で実行可能」なSQLのことを「2Way-SQL」と呼びます。
ex) 2Way-SQLでの実装 (アプリケーション・SQLツールの両方で実行可能)
/*IF pmb.isPaging()*/
select member.MEMBER_ID
, member.MEMBER_NAME
, (select sum(purchase.PURCHASE_PRICE)
from PURCHASE purchase
where purchase.MEMBER_ID = member.MEMBER_ID
and purchase.PAYMENT_COMPLETE_FLG = 0
) as UNPAID_PRICE_SUMMARY
, memberStatus.MEMBER_STATUS_NAME
-- ELSE select count(*)
/*END*/
from MEMBER member
/*IF pmb.isPaging()*/
left outer join MEMBER_STATUS memberStatus
on member.MEMBER_STATUS_CODE = memberStatus.MEMBER_STATUS_CODE
/*END*/
/*BEGIN*/where
/*IF pmb.memberId != null*/member.MEMBER_ID = /*pmb.memberId*/3/*END*/
/*IF pmb.memberName != null*/and member.MEMBER_NAME like /*pmb.memberName*/'ス' || '%'/*END*/
/*IF pmb.memberStatusCode != null*/and member.MEMBER_STATUS_CODE = /*pmb.memberStatusCode*/'FML'/*END*/
/*IF pmb.unpaidMemberOnly*/
and exists (select 'yes'
from PURCHASE purchase
where purchase.MEMBER_ID = member.MEMBER_ID
and purchase.PAYMENT_COMPLETE_FLG = 0
)
/*END*/
/*END*/
/*IF pmb.isPaging()*/
order by UNPAID_PRICE_SUMMARY desc, member.MEMBER_ID asc
/*END*/
これらは、S2Daoと呼ばれるフレームワークにおける「SQLファイル」とほぼ同義です。
DBFluteはS2Daoに大きなヒントを得ています(そもそも内部的にS2Daoを利用しています)。
利用上の役割としては、ConditionBeanでは実現できない複雑で非定型なSQLを対象とします。
複雑な副問い合わせやGroupBy、SQL関数の利用などといったSQLを記述することが可能です。
リンク
