Какой правильный способ избежать? символ в 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
с переменными связывания?
Замечания:
- Я нашел обсуждение в списке рассылки обсуждения JDBC, но нет решения этой проблемы: http://mail.openjdk.java.net/pipermail/jdbc-spec-discuss/2013-October/000066.html
- PostgreSQL имеет аналогичные проблемы с операторами JSON: как использовать операторы PostgreSQL JSON(B), содержащие вопросительный знак "?" через JDBC
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 обрабатывать его.