【问题标题】:Trying to access AS400/DB2 stored procedure from Java with Spring JdbcTemplate尝试使用 Spring JdbcTemplate 从 Java 访问 AS400/DB2 存储过程
【发布时间】:2025-12-19 09:50:11
【问题描述】:

尝试使用 Spring JdbcTemplate 从 Java 访问 AS400/DB2 存储过程,

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.

【问题讨论】:

    标签: java spring db2 jdbctemplate


    【解决方案1】:

    根据iSeries Info Center,SQLCODE -204表示An undefined object or constraint name was detected.

    您可能必须指定您的函数所在的架构。(即,CALL YOUR_SCHEMA.TESTONE(?))。

    如果它在另一个程序中工作(或当您手动查询时),您的架构路径可能设置不同。您可以通过 SELECT CURRENT_SCHEMA FROM SYSIBM.SYSDUMMY1 进行检查(我不确定 SYSIBM.SYSDUMMY1 是否在 iSeries 上,或者虚拟表是否有其他名称......我习惯于 z/OS 或 Linux/Unix/Windows DB2 )。

    【讨论】:

    • 另一个想法可能是您的程序期待某种数据类型进入,而 Spring 将其作为另一种类型发送?在这种情况下,您可以将CAST(? AS type) 添加到您的参数中。有时 DB2 可能对过程中的数据类型很挑剔。