2017-09-14 6 views
0

を返していないこの手順では、MySQLでは正常に動作し、適切な値を返しますが、JDBCを使用しているとき、私は私、このプロシージャを呼び出すとき、それは常にMySQLでは1のMySQLで動作しますが、JDBCで、常に同じ値に

を返します。行が更新されたときに1を、更新されないときに0を取得します。なぜその出来事

に関係なく、私がいない結果と異なるJDBCドライバを試してみた。1.

それは常に返し何JDBCで

は、私はまた、ここでの説明を見つけることができませんでした。もちろん、同じ結果に対して異なるコードを使用することもできますが、誰でもその理由を説明できますか?

PROCEDURE

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); 

感謝。

EDIT:

私はより良いilustrate問題への短いビデオを作った:https://www.youtube.com/watch?v=x_WpngvO8o0&feature=youtu.be Guysはpropertly渡される理由を変数MySQLでに焦点を当ててください、私たちは、JDBCでそれを得ることはできません:)

EDIT2:UPDATE文については

、デフォルトで影響を受けた、行の値が実際に変更さ 行の 数です。 mysqldに接続するときにCLIENT_FOUND_ROWSフラグを mysql_real_connect()に指定した場合、影響を受けた行の値は です。つまり、WHERE句でマッチします。

これが原因で、デフォルトではJDBCドライバにこれがあります。

+0

*無関係:* '' SET '' id = p_id WHERE 'id' = p_id''のポイントは何ですか? – Andreas

+0

これはあなたが求めていないものであっても、あなたは単に 'executeUpdate()'を実行して、 '' UPDATE appdb.participants SET id =?、first_name =?WHERE id =?戻り値としての行数。 –

+0

@Andreas更新された「参加者」のIDを更新するオプションを追加するだけです – 0001

答えて

0

これが原因である可能性があります。デフォルトでは、JDBCドライバは[CLIENT_FOUND_ROWS]をオンにしています。

これは間違いありません。 JDBC仕様のMySQL Connector/J開発チームの解釈によると、UPDATEステートメントはと一致するの行数を実際に変更された行数ではなく文番号で返します。実際を変更行の数を反映する

我々は(ROW_COUNTをしたい場合は)それから、私たちは私たちのJDBC接続URLで

useAffectedRows=true 

パラメータを含める必要があります。

関連する問題