Какой правильный способ избежать? символ в JDBC PreparedStatement при использовании Oracle 12c MATCH_RECOGNIZE?

Следующий запрос корректен в Oracle 12c:

SELECT *
FROM dual
MATCH_RECOGNIZE (
  MEASURES a.dummy AS dummy
  PATTERN (a?)
  DEFINE a AS (1 = 1)
)

Но это не работает через JDBC из-за ? символ, который используется как символ регулярного выражения, а не как переменная связывания.

Какой правильный способ избежать ? через JDBC, при условии, что я хочу запустить это как PreparedStatement с переменными связывания?

Замечания:

1 ответ

Решение

Это подробно описано в документации

https://docs.oracle.com/database/121/JJDBC/apxref.htm

Статья MATCH_RECOGNIZE

? символ используется в качестве токена в предложении MATCH_RECOGNIZE в Oracle Database 11g и более поздних версиях. Как стандарт JDBC определяет? символ в качестве маркера параметра, драйвер JDBC и серверная подсистема SQL не могут различать различные варианты использования одного и того же токена.

В более ранних версиях драйвера JDBC, если вы хотите интерпретировать? символ как токен MATCH_RECOGNIZE, а не как маркер параметра, тогда вы должны использовать Statement вместо PreparedStatement и отключить обработку escape. Однако, начиная с Oracle Database 12c Release 1 (12.1.0.2), вы можете использовать синтаксис '{\ ... }' при использовании символа? символ, так что драйвер JDBC не обрабатывает его как маркер параметра и позволяет обработчику SQL обрабатывать его.

Другие вопросы по тегам