Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.sql.SQLException:参数编号X不是OUT参数_Java_Mysql_Stored Procedures - Fatal编程技术网

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

java.sql.SQLException:参数编号X不是OUT参数,java,mysql,stored-procedures,Java,Mysql,Stored Procedures,我正在努力从MySQL存储过程中获取结果变量。我得到以下错误: java.sql.SQLException: Parameter number 3 is not an OUT parameter 存储过程如下所示: CREATE DEFINER=`cv_admin`@`localhost` PROCEDURE `CheckGameEligibility`( IN gID INT(10), IN uID INT(10), OUT result TINYINT(1) ) BEG

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

java.sql.SQLException: Parameter number 3 is not an OUT parameter
存储过程如下所示:

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 
My java函数接受字符串数组*并动态创建CallableStatement对象:

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 ;
}
有什么问题吗


提前谢谢

以下是关于如何从jdbc调用存储过程的教程:
sql格式与您的不同。

我不确定为什么Java或MySQL Java驱动程序不喜欢这种语法,但您是否考虑过将过程创建为返回TINYINT的函数?

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

我也遇到了同样的问题,但我按照Anthony的建议修复了检查语法的问题,我发现我在使用驼峰式约定调用存储过程,例如:addPament,它在数据库中存储为addPament,因此我相信mysql没有找到存储过程。

我的代码略有不同

CallableStatement statement = connection.prepareCall("{? = call nextOperatorTransactionId()}");
statement.registerOutParameter(1, Types.BIGINT);
statement.execute();
id.set(statement.getLong(1));

注意括号,在我的例子中是?在句子的开头。没有使用括号,我得到了与您相同的异常

尝试调用checkgamequality?而不是检查游戏资格?。在同样的情况下,它对我也有帮助。

当您指定的过程名称与数据库中的实际过程不同时,我的sql会给出这个不相关的异常。

谢谢,但问题不在于我在代码的其他部分调用存储过程,而在于使用callablestatement调用带有返回变量的存储过程:是,我创建它的原因如上所述,是因为我想我会有更多的带有返回变量的存储过程,所以对我来说,尝试创建一个通用函数来包装调用是有意义的,如果你知道我的意思的话?我得到了同样的错误,因为该过程在数据库中不存在
CallableStatement statement = connection.prepareCall("{? = call nextOperatorTransactionId()}");
statement.registerOutParameter(1, Types.BIGINT);
statement.execute();
id.set(statement.getLong(1));