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; } }
逐逻辑解析:
- 默认返回值为
false。 - 若
rowSpaceIndicator为空,直接抛出SQLException(错误码21,对应无效行状态)。 rowSpaceIndicator[indicatorIndex + var1] != -1判断列值是否为NULL:- 若为NULL,直接返回默认的
false。 - 若非NULL,进入字节数组读取逻辑。
- 若为NULL,直接返回默认的
- 核心判断
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
相关产品推荐
相关产品推荐

