2014-11-24 51 views
4

我在表達結果遇到了一些意外的錯誤:HSQLDB PreparedStatement的參數類型

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之前/之後的參數類型?反映?

更新:所以,我創建defineParameterType在JDBCPreparedStatement像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!還需要更改結果類型或重新分析查詢。進一步深入研究......

+2

爲什麼你使用'方法setObject()'這是受自動裝箱,而不是更approriate'setBigDecimal()'或'setDouble()'? – 2014-11-24 20:21:23

+1

@a_horse_with_no_name一個有效的問題,但有趣的是'setBigDecimal()'和'setDouble()'產生了相同的結果。 – 2014-11-24 20:43:38

+0

某些數據庫不支持這樣的參數,或者默認值可能是您不需要的數據類型。嘗試添加一個明確的轉換,或者使用帶有一個類型參數的'setObject'。 – 2014-11-25 08:43:18

回答

0

唯一能做的我發現沒有源黑客是

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