Java使用prepared语句调用用户定义的表函数DB2

Java使用prepared语句调用用户定义的表函数DB2,java,db2,prepared-statement,user-defined-functions,Java,Db2,Prepared Statement,User Defined Functions,我正在用Java 6 EE和DB2开发一个web应用程序。我创建了一个table函数,它接收3个参数并返回一个表 CREATE FUNCTION MY_FUNCTION (PARAM1 VARCHAR(5), PARAM2 VARCHAR(10), PARAM3 INTEGER) RETURNS TABLE ( FIELD1 VARHCHAR(5), FIELD2 VARCHAR(10), FIELD3 INTEGER ) RETURN SELECT FIELD1, F

我正在用Java 6 EE和DB2开发一个web应用程序。我创建了一个table函数,它接收3个参数并返回一个表

CREATE FUNCTION MY_FUNCTION (PARAM1 VARCHAR(5), PARAM2 VARCHAR(10), PARAM3 INTEGER)
RETURNS TABLE (
    FIELD1 VARHCHAR(5),
    FIELD2 VARCHAR(10),
    FIELD3 INTEGER
)
RETURN 
SELECT FIELD1, FIELD2, FIELD3 
FROM TABLE_1 WHERE FIELD1 = PARAM1 || '_MAIN' 
AND FIELD2 = PARAM2 || '_MAIL' AND FIELD3 = PARAM3 + 47
我正在尝试用Java执行一个函数,准备语句如下(使用通配符):

但是当我运行代码时,我在准备好的语句中得到了一个SQLSyntaxErrorException:

java.sql.SQLSyntaxErrorException: [SQL0418] A statement contains a use of a parameter marker that is not valid
       at com.ibm.as400.access.JDError.createSQLExceptionSubClass(JDError.java:828)
       at com.ibm.as400.access.JDError.throwSQLException(JDError.java:699)
       at com.ibm.as400.access.JDError.throwSQLException(JDError.java:669)
       at com.ibm.as400.access.AS400JDBCStatement.commonPrepare(AS400JDBCStatement.java:1660)
       at com.ibm.as400.access.AS400JDBCPreparedStatement.<init>(AS400JDBCPreparedStatement.java:248)
       at com.ibm.as400.access.AS400JDBCCallableStatement.<init>(AS400JDBCCallableStatement.java:120)
       at com.ibm.as400.access.AS400JDBCConnection.prepareCall(AS400JDBCConnection.java:1840)
       at com.ibm.as400.access.AS400JDBCConnection.prepareCall(AS400JDBCConnection.java:1741)
我想要实现的是使用通配符调用函数,以改进函数的处理

提前谢谢

带有@user384842答案的解决方案

PreparedStatement stmt = conn.prepareStatement("SELECT * FROM TABLE(MY_FUNCTION(cast(? as VARCHAR(5)), cast(? as VARCHAR(10)), cast(? as INTEGER))) AS TABLE");

在谷歌上搜索了一下之后,看起来你需要将它们转换成合适的类型?我发现了以下文档:

requiresCastingOfParametersInSelectClause() 
DB2 in fact does require that parameters appearing in the select clause be wrapped in cast() calls to tell the DB parser the type of the select value.
在这里:

不确定是否相关,但可能值得一试?我猜它看起来像是
cast(?as varchar(30))


这里有关于演员的链接

正是我想要的。谢谢
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM TABLE(MY_FUNCTION(cast(? as VARCHAR(5)), cast(? as VARCHAR(10)), cast(? as INTEGER))) AS TABLE");
requiresCastingOfParametersInSelectClause() 
DB2 in fact does require that parameters appearing in the select clause be wrapped in cast() calls to tell the DB parser the type of the select value.