SQL エスケープ シーケンスの使用

ダウンロードJDBC Driver のダウンロード

SQL Server 用 Microsoft JDBC ドライバー では、JDBC API で定義された SQL エスケープ シーケンスを使用することができます。 SQL ステートメント内のエスケープ シーケンスは、SQL 文字列のエスケープ部分を異なる方法で処理することを、JDBC ドライバーに指示するために使用します。 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 エスケープ構文

注意

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> をサポートしていません。これを使用すると、ドライバーが例外をスローします

関連項目

JDBC ドライバーでのステートメントの使用