2014-11-26 7 views
2

Я разрабатываю веб-приложение с 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"); 

ответ

3

После охоты немного на Google, похоже, может быть, вам нужно, чтобы бросить их к соответствующему типу? Я нашел эту документацию:

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. 

здесь: https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/dialect/DB2Dialect.html

Не уверен, если это необходимо, но может быть стоит идти? Я предполагаю, что это будет выглядеть как cast(? as varchar(30))

Ссылка на кастинг здесь http://www.dbatodba.com/db2/how-to-do/how-to-convert-data-types-on-db2/

+0

Только то, что я искал. благодаря – Jessai

Смежные вопросы