当使用Oracle 12c MATCH_RECOGNIZE时,在JDBC PreparedStatement中转义?字符的正确方法是什么?

7
以下查询在Oracle 12c中是正确的:
SELECT *
FROM dual
MATCH_RECOGNIZE (
  MEASURES a.dummy AS dummy
  PATTERN (a?)
  DEFINE a AS (1 = 1)
)

因为?字符被用作正则表达式字符而不是绑定变量,所以无法通过JDBC工作。

假设我想将其作为带有绑定变量的PreparedStatement运行,正确的方法是如何转义?

注意:


不使用PreparedStatement吗? - user330315
@a_horse_with_no_name: 假设我没有使用 dual,而是使用了一个非常复杂的派生表,并且其中有很多绑定变量,以避免 SQL 注入等问题。 - Lukas Eder
1个回答

7

这在文档中有明确说明:

MATCH_RECOGNIZE子句

?字符是Oracle Database 11g及更高版本中的MATCH_RECOGNIZE子句中使用的令牌。由于JDBC标准将?字符定义为参数标记,因此JDBC驱动程序和服务器SQL引擎无法区分相同令牌的不同用法。

在早期版本的JDBC驱动程序中,如果您希望将?字符解释为MATCH_RECOGNIZE令牌而不是参数标记,则必须使用Statement而不是PreparedStatement并禁用转义处理。但是,从Oracle Database 12c Release 1 (12.1.0.2)开始,您可以在使用?字符时使用'{\ ... \}'语法,以便JDBC驱动程序不将其处理为参数标记,并允许SQL引擎进行处理。


如果您将转义序列放入Java字符串中,则需要在Java字符串内部转义\字符,因此完整序列将是{\\?\\}。这在OJDBC文档中更清晰地说明。 - MT0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接