Попытка получить доступ к хранимой процедуре AS400 / DB2 из Java с помощью Spring JdbcTemplate

Попытка получить доступ к хранимой процедуре AS400 / DB2 из Java с помощью Spring JdbcTemplate,

XmlBeanFactory beanFactory2 = new XmlBeanFactory(new ClassPathResource(
                "datasource_as400.xml"));
        DataSource ds2 = (DataSource) beanFactory2.getBean("dataSource");

        jdbc2 = new JdbcTemplate(ds2);

        jdbc2.update("{CALL TESTONE(?)}", new Object[] { new String("JOHN") });

и я получаю следующую ошибку

[DEBUG,SQLErrorCodeSQLExceptionTranslator] Translating SQLException with SQL state '42704', error code '-204', message [[SQL0204] TESTONE in  type *N not found.]; SQL was [{CALL TESTONE(?)}] for task [PreparedStatementCallback]
[FATAL,MainBatch] processDonations(): org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [{CALL TESTONE(?)}]; nested exception is java.sql.SQLException: [SQL0204] TESTONE in  type *N not found.

person SJS    schedule 14.03.2012    source источник


Ответы (1)


По данным Информационного центра iSeries, SQLCODE -204 означает An undefined object or constraint name was detected.

Возможно, вам придется указать схему, в которой находится ваша функция. (I.E., CALL YOUR_SCHEMA.TESTONE(?)).

Если он работает в другой программе (или когда вы запрашиваете вручную), ваш путь к схеме может быть установлен по-другому. Вы можете проверить, выполнив SELECT CURRENT_SCHEMA FROM SYSIBM.SYSDUMMY1 (я не уверен, что SYSIBM.SYSDUMMY1 на iSeries, или есть другое имя для фиктивной таблицы ... Я привык к z / OS или Linux / Unix / Windows DB2).

person bhamby    schedule 14.03.2012
comment
Другая идея: возможно, ваша процедура ожидает поступления определенного типа данных, а Spring отправляет его как другой тип? В этом случае вы можете добавить CAST(? AS type) к своему параметру. Иногда DB2 может придирчиво относиться к типам данных в процедурах. - person bhamby; 15.03.2012