首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java.sql.SQLException:参数编号X不是OUT参数

java.sql.SQLException:参数编号X不是OUT参数
EN

Stack Overflow用户
提问于 2010-06-11 03:52:12
回答 7查看 13.6K关注 0票数 1

我正在努力从MySQL存储过程中获取结果OUT变量。我得到以下错误:

代码语言:javascript
运行
复制
java.sql.SQLException: Parameter number 3 is not an OUT parameter

存储过程如下所示:

代码语言:javascript
运行
复制
CREATE DEFINER=`cv_admin`@`localhost` PROCEDURE `CheckGameEligibility`(
   IN gID INT(10),
   IN uID INT(10),

   OUT result TINYINT(1)
)
BEGIN
    # Do lots of stuff, then eventually:
    SET result = 1;
END 

我的java函数接受一个字符串数组*并动态创建CallableStatement对象:

代码语言:javascript
运行
复制
public static int callAndReturnResult( String sql , String[] values )
{
    int out = 0 ;
    try
    {
        // construct the SQL. Creates: CheckGameEligibility(?, ?, ?)
        sql += "(" ;

        for( int i = 0 ; i < values.length ; i++ )
        {
            sql += "?, " ;
        }
        sql += "?)" ;

        System.out.println( "callAndReturnResult("+sql+"): constructed SQL: " + sql );

        // Then the statement
        CallableStatement cstmt = DB.prepareCall( sql );
        for( int i = 0 ; i < values.length ; i++ )
        {
            System.out.println( "   " + (i+1) + ": " + values[ i ] ) ;
            cstmt.setString(i+1, values[ i ] );
        }

        System.out.println( "   " + (values.length+1) + ": ? (OUT)" ) ;
        cstmt.registerOutParameter( values.length + 1 , Types.TINYINT );
        cstmt.execute();

        out = cstmt.getInt( values.length );
        cstmt.close();
    }
    catch( Exception e )
    {
        System.out.println( "*** db trouble: callAndReturnResult(" + sql + " failed: " + e );
        e.printStackTrace() ;
    }
    return out ;
}

*)我想我应该使用int数组而不是字符串数组,但这似乎不是错误消息的内容。

无论如何,下面是它生成的输出:

代码语言:javascript
运行
复制
callAndReturnResult(CheckGameEligibility(?, ?, ?)): constructed SQL: CheckGameEligibility(?, ?, ?)
1: 57
2: 29
3: ? (OUT)
*** db trouble: callAndReturnResult(CheckGameEligibility(?, ?, ?) failed: java.sql.SQLException: Parameter number 3 is not an OUT parameter
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929)
    at com.mysql.jdbc.CallableStatement.checkIsOutputParam(CallableStatement.java:692)
    at com.mysql.jdbc.CallableStatement.registerOutParameter(CallableStatement.java:1847)
    at org.apache.commons.dbcp.DelegatingCallableStatement.registerOutParameter(DelegatingCallabl>eStatement.java:92)
    at Tools.callAndReturnResult(Tools.java:156)

你知道问题出在哪里吗?:)

提前感谢!

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-12-18 00:27:25

我的代码略有不同

代码语言:javascript
运行
复制
CallableStatement statement = connection.prepareCall("{? = call nextOperatorTransactionId()}");
statement.registerOutParameter(1, Types.BIGINT);
statement.execute();
id.set(statement.getLong(1));

注意方括号,在我的例子中是?在句子的开头。如果不使用括号,我得到的异常与您的相同

票数 1
EN

Stack Overflow用户

发布于 2010-06-11 04:06:49

我不知道为什么Java或用于Java的MySQL驱动程序不喜欢这种语法,但是您是否考虑过将过程创建为RETURNS TINYINTFUNCTION

票数 0
EN

Stack Overflow用户

发布于 2010-06-19 04:46:29

我也遇到了这个异常,我发现这只是我在构造调用字符串时犯下的一个愚蠢的小语法错误。仔细检查您的语法是否正确。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3017934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档