JDBC中使用Oracle的binary_float和binary_double类型

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

阅读更多
换一批

没有更多推荐了,返回首页