0

我正在从我的 Java 应用程序调用存储过程,并在设置输入参数时收到以下错误。

1:调用程序的Java方法:

public int callProc(String userid, String program_id, String procName)
        throws SQLException {

    int returnCode = -1;

    try {

        CallableStatement stmt;

        String sql = "CALL " + procName + "(?,?,?,?,?)";
        stmt = connection.prepareCall(sql);

        System.out.println("Calling stored procedure [" + procName + "]");

        // call setXXX() method to set values for input parameters
        // and input-output parameters
        System.out.println("jdbcadapter->callproc setting 1 parameter "+stmt);
        stmt.setObject(1, userid, java.sql.Types.CHAR);
        System.out.println("jdbcadapter->callproc setting 2 parameter "+sql);
        stmt.setObject(2, program_id, java.sql.Types.CHAR);
        System.out.println("jdbcadapter->callproc setting 3 parameter "+sql);
        stmt.setObject(3, session_id, java.sql.Types.CHAR);
        System.out.println("jdbcadapter->callproc setting 4 parameter "+sql);
        stmt.setObject(4, " ", java.sql.Types.CHAR);
        System.out.println("jdbcadapter->callproc setting 5 parameter "+sql);
        stmt.setObject(5, " ", java.sql.Types.CHAR);
        System.out.println("jdbcadapter->callproc setting 6 parameter "+sql);
        // call registerOutParameter() method to define the data types for output parameters
        stmt.registerOutParameter(4, java.sql.Types.CHAR); // rc
        System.out.println("jdbcadapter->callproc setting 7 parameter "+sql);
        stmt.registerOutParameter(5, java.sql.Types.CHAR); // result message
        System.out.println("jdbcadapter->callproc setting 8 parameter "+sql);

        stmt.execute();
        System.out.println("jdbcadapter->callproc after execute "+sql);

        String rc = stmt.getString(4);
        System.out.println("jdbcadapter->callproc after execute "+rc);
        String message = stmt.getString(5);
        System.out.println("jdbcadapter->callproc after execute "+message);
        Integer return_code = new Integer(rc.trim());
        System.out.println("jdbcadapter->callproc after execute "+return_code);
        returnCode = return_code.intValue();
        System.out.println("jdbcadapter->callproc after execute "+returnCode);
        return_message = message.trim();
        System.out.println("jdbcadapter->callproc after execute "+return_message);
        System.out.println("Returned code from stored procedure is ["+ rc.trim() + "]");
        stmt.close();

    } catch (Exception e) {
        throw ((SQLException) e);
    }

    return returnCode;

} // end callProc()

在 stmt 中设置 USER ID 时出现问题

stmt.setObject(1, userid, java.sql.Types.CHAR);

数据库端存储过程的定义

CREATE PROCEDURE "CDR     "."SPUBASE"
                (
                IN      USERID   CHARACTER(12),
                IN      PROGRAM_ID   CHARACTER(20),
                IN      SESSION_ID   CHARACTER(27),
                OUT     SQLCODE   CHARACTER(254),
                OUT     SQLMESSAGE   CHARACTER(254)
                )
                DYNAMIC RESULT SETS 0
                SPECIFIC SQL040816123726847
                EXTERNAL NAME '/cdrtst/sqllib/function/SPUBASE!SPUBASE'
                LANGUAGE C
                PARAMETER STYLE DB2DARI
                NOT DETERMINISTIC
                FENCED NOT THREADSAFE
                MODIFIES SQL DATA
                NO DBINFO;

错误是

SQLException: DB2 SQL Error: SQLCODE=-440, SQLSTATE=42884, SQLERRMC=SPUBASE;PROCEDURE, DRIVER=4.1.85 

任何人都可以提出可能导致这种情况的原因。

4

1 回答 1

1

从this page解释原因SQLCODE: -440,其中一个原因是

例程引用中包含正确数量的参数,但一个或多个参数的数据类型不正确。

我怀疑您的以下方法调用

stmt.setObject(1, userid, java.sql.Types.CHAR);

应该替换为

stmt.setString(1, userid);

或者

stmt.setObject(1, userid, java.sql.Types.VARCHAR);

我更喜欢前者,即 setString 并将其留给驱动程序根据底层 DB/列进行适当的转换。

这同样适用于其他statement.set*方法,调用适当的 set* 方法,如 setString、setInt 等,

于 2012-09-27T05:21:50.480 回答