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 参数类型的主要内容,如果未能解决你的问题,请参考以下文章