Использование escape-последовательностей SQL
Согласно определению API JDBC, драйвер Microsoft JDBC Driver for SQL Server поддерживает использование escape-последовательностей SQL. Escape-последовательности используются в инструкции SQL, чтобы сообщить драйверу, что экранированная часть строки SQL должна обрабатываться иначе. Когда драйвер JDBC обрабатывает экранированную часть строки SQL, она преобразует ее в код SQL, который понимает SQL Server.
Существует пять типов escape-последовательностей, требуемых API JDBC, и все они поддерживаются драйвером JDBC:
- Литералы-шаблоны LIKE
- Обработка функций
- Литералы даты и времени
- Вызовы хранимых процедур
- Внешние соединения
- Escape-синтаксис LIMIT
Драйвер JDBC использует следующий синтаксис escape-последовательности:
{keyword ...parameters...}
Примечание.
Для драйвера JDBC всегда включена обработка escape-последовательностей SQL.
В следующих разделах описывается пять типов escape-последовательностей и способы их поддержки драйвером JDBC.
Литералы-шаблоны LIKE
Драйвер JDBC поддерживает синтаксис {escape 'escape character'}
для использования шаблонов предложения LIKE в качестве литералов. Например, в следующем коде возвращаются значения col3, для которых значение col2 начинается с символа подчеркивания (и не используется как шаблон).
ResultSet rst = stmt.executeQuery("SELECT col3 FROM test1 WHERE col2
LIKE '\\_%' {escape '\\'}");
Примечание.
Escape-последовательность должна быть в конце инструкции SQL. При наличии в командной строке нескольких инструкций SQL escape-последовательность должна быть в конце каждой соответствующей инструкции SQL.
Обработка функций
Драйвер JDBC поддерживает использование escape-последовательностей функций в инструкциях SQL со следующим синтаксисом:
{fn functionName}
где functionName
представляет собой функцию, поддерживаемую драйвером JDBC. Например:
SELECT {fn UCASE(Name)} FROM Employee
В следующей таблице перечислены различные функции, поддерживаемые драйвером JDBC при использовании escape-последовательностей функций:
Строковые функции | Числовые функции | Функции Datetime | Системные функции |
---|---|---|---|
ASCII CHAR CONCAT DIFFERENCE ВСТАВИТЬ LCASE LEFT LENGTH НАЙТИ LTRIM Повторение… ЗАМЕНИТЬ RIGHT RTRIM SOUNDEX ПРОБЕЛ SUBSTRING UCASE |
ABS ACOS ASIN ATAN ATAN2 CEILING COS COT DEGREES EXP ЭТАЖ ЖУРНАЛ LOG10 MOD PI ПИТАНИЕ RADIANS RAND ROUND SIGN SIN SQRT TAN TRUNCATE |
CURDATE CURTIME DAYNAME DAYOFMONTH DAYOFWEEK DAYOFYEAR EXTRACT HOUR MINUTE MONTH MONTHNAME NOW QUARTER ВТОРОЙ TIMESTAMPADD TIMESTAMPDIFF WEEK YEAR |
DATABASE IFNULL Пользователь |
Примечание.
Использование функции, не поддерживаемой базой данных, приведет к возникновению ошибки.
Литералы даты и времени
Ниже приводится синтаксис escape-последовательности для литералов даты, времени и отметок времени:
{literal-type 'value'}
где literal-type
является одним из следующих:
Тип литерала | Description | Формат значения |
---|---|---|
d | Дата | гггг-мм-дд |
t | Время | чч:мм:сс [1] |
ts | TimeStamp | гггг-мм-дд чч:мм:сс[.f...] |
Например:
UPDATE Orders SET OpenDate={d '2005-01-31'}
WHERE OrderID=1025
Вызовы хранимых процедур
Драйвер JDBC поддерживает синтаксис escape-последовательностей {? = call proc_name(?,...)}
и {call proc_name(?,...)}
для вызовов хранимых процедур, в зависимости от того, требуется ли обработка возвращаемого параметра.
Процедура представляет собой исполняемый объект, который хранится в базе данных. Обычно процедурой является одна или несколько заранее скомпилированных инструкций SQL. Ниже приводится синтаксис escape-последовательности вызова хранимой процедуры:
{[?=]call procedure-name[([parameter][,[parameter]]...)]}
где procedure-name
указывает имя хранимой процедуры, а parameter
указывает параметр хранимой процедуры.
См. сведения об использовании escape-последовательностей call
с хранимыми процедурами.
Внешние соединения
Драйвер JDBC поддерживает синтаксис левого, правого и полного внешнего соединения SQL92. Ниже приводится синтаксис escape-последовательности для внешних соединений:
{oj 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 поддерживает следующие escape-последовательности внешнего соединения:
- Левые внешние соединения
- Правые внешние соединения
- Полные внешние соединения
- Вложенные внешние соединения
Escape-синтаксис LIMIT
Примечание.
Escape-синтаксис LIMIT поддерживается только драйвером Microsoft JDBC Driver 4.2 (и более поздних версий) для SQL Server при использовании JDBC 4.1 или более поздней версии.
Escape-синтаксис LIMIT выглядит следующим образом:
LIMIT <rows> [OFFSET <row offset>]
Escape-синтаксис состоит из двух частей. <Строки> — это обязательная часть, которая указывает число возвращаемых строк. OFFSET и <смещение строки> — это необязательные компоненты, указывающие число строк, которые необходимо пропустить перед началом получения строк. Драйвер JDBC поддерживает только обязательную часть, преобразуя запрос для использования TOP вместо LIMIT. SQL Server не поддерживает предложение LIMIT. Драйвер JDBC не поддерживает необязательную часть <смещение строки>. При ее использовании драйвер вызовет исключение.