首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >怎样才能逃脱?使用Oracle19c PreparedStatement筛选器时JDBC JSON_EXISTS中的字符

怎样才能逃脱?使用Oracle19c PreparedStatement筛选器时JDBC JSON_EXISTS中的字符
EN

Stack Overflow用户
提问于 2022-03-16 09:18:06
回答 1查看 190关注 0票数 0

我使用的是Oracle19c,我试图在PreparedStatement中使用以下SQL字符串

代码语言:javascript
复制
SELECT * 
FROM   TEST_JSON2
WHERE  JSON_EXISTS(json_data, '$?(@[*] == ?)');

但我得到了以下例外

代码语言:javascript
复制
java.sql.SQLException: Invalid column index

我怎样才能逃避第一个问号?我发现了一些类似的讨论,但它指的是认识。也发现了,但仍然没有正确的答案对我来说。

EN

回答 1

Stack Overflow用户

发布于 2022-03-16 09:48:44

只要更正错误,就可以在JSON_EXISTS函数调用中忘记终止字符串文字,然后?将在字符串中,而JDBC将不将其解析为绑定参数。

如果由于某种原因,纠正错误不够,那么:

来自OJDBC文档 (这与与问题链接的文档有细微差别):

A.4.4 MATCH_RECOGNIZE条款 ?字符在OracleDatabase11g和更高版本的MATCH_RECOGNIZE子句中用作令牌。由于JDBC标准将?字符定义为参数标记,因此JDBC驱动程序和Server引擎无法区分相同令牌的不同用途。 在早期版本的JDBC驱动程序中,如果希望将?字符解释为MATCH_RECOGNIZE令牌而不是参数标记,则必须使用Statement而不是PreparedStatement,并禁用转义处理。但是,从OracleDatabase12c第1版(12.1.0.2)开始,您可以在使用'{\\ ... \\}'字符时使用?语法,这样JDBC驱动程序就不会将其作为参数标记处理,并允许SQL引擎处理它。

在此之后,我认为您的代码(纠正不关闭字符串文字并在JSON路径表达式中缺少一个结束括号的错误)应该如下:

代码语言:javascript
复制
String sql =
      "SELECT * "
    + "FROM   TEST_JSON2 "
    + "WHERE  JSON_EXISTS(json_data, {\\'$?(@[*] == ?)'\\})";
PreparedStatement ps = conn.prepareStatatement(sql);
ResultSet rs = ps.executeQuery();

或者,不使用PreparedStatement而只使用Statement

代码语言:javascript
复制
String sql =
      "SELECT * "
    + "FROM   TEST_JSON2 "
    + "WHERE  JSON_EXISTS(json_data, '$?(@[*] == ?)')";
Statement s = conn.createStatatement(sql);
ResultSet rs = s.executeQuery();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71494412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档