Я разрабатываю веб-приложение с Java 6 EE и DB2. Я создал функцию таблицы, которая получает 3 параметра и возвращает таблицу.Java call User Defined Table Function DB2 с подготовленным оператором
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 с подготовленным заявлением следующим образом (с использованием подстановочных знаки):
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM TABLE(MY_FUNCTION(?, ?, ?)) AS TABLE");
Но когда я запускаю мой код, я получаю 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)
Примечание: Если я жёстко параметры, как это (без wilcards) работает:
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM TABLE(MY_FUNCTION('" + var1 + "', '" + var2 + "', '" + var3 + "')) AS TABLE");
Я хочу достичь , чтобы вызвать функции с помощью подстановочных знаков, чтобы улучшить обработку функции.
Заранее спасибо
Решение с @ user384842 ответить
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM TABLE(MY_FUNCTION(cast(? as VARCHAR(5)), cast(? as VARCHAR(10)), cast(? as INTEGER))) AS TABLE");
Только то, что я искал. благодаря – Jessai