binary_float和binary_double类型是从Oracle10g开始的两个新数据类型,在一定情况下,可以替代原有的number类型使用,具体大家可以去查相关的文档。
这是Oracle11g对新数据类型的说明:http://download.oracle.com/docs/cd/B28359_01/java.111/b31224/oraint.htm
但是,由于JDBC jar包存在bug的原因,会出现如下的问题:
http://forums.oracle.com/forums/thread.jspa?threadID=437945
解决的办法目前有两种:
1. 使用ojdbc14.jar,和上面帖子中一样,不使用rs.getDouble(("balance"),而是使用(Double)rs.getObject("balance")。
2. 使用ojdbc5.jar或者ojdbc6.jar,直接使用rs.getDouble(("balance"),也不会报错。
ojdbc5.jar和ojdbc6.jar的下载地址是:http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html
当然,按照《Java解惑》的建议,在需要精确计算的地方(如货币计算),应该使用int、long或者BigDecimal,所以我在这里贴一段示例代码:
@Override
public int withdrawMoney(String accNum, int pwd, double balance)
throws Exception {
// TODO Auto-generated method stub
String sql = "select a.balance from t_accout a where a.accnum = ? and a.pwd = ?";
int result = -1;
Connection conn = null;
PreparedStatement pstm = null;
ResultSet rs = null;
try {
conn = getConn();
pstm = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
pstm.setString(1, accNum);
pstm.setInt(2, pwd);
rs = pstm.executeQuery();
if(rs.next()) {
//如果成立,则说明找到了数据;
// 使用ojdbc14.jar的情况
// double temp = (Double)rs.getObject("balance");
// 使用ojdbc6.jar的情况
// double temp = rs.getDouble("balance");
// 这里需要注意,由于double类型精度不高,所以需要使用BigDecimal类来进行操作
BigDecimal temp = rs.getBigDecimal("balance");
//判断当前是帐户的余额是否大于所要取的数量
if(balance > temp.doubleValue()) {
result = 0; //表示余额不足
} else {
//表示余额足够,则做更新
// 这里需要注意,由于double类型精度不高,所以需要使用BigDecimal类来进行操作,具体可以参考《Java解惑》谜题2:找零时刻;但是与书中所说不同的是:这里我使用了new BigDecimal(double),但是并没有出现他所说的问题。
rs.updateDouble("balance", temp.subtract(new BigDecimal(balance)).doubleValue());
rs.updateRow(); //在线更新
result = 1;
}
} else {
result = -1; //表示没有找到数据,也就是帐号或密码出错.
}
} catch (Exception e) {
e.printStackTrace();
} finally {
releaseAll(conn, pstm, null);
}
return result;
}