【问题标题】:Derby PreparedStatement does not inject parameter inside XMLEXISTS functionDerby PreparedStatement 不在 XMLEXISTS 函数中注入参数
【发布时间】:2023-04-08 04:06:01
【问题描述】:

尝试使用准备好的语句注入xmlexists函数的字符串参数时出错。

Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
Connection con = DriverManager.getConnection("jdbc:derby:c:\\mydb");
PreparedStatement st = con.prepareStatement("select * from \"Data\" where xmlexists(? passing by ref \"data\")");
st.setString(1, "//*[text()[contains(., 'v1')]]");
ResultSet rs = st.executeQuery();

错误:

ERROR 42Z75: XML 查询表达式必须是字符串文字。

在没有准备好的语句的情况下手动构建语句成功。

select *
from "Data"
where xmlexists('//*[text()[contains(., ''v1'')]]' passing by ref "data")

可能是什么原因?

【问题讨论】:

    标签: java jdbc prepared-statement derby


    【解决方案1】:

    引用自:https://db.apache.org/derby/docs/10.13/ref/rreffuncxmlexists.html

    语法: XMLEXISTS ( xqueryStringLiteral PASSING BY REF xmlValueExpression [ BY REF ] )

    xqueryStringLiteral
    必须指定为字符串文字。如果将此参数指定为参数、不是文字的表达式或不是字符串的文字(例如整数),Derby 将引发错误。 xqueryStringLiteral 参数也必须是 XPath 表达式。 Derby 不支持完整的 XQuery,只支持 XPath 子集。如果它无法编译或执行查询参数,Derby 将抛出 SQLException。

    听起来像 derby 不允许在 xmlexists 函数中使用动态参数 https://db.apache.org/derby/docs/10.13/ref/rrefsqlj1083019.html

    【讨论】:

    • 这将是一个有趣的增强。 Derby 是开源的:也许您可以贡献这样的功能!
    猜你喜欢
    • 2021-08-21
    • 2015-08-10
    • 2020-02-22
    • 1970-01-01
    • 2014-05-30
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    相关资源
    最近更新 更多