コマンド テキストのプリプロセス(FireDAC)
コマンドの操作(FireDAC) への移動
目次
関連トピック
トピック | 説明 |
---|---|
文字マクロ関数 | 文字列を操作する関数の一覧です。 |
数値マクロ関数 | 数値を操作する関数の一覧です。 |
日時マクロ関数 | 日時(日付および時刻)を操作する関数の一覧です。 |
システム マクロ関数 | 特殊関数の一覧です。 |
変換マクロ関数 | CONVERT 関数について説明します。 |
RETURNING 句の統一サポート | FireDAC では Firebird、Oracle、PostgreSQL の RETURNING 句をサポートしています。 |
概要
以下の文章のいくつかの箇所で、"マクロ" と "エスケープ シーケンス" の 2 つの用語は同じ意味で使用されています。FireDAC では、以下の 3 種類のマクロ命令をサポートしています。
- 置換変数。 パラメータの使用を拡張するため、コマンド テキストに置換パラメータを挿入できるようになります。たとえば、FROM 句のテーブル名や SELECT 句の列名をパラメータ化するには、パラメータではなく置換変数を使用できます。
- エスケープ シーケンス。DBMS に依存しない SQL コマンドを作成できるようになります。
- 条件付き置換。 アプリケーションで定義された属性や現在接続している DBMS に応じて、条件付きで SQL コマンドを展開できるようになります。
ResourceOptions.MacroCreate プロパティが True に設定されている場合、CommandText プロパティ値または SQL プロパティ値を設定すると、コレクション プロパティ Macros に値が自動的に入力されます。ResourceOptions.MacroExpand が True の場合は、Prepare を呼び出したとき、コマンド テキストが FireDAC コマンド プリプロセッサにより、DBMS で認識できる形式に変換されます。つまり、マクロは DBMS には見えません。
ResourceOptions.ParamCreate 値が True の場合、コレクション プロパティ Params には値が自動的に入力されます。ResourceOptions.ParamExpand が True の場合は、Prepare を呼び出したとき、FireDAC のパラメータ マーカーが DBMS のネイティブ マーカーに置換されます。
エスケープ シーケンスと条件付き置換は、ResourceOptions.EscapeExpand が True の場合に処理されます。
SQL ダイアレクトの抽象化
アプリケーションで複数の DBMS をサポートする必要がある場合は、それらの SQL ダイアレクトが異なる可能性があることに注意しなければなりません。FireDAC のエスケープ シーケンスにより、SQL ダイアレクトに依存しない SQL コマンドを作成できます。
たとえば、文字列を大文字に変換する関数は、MySQL、Oracle、Microsoft SQL Server で異なります。しかし、以下のコマンドはどのような DBMS でも動作します。
SELECT {ucase(Name)} FROM MyTable
なお、SQLite の場合は、FireDAC.Stan.ExprFuncs
ユニットを "uses" 句に追加する必要があります。もっと複雑なケースでは、コマンドの一部あるいは場合によっては全部を別の記述にする必要があります。その場合は、次のような FireDAC 条件付きエスケープ シーケンスが役に立ちます。
{IF Oracle} SELECT * FROM OracleTab {fi}
{IF MSSQL} SELECT * FROM MSSQLTab {fi}
置換変数
置換変数は "!" または "&" 記号で始まり、その後にマクロ変数名が続きます。以下に例を示します。
SELECT * FROM &TabName
各記号の意味は以下のとおりです。
- "!" -- "文字列" 置換モード。マクロ値は、変換を受けずに "そのまま" コマンド テキスト内の変数と直接置換されます。
- "&" -- "SQL" 置換モード。マクロ値は、ターゲット DBMS の構文規則を使って、マクロのデータ型に応じて置換されます。
マクロを使用するには、次のようなコードを使用します。
FDQuery1.SQL.Text := 'SELECT * FROM &TabName';
FDQuery1.MacroByName('TabName').AsRaw := 'Orders';
FDQuery1.Open;
マクロは、ResourceOptions.MacroCreate と MacroExpandMacroExpand が True に設定されている場合に処理されます。
パラメータ マーカー
パラメータ マーカーは ":" 記号で始まり、その後にパラメータ名が続きます。以下に例を示します。
SELECT * FROM Orders WHERE OrderDate > :FROM_DATE
"?" 記号は無名のパラメータ マーカーと見なされます。これは DataSnap との互換性を保つためのもので、通常の FireDAC アプリケーションでは使用しないでください。
パラメータを使用する場合は、「コマンドの実行」トピックの「パラメータの使用」を参照してください。パラメータは、ResourceOptions.ParamCreate と ParamExpand が True の場合に処理されます。
エスケープ シーケンス
FireDAC には、以下の 5 種類のエスケープ シーケンスがあります。
- 定数置換を可能にするもの
- 識別子置換を可能にするもの
- 条件付き置換
- LIKE 演算子のエスケープ シーケンス
- スカラ関数
エスケープ シーケンスは、ResourceOptions.EscapeExpand が True の場合に処理されます。
定数置換のエスケープ シーケンスを使用すると、DBMS の構文と地域設定とは無関係に、コマンド テキストに定数を記述できます。エスケープ シーケンスの DBMS 構文への展開を以下の表に示します。
形式 | 説明 |
---|---|
{e <数値>} | 数値定数。<数値> は、'.' を小数点に使用して指定する必要があります。
たとえば、{e 123.7} は Microsoft Access では 123,7 になります。 |
{d <日付>} | 日付定数。<日付> は、"yyyy-mm-dd" 形式で指定する必要があります。
たとえば、{d 2004-08-30} は Oracle では TO_DATE('2004-08-30', 'yyyy-mm-dd') になります。 |
{t <時刻>} | 時刻定数。<時刻> は、"hh24:mi:ss" 形式で指定する必要があります。
たとえば、{t 14:30:00} は SQL Server では CONVERT(DATETIME, '14:30:00', 114) になります。 |
{dt <日付 & 時刻>} | 日時定数。<日付 & 時刻> は上記の形式でなければなりません。 |
{l <論理値>} | 論理型定数。<論理値> は、False か True です。DBMS で論理データ型がサポートされている場合、このエスケープ シーケンスはその型の定数に展開され、そうでない場合は、数値 0 または 1 に展開されます。 |
{s <文字列>} | 文字列定数。<文字列> は、文字の並びを引用符で囲んだもの、あるいは引用符で囲まないものです。
たとえば、{s Company '1st Coding'} は 'Company 1st Coding' になります。 |
識別子置換のエスケープ シーケンスを使用すると、DBMS 固有の識別子引用符付け規則を抽象化できます。詳細については、「オブジェクト名」を参照してください。構文は次のとおりです。
形式 | 説明 |
---|---|
{id <識別子名>} | DBMS 固有の引用符付き識別子の構文に展開されます。
たとえば、{id Order Details} は Oracle では "Order Details" になります。 |
エスケープ関数シーケンスを使用すると、DBMS 固有の組み込み関数セットとそれらの構文を抽象化できます。構文は次のとおりです。
形式 | 説明 |
---|---|
{fn <関数名>(<引数>)} | エスケープ関数の構文とセットは ODBC エスケープ関数と同一です。サブトピックでは、FireDAC のエスケープ関数の一覧を示しています。
たとえば、SELECT * FROM MyTab WHERE Year = {fn YEAR({fn NOW()}} または SELECT * FROM MyTab WHERE Year = {YEAR({NOW()}} は Oracle では SELECT * FROM MyTab WHERE Year = TO_NUMBER(TO_CHAR(SYSDATE, 'YYYY')) になります。 |
{<関数名>(<引数>)} | 上記と同じ。 |
条件付き置換
条件付き置換のエスケープ シーケンスを使用すると、アプリケーションの接続先の DBMS かマクロ変数値のどちらかに応じて、テキストをコマンドに置換できます。以下では、構文が異なるだけでなく、パラメータとマクロの処理方法も異なります。エスケープ シーケンスの構文は次のとおりです。
形式 | 説明 |
---|---|
{iif (X1, Y1, ..., XN, YN, YN+1) } | ここで Xi は以下のいずれかです。
これらの条件のどれにも合致せず、かつ、YN+1 テキストが指定されている場合は、そのテキストがコマンドに置換されます。Xi と Yi のどちらに含まれているパラメータおよびマクロも Params および Macros コレクション内に作成されます。 |
{if x} y {fi} | ここで X は以下のいずれかです。
Y に含まれているパラメータおよびマクロは、X が True の場合にのみ、Params および Macros コレクション内に作成されます。 |
FireDAC の DBMS 識別子では、大文字/小文字を区別しません。それらの一覧を以下の表に示します。
識別子 | DBMS |
---|---|
|
Advantage Database Server |
|
Sybase SQL Anywhere |
|
IBM DB2 |
|
Firebird |
|
Informix |
|
InterBase |
|
Microsoft Access データベース |
|
Microsoft SQL Server |
|
MySQL サーバー |
|
Oracle サーバー |
|
この表に含まれていない他のすべての DBMS |
|
PostgreSQL サーバー |
|
SQLite データベース |
|
Teradata Database |
以下に例を示します。
{iif (Oracle, TO_CHAR, MSSQL, CONVERT)} -> ‘TO_CHAR’ on Oracle and ‘CONVERT’ on SQL Server.
{iif (&v1, Me, &v2, You, We)} -> ‘Me’ if &v1 has nonempty value, ‘you’ if &v2 has nonempty value, otherwise ‘We’.
{if Oracle} TO_CHAR {fi} {if MSSQL} CONVERT {fi} -> TO_CHAR on Oracle and CONVERT on SQL Server.
{if &v1} Me {fi} {if &v2} You {fi} -> ‘Me’ if &v1 has nonempty value + ‘you’ if &v2 has nonempty value.
なお、エスケープ関数 IF/IIF
は条件付き置換と同じ名前です。関数と条件付き置換を区別するには、{fn IF(...)}
または {fn IIF(...)}
の構文を使用します。
特殊文字の処理
特殊文字("!"、"&"、":"、"?"、"{"、"}" のいずれか)を DBMS に送信するには、以下を行う必要があります。
- 特殊文字を二重にします(たとえば "{{" など)。
- MySQL の場合は、この文字の先頭に "\" 文字を付けます(たとえば "\{{" など)。
- "!"、"&"、"{"、"}" の場合は、ResourceOptions.MacroCreate、MacroExpand、EscapeExpand を False に設定します。
- ":" と "?" の場合は、ResourceOptions.ParamCreate と ParamExpand を False に設定します。
上記を行わないと、"!"、"&"、"{"、"}" の各文字はマクロ コマンドとして扱われます。また、":" と "?" はパラメータ マーカーとして扱われます。ただし、次の場合を除きます。これらの構文が FireDAC で検出された場合は、パラメータ マーカーとして扱われません。
- Oracle PL/SQL 代入演算子
- Firebird の
BEGIN … END
内のEXECUTE BLOCK
パラメータ - TSQL ラベル
- PostgreSQL および Informix のキャスト演算子 '::'
- Informix のカタログ区切り記号 ':'