以下查询在Oracle 12c中是正确的:
SELECT *
FROM dual
MATCH_RECOGNIZE (
MEASURES a.dummy AS dummy
PATTERN (a?)
DEFINE a AS (1 = 1)
)
但它不能通过JDBC工作,因为?
字符用作正则表达式字符,而不是绑定变量。
通过JDBC逃避?
的正确方法是什么,假设我想将其作为带有绑定变量的PreparedStatement
运行?
答案 0 :(得分:5)
文档
中明确说明了这一点https://docs.oracle.com/database/121/JJDBC/apxref.htm#CHECHCJH
MATCH_RECOGNIZE条款
? character在Oracle Database 11g及更高版本的MATCH_RECOGNIZE子句中用作标记。由于JDBC标准定义了?作为参数标记的字符,JDBC驱动程序和服务器SQL引擎无法区分同一令牌的不同用途。
在早期版本的JDBC Driver中,如果要解释?如果字符不是MATCH_RECOGNIZE标记而不是参数标记,则必须使用Statement而不是PreparedStatement并禁用转义处理。但是,从Oracle Database 12c第1版(12.1.0.2)开始,您可以使用' {\ ...}'使用时的语法?字符,以便JDBC驱动程序不将其作为参数标记处理,并允许SQL引擎处理它。