外だし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を記述することが可能です。

リンク