Hsqldb PreparedStatement parameter types

I ran into some unexpected error in the expression:

  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));

You can try, the result is 0! What for? Because the hsqldb driver sets the default parameter type for int. 0.01 converted to 0 in JDBCPreparedStatement.java: 4257 o = outType.convertToDefaultType (session, o);

How to change parameter type before / after prepareStatement in jdbc? reflect?

Update: So, I create defineParameterType in JDBCPreparedStatement, as in 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;
}

But it still returns 0! You must also change the result type or reprocessing request. More details ...

+4
source share
1 answer

, ,

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

All Articles