以下查询在 Oracle 12c 中是正确的:
SELECT *
FROM dual
MATCH_RECOGNIZE (
MEASURES a.dummy AS dummy
PATTERN (a?)
DEFINE a AS (1 = 1)
)
但它不能通过 JDBC 工作,因为?
用作正则表达式字符,而不是用作绑定变量的字符。
正确的逃生方法是什么?
通过 JDBC,假设我想将其作为PreparedStatement
与绑定变量?
Note:
- 我在 JDBC 规范讨论邮件列表上找到了一个讨论,但是这个问题没有结论:http://mail.openjdk.java.net/pipermail/jdbc-spec-discuss/2013-October/000066.html http://mail.openjdk.java.net/pipermail/jdbc-spec-discuss/2013-October/000066.html
- PostgreSQL 对于 JSON 运算符也有类似的问题:如何使用包含问号“?”的 PostgreSQL JSON(B) 运算符通过 JDBC https://stackoverflow.com/questions/38370972/how-do-i-use-postgresql-jsonb-operators-containing-a-question-mark-via-jdb
这在文档 https://docs.oracle.com/database/121/JJDBC/apxref.htm#CHECHCJH:
MATCH_RECOGNIZE
Clause
The ?
字符用作标记MATCH_RECOGNIZE
Oracle 数据库 11g 及更高版本中的子句。正如 JDBC 标准定义的?
字符作为参数标记,JDBC 驱动程序和服务器 SQL 引擎无法区分同一标记的不同用途。
在 JDBC 驱动程序的早期版本中,如果您想解释?
角色作为MATCH_RECOGNIZE
token 而不是作为参数标记,那么您必须使用Statement
代替PreparedStatement
并禁用转义处理。但是,从 Oracle Database 12c 第 1 版 (12.1.0.2) 开始,您可以使用'{\ ... \}'
使用时的语法?
字符,这样 JDBC 驱动程序就不会将其作为参数标记来处理,而允许 SQL 引擎来处理它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)