Java使用prepared语句调用用户定义的表函数DB2
我正在用Java 6 EE和DB2开发一个web应用程序。我创建了一个table函数,它接收3个参数并返回一个表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
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.