java - MySQL CallableStatement.getObject 具有不一致的行为

标签 java mysql jdbc callable-statement out-parameters

我在开发系统上的一个 MySQL 实例中的测试模式 _test_jdbc_inconsistency 中定义了以下简单过程

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 语句中标记了不一致;在调用接受参数索引的 CallableStatement.getObject 的重载时返回预期类型 (java.lang.Integer) 的结果,另一个接受参数名的重载返回java.lang.Long 类型的结果不一致。由于我使用的是带符号的整数,并且基于许多关于在 JDBC 中使用 out 参数 的说明,特别是 MySQL documentation 提供的说明。 ,这个过程似乎是正确的,这看起来像一个不一致的行为

其他人可以确认这个问题吗?

我的环境:

  • Windows 8.1 x64
  • JDK 1.8.0_45 (x64/x86)
  • MySQL 连接器/J 5.1.34
  • MySQL 服务器 5.6.24
  • TestNG 6.9.5

最佳答案

由于没有评论或回复,我将此报告给 MySQL 错误数据库,它已被接受并验证为错误。 以下是感兴趣的人的问题链接:

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

关于java - MySQL CallableStatement.getObject 具有不一致的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31231298/

相关文章:

java - 如何在 Java 中序列化 AttributedString?

mysql - 更改订单输出,使用 if 或其他

mysql - 外键更新时不更新时间戳

java - 使用 gzip 压缩 InputStream

java - 如何增加一个新类型而不需要修改工厂类?

java - 替换数组中的字符串,其中字符串的部分是 int

mysql - 关于MYSQL外键和孤行的问题

java - spring 存储 prod 返回值

java - JDBC executeBatch() 在 PostgreSQL 中无错误地挂起

java - 如何从任意位置使用 JDBC 驱动程序