2014-06-13 248 views
0

這個問題類似於:Mysql - Stored procedure OUT variable return null,可悲的是他們的解決方案並不適合我。存儲過程返回空

我有一個數據庫填充關於誰使用我的程序和什麼時候的數據,我試圖在MySql中創建一個存儲過程來檢索所有數據並將它發送到我的Java Servlet,它將在那裏處理。

這是我目前對我的存儲過程:

​​

這是我如何調用Java中的查詢:

CallableStatement stmt = null; 
ResultSet rs = null;   
String sqlQuery = "{call getTableData (?, ?, ?, ?)}";  
stmt = conn.prepareCall(sqlQuery); 

    stmt.registerOutParameter(1, java.sql.Types.VARCHAR); 
    stmt.registerOutParameter(2, java.sql.Types.VARCHAR); 
    stmt.registerOutParameter(3, java.sql.Types.VARCHAR); 
    stmt.registerOutParameter(4, java.sql.Types.INTEGER); 

stmt.execute(); 

當我嘗試調用Java中這個存儲過程(我試過使用結果集和普通的getString()等),所有的值都返回null。

我的表設計是沿着線:任何幫助將不勝感激

Request Time (millis), name, lastName, requestID 

1402341252155, John, Doe, 11 

。我覺得問題在於存儲過程本身,特別是我如何從表中選擇變量並將它們分配給「out」參數。

謝謝!

+1

您是否嘗試過prepareQuery而不是prepareCall,只是將它作爲查詢執行,然後處理返回的ResultSet?我一直這樣做,它工作正常。 –

+0

@Tim你應該使用'prepareCall'來執行存儲過程。 –

+0

由於它們沒有參數,所以應該使用'stmt.getXxx(index)'來檢索數據,不要使用'ResultSet'。 –

回答

0

問題是,你從來沒有在你的程序中爲你的輸出參數設置值。修正您的查詢:

SELECT 
    rqTime, name, lastName, requestVar 
INTO 
    time, fName, lName, rVar 
FROM pdata.userlist; 
-- Probably you need a WHERE or another statement to make sure you only retrieve 1 row as result 
-- Otherwise, this stored procedure will fail 

此外,在Java方面,要註冊的輸出參數,並直接從CallableStatement檢索結果,不從ResultSet檢索。

+0

謝謝,這個作品!考慮到我需要一個where語句,有沒有辦法讓我得到整個表格?另外,有沒有辦法讓我從resultSet中檢索它們? – jFram

+0

如果可以的話,使用'PreparedStatement'並直接執行'SELECT'語句。如果您必須使用存儲過程,那麼直接在您的過程中執行'SELECT'語句並從'CallableStatement'中檢索'ResultSet'。 –

+0

我插入了「rs = stmt.getResultSet();」執行語句後,但它給了我一個SQL異常,說結果由多個行組成。 (另外,出於安全目的,我必須使用存儲過程)。 – jFram