Использование escape-последовательностей SQL
Microsoft JDBC Driver для SQL Server поддерживает использование escape-последовательностей SQL, описанных в определении API JDBC. Escape-последовательности используются в инструкции SQL для передачи драйверу сведений о том, что экранированные части SQL-строки должны обрабатываться иначе. При обработке драйвером JDBC части escape-последовательности 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 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 Пользователь |
Примечание
Использование функции, не поддерживаемой базой данных, приведет к возникновению ошибки.
Литералы даты и времени
Ниже приводится синтаксис escape-последовательности для литералов даты, времени и отметок времени:
{literal-type 'value'}
где literal-type
является одним из следующих:
Тип литерала | Описание | Формат значения |
---|---|---|
d | Дата | гггг-мм-дд |
t | Time | чч:мм:сс [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 не поддерживает необязательную часть <смещение строки>. При ее использовании драйвер вызовет исключение.