SQL エスケープ シーケンスの使用
Microsoft SQL Server JDBC Driver は、JDBC API の定義に従って、SQL エスケープ シーケンスの使用をサポートしています。SQL ステートメント内のエスケープ シーケンスは、SQL 文字列のエスケープ部分を異なる方法で処理することを、JDBC ドライバに指示するために使用します。JDBC ドライバが SQL 文字列のエスケープ部分を処理すると、文字列の該当部分は SQL Server が理解する SQL コードに変換されます。
JDBC API で要求されるエスケープ シーケンスには 5 つの種類があり、すべて JDBC ドライバによってサポートされています。
LIKE ワイルドカード リテラル
関数処理
日付および時刻のリテラル
ストアド プロシージャ呼び出し
外部結合
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 |
日付 |
yyyy-mm-dd |
t |
時刻 |
hh:mm:ss [1] |
ts |
タイムスタンプ |
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 ドライバでは、次の外部結合エスケープ シーケンスがサポートされています。
左外部結合
右外部結合
完全外部結合
入れ子になった外部結合