hsqldb PreparedStatement 参数类型

Posted

技术标签:

【中文标题】hsqldb PreparedStatement 参数类型【英文标题】:hsqldb PreparedStatement parameters types 【发布时间】:2014-11-24 20:14:22 【问题描述】:

我在表达式结果中遇到了一些意外错误:

  conn = DriverManager.getConnection("jdbc:hsqldb:mem:test;sql.syntax_ora=true", null);
  stmt = conn.prepareStatement("select ? * ? * ? from dual");
  stmt.setObject(1, 1000000.00);
  stmt.setObject(2, 0.01);
  stmt.setObject(3, 3.45); // setDouble no difference
  rs = stmt.executeQuery();
  rs.next();
  System.out.println(rs.getObject(1));

你可以试试,结果是0! 为什么?因为 hsqldb 驱动程序将默认参数类型设置为 int。 0.01 在 JDBCPreparedStatement.java 中转换为 0:4257 o = outType.convertToDefaultType(session, o);

如何在 jdbc 中的 prepareStatement 之前/之后更改参数类型?反映?

更新:所以,我在 JDBCPreparedStatement 中创建了 defineParameterType,就像在 OraclePreparedStatement 中一样

public void defineParameterType(int index, int type)

  if(index <= 0 || index > parameterTypes.length)
    throw new IndexOutOfBoundsException();

  Type newType = Type.getDefaultTypeWithSize(type);

  if(newType != null)
    parameterTypes[index - 1] = newType;

但是,它仍然返回 0!还需要更改结果类型或重新解析查询。进一步挖掘......

【问题讨论】:

你为什么使用setObject(),它会自动装箱而不是更合适的setBigDecimal()setDouble() @a_horse_with_no_name 一个有效的问题,但有趣的是,setBigDecimal()setDouble() 产生了相同的结果。 有些数据库不支持这样的参数,或者默认的可能是你不想要的数据类型。尝试添加显式转换,或使用带有类型参数的setObject 标记,“select CAST(? AS DOUBLE) * CAST(? AS DOUBLE) * CAST(? AS DOUBLE) from dual”正常工作。 请将解决方案作为答案发布并接受。 【参考方案1】:

我发现的唯一解决方案是没有源代码破解

select CAST(? AS DOUBLE) * CAST(? AS DOUBLE) * CAST(? AS DOUBLE) from dual

【讨论】:

以上是关于hsqldb PreparedStatement 参数类型的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat - HSQLDB

HSQLDB 神秘异常消息:“不支持功能”

HSQLDB 语句和 Java NaN 双打

在 HSQLDB 中选择 100+ 百万行

HSQLDB 2.3 和参数绑定问题

使用语句在表中插入java字节数组