Author: Shinji Chikugi
始めに
第35回デベロッパーキャンプのB4セッションにて、データベースの依存性排除についてお話ししました。その中でFireDACのマクロ機能を用いて依存性を排除する手法が存在する事に触れましたが、時間の関係上具体的なデモは出来ませんでした。 本記事ではそのフォローアップとしてFireDACのプリプロセス機能とマクロ機能をご紹介します。
FireDACのプリプロセス機能とマクロ機能
プリプロセス機能とは、FireDACがSQLコマンドを実行する前に、実行するRDBMSに応じてSQLコマンドを置換する機能です。また、マクロ機能はRDBMSのSQLの「方言」を抽象化しRDBMSに応じた関数に置換する機能です。
例えば、Oracle、SQL Server、InterBaseでシステム日時を取得するクエリは次のようになります。
RDBMS | クエリ |
Oracle | select sysdate from dual; |
SQL Server | select getdate(); |
InterBase | select current_timestamp from rdb$database; |
これらの「方言」をFireDACのプリプロセス機能とマクロ機能で吸収すると以下のようになります。TFDQueryのSQLプロパティに以下の値を設定します。
1 |
select {CURRENT_TIMESTAMP()} {if Oracle} from dual {fi} {if interbase} from rdb$database {fi} |
マクロ「CURRENT_TIMESTAMP()」はシステム日時を取得するマクロです。また「{if~fi}」で囲まれた部分がFireDACのプリプロセス機能によるRDBMSの種類に応じた条件分岐です。RDBMSがOracleならば、”from dual”が、InterBaseならば、”from rdb$database “が展開されます。
これをFireDACのモニタ機能を使って、実際に実行されたSQLをログより確認しましょう。
1 |
81262180001 11:04:43.608 >> Prepare [Command="select {CURRENT_TIMESTAMP()} {if Oracle} from dual {fi} {if interbase} from rdb$database {fi}"] <br>81262180001 11:04:43.609 . Preprocessed [CMD="select SYSDATE from dual ", FROM="dual", VP=0, VPE=0, OBP=0, CK=1] <br>(中略)<br>81290460001 11:04:46.432 >> Prepare [Command="select {CURRENT_TIMESTAMP()} {if Oracle} from dual {fi} {if interbase} from rdb$database {fi}"] <br>81290620001 11:04:46.452 . Preprocessed [CMD="select GETDATE() ", FROM="", VP=0, VPE=0, OBP=0, CK=1] <br>(中略) <br>81311560001 11:04:48.539 >> Prepare [Command="select {CURRENT_TIMESTAMP()} {if Oracle} from dual {fi} {if interbase} from rdb$database {fi}"] <br>81311560001 11:04:48.541 . Preprocessed [CMD="select CURRENT_TIMESTAMP from rdb$database ", FROM="rdb$database", VP=0, VPE=0, OBP=0, CK=1]<br>(以下略) |
ログの「Preprocessed [CMD=」の部分が実際に発行されたSQLコマンドです。
このようにプリプロセス機能とマクロ機能を用いれば、RDBMSの「方言」に依存しないでSQLコマンドを実行することが出来ます。
プリプロセス機能とマクロ機能についての詳細は以下のDocWikiの以下の項目を参照してください。
http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/コマンド_テキストのプリプロセス(FireDAC)
http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/式の作成(FireDAC)
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition