2017-09-14 164 views
0

此過程在MySQL工作正常,並返回正確的值,但使用JDBC時,它總是返回1Out參數工作在MySQL,但不是在JDBC,總是返回相同的值

在MySQL時,我調用這個過程我行更新時將得到1,否則爲0。

在JDBC不管它總是返回1

我已經試過沒有結果不同的JDBC驅動程序,我也沒有在這裏找到解釋爲什麼它的發生。當然,我們可以爲相同的結果使用不同的代碼,但任何人都可以解釋爲什麼它會發生?

程序

CREATE DEFINER=`root`@`localhost` PROCEDURE `UPDATE_PARTICIPANT`(
IN 
p_id int(11), 
p_first_name VARCHAR(45), 
OUT 
p_suceed INT(11) 
) 
BEGIN 
    UPDATE `appdb`.`participants` 
    SET `id`=p_id, 
    first_name = p_first_name 
    WHERE `id`= p_id; 
    SET p_suceed = ROW_COUNT(); 
END 

JDBC

Connection conn = null; 
    try { 
     conn = 
       DriverManager.getConnection("jdbc:mysql://localhost/appdb?" + 
         "user=root&password=password&serverTimezone=UTC"); 
    } catch (SQLException ex) { 
    } 

    int id = 3; 
    String firstName = "updatedName"; 

    CallableStatement cStmt = conn.prepareCall("{CALL UPDATE_PARTICIPANT(?,?,?)}"); 
    cStmt.setInt(1, id); 
    cStmt.setString(2, firstName); 
    cStmt.registerOutParameter(3,java.sql.Types.INTEGER); 
    cStmt.execute(); 
    int outputValue = cStmt.getInt(3); 
    System.out.println(outputValue); 

感謝。

編輯:

我做了一個簡短的視頻,以更好地ilustrate問題:https://www.youtube.com/watch?v=x_WpngvO8o0&feature=youtu.be 夥計們請關注爲什麼變量MySQL是propertly過去了,但我們不能在JDBC :)

得到它EDIT2:

對於UPDATE語句,默認情況下,受影響的行值是 數 行實際改變。如果在連接到mysqld時指定CLIENT_FOUND_ROWS標誌爲 mysql_real_connect(),受影響的行值爲 「found」行數;即通過WHERE子句進行匹配。

這可能是原因,默認情況下,JDBC驅動程序具有此功能。

+0

*無關:* SET' id' = p_id WHERE'id' = p_id''的要點是什麼? – Andreas

+0

即使這不是你所問的:你可以用''UPDATE appdb.participants SET id =?,first_name =?WHERE id =?「'準備語句來執行'executeUpdate()行計數作爲返回值。 –

+0

@Andreas它只是增加了更新更新「參與者」的ID的選項 – 0001

回答

0

這可能是原因,默認情況下,JDBC驅動程序啓用了[CLIENT_FOUND_ROWS]。

這是正確的。根據MySQL Connector/J開發小組對JDBC規範的解釋,UPDATE語句應該返回匹配的的行數,而不是行數實際更改的

如果我們希望ROW_COUNT(),以反映實際改變行數,然後我們需要包括參數

useAffectedRows=true 
在我們的JDBC連接URL

相關問題