什么是逃脱的正确方法?使用Oracle 12c MATCH_RECOGNIZE时,JDBC PreparedStatement中的字符?

时间:2017-02-08 08:37:13

标签: java oracle jdbc 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 个答案:

答案 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引擎处理它。