Derby PreparedStatement不会在XMLEXISTS函数中注入参数

时间:2017-09-20 08:42:54

标签: java jdbc prepared-statement derby

尝试使用预准备语句注入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 query expression must be a string literal.

如果语句是在没有预备语句的情况下手动构建的,则该语句会成功。

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

可能是什么原因?

1 个答案:

答案 0 :(得分: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