hsqldb PreparedStatement参数类型

时间:2014-11-24 20:14:22

标签: java jdbc hsqldb

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

  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!还需要更改结果类型或重新分析查询。进一步挖掘......

1 个答案:

答案 0 :(得分:0)

我找到的没有源黑客攻击的解决方案是

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