You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle ResultSet调用getBoolean()获取NUMBER列返回值的疑问

Oracle NUMBER类型列调用ResultSet.getBoolean()的返回值分析

环境说明

  • Java版本:8
  • JDBC驱动:com.oracle.database.jdbc:ojdbc6:11.2.0.4
  • Oracle数据库:11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

源码逻辑拆解

以下是oracle.jdbc.driver.NumberCommonAccessor#getBoolean的核心源码:

boolean getBoolean(int var1) throws SQLException {
    boolean var2 = false;
    if (this.rowSpaceIndicator == null) {
        SQLException var6 = DatabaseError.createSqlException(this.getConnectionDuringExceptionHandling(), 21);
        var6.fillInStackTrace();
        throw var6;
    } else {
        if (this.rowSpaceIndicator[this.indicatorIndex + var1] != -1) {
            byte[] var3 = this.rowSpaceByte;
            int var4 = this.columnIndex + this.byteLength * var1 + 1;
            byte var5 = var3[var4 - 1];
            var2 = var5 != 1 || var3[var4] != -128;
        }

        return var2;
    }
}

逐逻辑解析:

  1. 默认返回值为false。
  2. 若rowSpaceIndicator为空,直接抛出SQLException(错误码21,对应无效行状态)。
  3. rowSpaceIndicator[indicatorIndex + var1] != -1判断列值是否为NULL:
    • 若为NULL,直接返回默认的false。
    • 若非NULL,进入字节数组读取逻辑。
  4. 核心判断var2 = var5 != 1 || var3[var4] != -128:
    结合Oracle JDBC对NUMBER的存储规则,当NUMBER值为0时,驱动会将其存储为字节[1, -128]。此时var5 == 1且var3[var4] == -128,逻辑表达式结果为false;其他所有非0的NUMBER值(正数、负数、小数等)的存储字节都不满足这个组合,逻辑表达式结果为true。

最终返回规则

  • 列值为NULL:返回false
  • 列值为0:返回false
  • 列值为非0的任意NUMBER(如1、-5、0.1、1000等):返回true

内容的提问来源于stack exchange,提问作者Wacage

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 18:54:56