簡體   English   中英

java.sql.SQLException: 參數號 X 不是 OUT 參數

[英]java.sql.SQLException: Parameter number X is not an OUT parameter

我正在努力從 MySQL 存儲過程中獲取結果 OUT 變量。 我收到以下錯誤:

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 

我的 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 ;
}

*) 我想我應該使用 int 數組而不是字符串數組,但這似乎不是錯誤消息的內容。

無論如何,這是它生成的輸出:

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)

任何想法可能是什么問題? :)

提前致謝!

我的代碼略有不同

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

注意括號,在我的情況下是 ? 在句子的開頭。 不使用括號,我得到了和你一樣的例外

嘗試call CheckGameEligibility(?, ?, ?)而不是CheckGameEligibility(?, ?, ?) 它在同樣的情況下幫助了我。

我不確定為什么 Java 或 Java 的 MySQL 驅動程序不喜歡這種語法,但是您是否考慮過將過程創建為返回RETURNS TINYINTFUNCTION

我也剛收到這個異常,我發現這只是我在構造 CALL 字符串時犯的一個愚蠢的小語法錯誤。 仔細檢查您的語法是否正確。

對我來說同樣的問題,但我按照 Anthony 的建議修復了檢查語法,我發現我正在使用駱駝大小寫約定調用存儲過程,例如:addPaiment 並且在數據庫中它存儲為 ADDPAIMENT 所以我相信 mysql 沒有找到存儲過程。

當您指定的過程名稱與 db 中存在的實際過程不同時,我的 sql 會給出此無關的異常。

這是關於如何從 jdbc 調用存儲過程的教程:
http://java.sun.com/docs/books/tutorial/jdbc/basics/sql.html
sql 格式和你的不一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM