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

<think>我们正在处理的问题是:Java中的BigDecimal在Oracle数据库中对应什么类型?首先,需要明确Java的BigDecimal类用于高精度的十进制运算,通常用于财务计算等需要精确小数点的场景。在Oracle数据库中,最匹配的数据类型是NUMBER。NUMBER类型可以指定精度(总位数)小数位数(小数点后的位数),这与BigDecimal的用法相似。具体对应关系:-Java的BigDecimal可以映射到Oracle的NUMBER类型。 -例如,在创建表时,可以定义列为NUMBER(p,s),其中p是总位数,s是小数位数。另外,如果数值范围特别大,也可以考虑使用OracleFLOATBINARY_DOUBLE,但这两种是浮点数类型,可能不适用于需要精确计算的场景。因此,通常推荐使用NUMBER。因此,回答如下:在Oracle数据库中,Java的BigDecimal通常对应NUMBER类型。该类型支持高精度的十进制数字存储,可指定精度标度(小数位数),适用于财务等精确计算场景。接下来,根据规则需要提出3-5个相关问题,以“§§相关问题§§”开头,然后列出问题。可能的相关问题:1.在Oracle中,NUMBER类型的精度标度如何定义?2.除了NUMBER,Oracle还有哪些数据类型可以存储小数?3.在Java中如何将BigDecimal正确存储到Oracle的NUMBER列?4.使用JDBC操作Oracle的NUMBER类型时需要注意什么?5.在Oracle中,NUMBER类型与Java的整数类型(如Integer)如何对应?注意:问题数量在3到5个之间,这里选择4个。最终输出格式:回答内容§§相关问题§§1....2....3....4....</think>在Oracle数据库中,Java的 `BigDecimal` 类型对应 **`NUMBER` 数据类型**。具体说明如下: 1. **精度匹配** `NUMBER(p, s)` 可精确指定: - `p`:总位数(1-38) - `s`:小数位数(负数表示舍入到整数位) 例如 `NUMBER(15,2)` 对应最多15位数字(含2位小数)。 2. **存储范围** - 最大支持38位精度(`NUMBER(38)`) - 可存储范围:$-10^{125}$ 到 $10^{125}$ 3. **JDBC映射** 在JDBC操作中: ```java PreparedStatement.setBigDecimal(index, bigDecimalVal); // Java → Oracle ResultSet.getBigDecimal("column_name"); // Oracle → Java ``` 4. **替代方案** 若需更高性能(牺牲精度): - `BINARY_FLOAT` → Java `Float` - `BINARY_DOUBLE` → Java `Double`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值