7

以下查询在 Oracle 12c 中是正确的:

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

但它不能通过 JDBC 工作,因为该?字符用作正则表达式字符,而不是用作绑定变量。

?假设我想将其作为PreparedStatement绑定变量运行,那么通过 JDBC转义的正确方法是什么?

笔记:

4

1 回答 1

6

这在文档中明确涵盖:

MATCH_RECOGNIZE 子句

这 ?在 Oracle Database 11g 及更高版本中,字符用作 MATCH_RECOGNIZE 子句中的标记。正如 JDBC 标准定义的 ? 字符作为参数标记,JDBC Driver和Server SQL Engine无法区分同一个token的不同用途。

在早期版本的 JDBC 驱动程序中,如果要解释 ? 字符作为 MATCH_RECOGNIZE 标记而不是参数标记,那么您必须使用 Statement 而不是 PreparedStatement 并禁用转义处理。但是,从 Oracle Database 12c 第 1 版 (12.1.0.2) 开始,您可以在使用 ? 字符,以便 JDBC 驱动程序不会将其作为参数标记进行处理,并允许 SQL 引擎对其进行处理。

于 2017-02-13T16:27:03.867 回答