【发布时间】:2019-07-09 08:05:04
【问题描述】:
我正在尝试使用 Oracle 的 json_value() 函数使用 PreparedStatement 运行 SQL 查询。
假设如下表设置:
drop table foo cascade constraints purge;
create table foo
(
id integer primary key,
payload clob,
constraint ensure_json check (payload IS JSON STRICT)
);
insert into foo values (1, '{"data": {"k1": 1, "k2": "foo"}}');
以下 SQL 查询工作正常:
select *
from foo
where json_value(payload, '$.data.k1') = '1'
并返回预期的行。
但是,当我尝试使用 PreparedStatement 运行此查询时,如下代码所示:
String sql =
"select *\n" +
"from foo\n" +
"where json_value(payload, ?) = ?";
PreparedStatement pstmt = conection.prepareStatement(sql);
pstmt.setString(1, "$.data.k1");
pstmt.setString(2, "1");
ResultSet rs = pstmt.executeQuery();
(为了简单起见,我从示例中删除了所有错误检查)
这会导致:
java.sql.SQLException: ORA-40454: 路径表达式不是文字
罪魁祸首是传json路径值(参数索引1),第二个参数没问题。
当我(仅)用字符串常量 json_value(payload, '$.data.k1') = ? 替换第一个参数时,准备好的语句可以正常工作。
在绝望的尝试中,我还尝试在参数中包含单引号:pstmt.setString(1, "'$.data.k1'"),但毫不奇怪,Oracle 也不接受它(同样的错误消息)。
我也尝试使用 json_value(payload, concat('$.', ?) ) 并且只传递 "data.k1" 作为参数 - 结果相同。
所以,问题是:
- 如何使用
PreparedStatement参数将JSON 路径表达式传递给Oracle 的json_value函数?
有什么想法吗?这是驱动程序中的错误还是 Oracle 中的错误? (我在 My Oracle Support 上找不到任何东西)
或者这仅仅是“未实施”的情况?
环境:
我正在使用 Oracle 18.0
我尝试了 18.3 和 19.3 版本的 ojdbc10.jar 驱动程序以及 OpenJDK 11。
【问题讨论】:
标签: json oracle jdbc prepared-statement