繁体   English   中英

H2用户定义的函数org.h2.jdbc.JdbcSQLException非十六进制字符错误

[英]H2 user-defined-function org.h2.jdbc.JdbcSQLException non-hex character error

尝试将List<String>传递给H2用户定义的函数时,出现以下错误:

[{call MY_USER_DEFINED_FUNCTION(?)}]; SQL state 
[90004]; error code [90004]; Hexadecimal string contains non-hex character: 
"[ABCD, EFGH]"; SQL statement:
call MY_USER_DEFINED_FUNCTION(?)  [90004-192]; nested 
exception is org.h2.jdbc.JdbcSQLException: Hexadecimal string contains non-
hex character: "[1234, 5678]"; SQL statement:
call MY_USER_DEFINED_FUNCTION(?)  [90004-192]

如日志中的片段所示,该列表包含两个字符串:“ ABCD”和“ EFGH”。 我试图将这些值传递给SQL语句的IN子句。 用户定义的功能如下所示:

CREATE ALIAS MY_USER_DEFINED_FUNCTION AS
'
java.sql.ResultSet getTableContent(java.sql.Connection con, List<String> idList) throws Exception {
final PreparedStatement statement = con.prepareStatement("SELECT * FROM MY_TABLE WHERE id IN (?)");

String ids[] = new String[idList.size()];
idList.toArray(ids);
statement.setArray(1, con.createArrayOf("text", ids));

java.sql.ResultSet rs = statement.executeQuery();
return rs;
}'

用户定义的函数是从DAO方法中调用的。 我正在使用Spring来管理数据库连接,这是调用方法的片段:

public List<MyObject> getMyObjects(final List<String> idList) {

    Map<String, Object> params = new HashMap<>();

    params.put("idList", idList);
    // Execute stored procedure
    Map<String, Object> output = super.execute(params);
    // Collect stored procedure results into list
    List<MyObject> myObjectList = (List<MyObject>) output.get("myResultSet");

    return myObjectList;
}

我还尝试传递一个数组,并在准备好的语句上使用setObject -引发相同的错误。 当传递单个字符串并在准备好的语句上调用setString时,我能够使用户定义的函数返回,但似乎无法将多个字符串传递给SQL语句的IN子句。

有什么想法为什么要抛出?

解决了:

Types.VARCHAR输入参数类型声明为Types.VARCHAR ,更改为Types.JAVA_OBJECT并解决了十六进制字符问题:

StoredProcedure.declareParameter(new SqlParameter("idList", Types.JAVA_OBJECT));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM