1

_test_jdbc_inconsistency開発システムの MySQL のインスタンスで、次の簡単な手順をテスト スキーマ内で定義しています。

CREATE PROCEDURE _test_jdbc_inconsistency.proc(IN param1 boolean, OUT param2 boolean)
BEGIN
  IF (param1 IS NULL)
  THEN
    SET param2 = NULL;
  ELSE
    set param2 = not param1;
  END IF;
END

しかし、驚いたことに、次の簡単なテストは失敗します

@Test(dataProvider = "connectionPool")
public void testJdbcInconsitencyOutParameterType(Connection con) throws SQLException, IOException
{
    con.setCatalog("_test_jdbc_inconsistency");
    try (CallableStatement statement = con.prepareCall("{call proc(?, ?)}"))
    {
        statement.setInt("param1", 5);
        statement.registerOutParameter("param2", Types.INTEGER);
        statement.execute();

        assertTrue(statement.getObject(2) instanceof Integer);
        assertEquals(statement.getObject(2), 25);
        assertTrue(statement.getObject("param2") instanceof Integer);
    }
}

矛盾は最後のassertTrueステートメントでフラグが立てられます。parameter-index を受け入れるのオーバーロードを呼び出すと、CallableStatement.getObject期待される型 ( java.lang.Integer) の結果が返されますが、 parameter-name を受け入れる他のオーバーロードは、一貫性のない type の結果を返しますjava.lang.Long。私は符号付き整数を使用しており、JDBC でのout パラメータの使用に関する多くの指示、特にMySQL のドキュメントで提供されているものに基づいているため、プロセスは正しいように見え、これは一貫性のない動作のように見えます。

他の誰かがこの問題を確認できますか?

私の環境:

  • Windows 8.1 x64
  • JDK 1.8.0_45 (x64/x86)
  • MySQL コネクタ/J 5.1.34
  • MySQL サーバー 5.6.24
  • テストNG 6.9.5
4

1 に答える 1

0

コメントも応答もなかったので、これを MySQL バグ データベースに報告し、バグとして受け入れられ、検証されました。興味のある人のための問題へのリンクは次のとおりです。

https://bugs.mysql.com/?id=77766

于 2015-07-26T14:46:09.493 に答える