概述
binary_float和binary_double类型是从Oracle10g开始的两个新数据类型,在一定情况下,可以替代原有的number类型使用,具体大家可以去查相关的文档。
但是,由于JDBC jar包存在bug的原因,会出现如下的问题:
解决的办法目前有两种:
1. 使用ojdbc14.jar,和上面帖子中一样,不使用rs.getDouble(("balance"),而是使用(Double)rs.getObject("balance")。
2. 使用ojdbc5.jar或者ojdbc6.jar,直接使用rs.getDouble(("balance"),也不会报错。
当然,按照《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; }
最后
以上就是健壮台灯为你收集整理的oracle的double类型,JDBC中使用Oracle的binary_float和binary_double类型的全部内容,希望文章能够帮你解决oracle的double类型,JDBC中使用Oracle的binary_float和binary_double类型所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复