SQL エスケープ シーケンスの使用
SQL Server 用 Microsoft JDBC ドライバー では、JDBC API で定義された SQL エスケープ シーケンスを使用することができます。 エスケープ シーケンスは、SQL 文字列のエスケープされた部分を異なる方法で処理する必要があることをドライバーに伝えるために、SQL ステートメント内で使用されます。 JDBC ドライバーは、SQL 文字列のエスケープされた部分を処理すると、文字列のその部分を SQL Server が認識する SQL コードに変換します。
JDBC API で要求されるエスケープ シーケンスには 5 つの種類があり、すべて JDBC ドライバーによってサポートされています。
- LIKE ワイルドカード リテラル
- 関数処理
- 日付および時刻のリテラル
- ストアド プロシージャの呼び出し
- 外部結合
- LIMIT エスケープ構文
JDBC ドライバーで使用されるエスケープ シーケンスの構文は、次のとおりです。
{keyword ...parameters...}
注意
SQL のエスケープ処理は、JDBC ドライバーに対して常に有効化されています。
以下のセクションでは、5 つの種類のエスケープ シーケンスと、それらが JDBC ドライバーでどのようにサポートされているかについて説明します。
LIKE ワイルドカード リテラル
JDBC ドライバーは、LIKE 句でワイルドカードをリテラルとして使用する {escape 'escape character'}
構文をサポートします。 たとえば次のコードでは、col2 の値が (ワイルドカードとしてではなく) 文字どおりアンダースコアで始まっている行の col3 の値が返されます。
ResultSet rst = stmt.executeQuery("SELECT col3 FROM test1 WHERE col2
LIKE '\\_%' {escape '\\'}");
注意
エスケープ シーケンスは、SQL ステートメントの末尾に置く必要があります。 コマンド文字列内に複数の SQL ステートメントがある場合、エスケープ シーケンスは該当する各 SQL ステートメントの末尾に置く必要があります。
関数処理
JDBC ドライバーは、次の構文で SQL ステートメント内の関数エスケープ シーケンスをサポートしています。
{fn functionName}
functionName
は、JDBC ドライバーでサポートされている関数です。 次に例を示します。
SELECT {fn UCASE(Name)} FROM Employee
次の表は、JDBC ドライバーで関数エスケープ シーケンスを使用する場合にサポートされている、さまざまな関数を示します。
文字列関数 | 数値関数 | 日付時刻関数 | システム関数 |
---|---|---|---|
ASCII CHAR CONCAT DIFFERENCE INSERT LCASE LEFT LENGTH LOCATE LTRIM REPEAT REPLACE RIGHT RTRIM SOUNDEX SPACE SUBSTRING UCASE |
ABS ACOS ASIN ATAN ATAN2 CEILING COS COT DEGREES EXP FLOOR LOG LOG10 MOD PI POWER RADIANS RAND ROUND SIGN SIN SQRT TAN TRUNCATE |
CURDATE CURTIME DAYNAME DAYOFMONTH [DAYOFWEEK] DAYOFYEAR EXTRACT HOUR MINUTE MONTH MONTHNAME [NOW] [QUARTER] SECOND TIMESTAMPADD TIMESTAMPDIFF [WEEK] YEAR |
DATABASE IFNULL User |
注意
データベースでサポートされていない関数を使用すると、エラーが発生します。
日付および時刻のリテラル
日付、時刻、およびタイムスタンプのリテラルに使用するエスケープ構文は、次のとおりです。
{literal-type 'value'}
ここで literal-type
は、次のいずれかです。
リテラルの種類 | 説明 | 値の形式 |
---|---|---|
d | Date | yyyy-mm-dd |
t | Time | hh:mm:ss [1] |
ts | TimeStamp | yyyy-mm-dd hh:mm:ss[.f...] |
次に例を示します。
UPDATE Orders SET OpenDate={d '2005-01-31'}
WHERE OrderID=1025
ストアド プロシージャの呼び出し
JDBC ドライバーでは、ストアド プロシージャ呼び出しについては、戻りパラメーターを処理する必要があるかどうかによって、{? = call proc_name(?,...)}
および {call proc_name(?,...)}
というエスケープ構文がサポートされています。
プロシージャは、データベースに格納されている実行可能なオブジェクトです。 これは通常、プリコンパイルされた 1 つ以上の SQL ステートメントです。 ストアド プロシージャを呼び出すためのエスケープ シーケンス構文は、次のとおりです。
{[?=]call procedure-name[([parameter][,[parameter]]...)]}
procedure-name
にはストアド プロシージャの名前を指定し、parameter
にはストアド プロシージャのパラメーターを指定します。
ストアド プロシージャでの call
エスケープ シーケンスの使用の詳細については、「ストアド プロシージャでのステートメントの使用」を参照してください。
外部結合
JDBC ドライバーでは、SQL92 の左外部結合、右外部結合、および完全外部結合で使用する構文がサポートされています。 外部結合用のエスケープ シーケンスは、次のとおりです。
{oj outer-join}
outer-join の内容は次のとおりです。
table-reference {LEFT | RIGHT | FULL} OUTER JOIN
{table-reference | outer-join} ON search-condition
table-reference
はテーブル名で、search-condition
はテーブルで使用する結合条件です。
次に例を示します。
SELECT Customers.CustID, Customers.Name, Orders.OrderID, Orders.Status
FROM {oj Customers LEFT OUTER JOIN
Orders ON Customers.CustID=Orders.CustID}
WHERE Orders.Status='OPEN'
JDBC ドライバーでは、次の外部結合エスケープ シーケンスがサポートされています。
- 左外部結合
- 右外部結合
- 完全外部結合
- 入れ子になった外部結合
LIMIT エスケープ構文
Note
LIMIT エスケープ構文は、Microsoft JDBC Driver 4.2 for SQL Server (以降) でのみ、JDBC 4.1 以降を使用する場合にサポートされます。
LIMIT のエスケープ構文は次のとおりです。
LIMIT <rows> [OFFSET <row offset>]
エスケープ構文には 2 つの部分があります。<rows> は必須であり、返される行数を指定します。 OFFSET と <row offset> は省略可能であり、返される行の先頭までスキップする行数を指定します。 JDBC ドライバーでは、このうち必須の部分のみがサポートされ、LIMIT の代わりに TOP を使用するようにクエリを変換して処理されます。 SQL Server は、LIMIT 句をサポートしていません。 JDBC ドライバーは、省略可能な <row offset> をサポートしていません。これを使用すると、ドライバーにより例外がスローされます。