如何在Oracle中从数值类型返回受约束的整数?
Oracle无约束NUMBER类型转整数的困境
在Oracle中,可映射为32位(甚至16位或64位)整数的类型是NUMBER(9, 0)或同类带约束的数值类型。
CREATE TABLE T(C1 NUMBER, C2 NUMBER(9, 0) ); -- 无约束与带约束的数值类型 INSERT INTO T(C1, C2) VALUES (10, 10); SELECT C1, C2 FROM T; -- C1是无约束NUMBER,C2是NUMBER(9,0)
Oracle会默认数值的精度和小数位数,但除了修改表结构外,似乎没有其他方式给无约束的NUMBER设置整数约束:
SELECT CAST(C1 AS INTEGER) FAILURE1, -- 结果仍是无约束NUMBER TRUNC(C1) FAILURE2, -- 结果仍是无约束NUMBER ROUND(C1, 0) FAILURE3, -- 结果仍是无约束NUMBER CAST(ROUND(C1, 0) AS NUMBER(9, 0)) FAILURE4, -- 结果仍是无约束NUMBER TO_NUMBER(TO_CHAR(C1, '99')) FAILURE5 -- 操作繁琐且仍不生效 FROM T
这种情况会增加Oracle应用的开发难度,同时降低运行速度和内存效率。像Dapper这类ORM及其底层驱动无法确定无约束NUMBER的具体类型,会将这类列映射为System.Decimal而非更轻量的整数类型。
Oracle提供了TO_BINARY_FLOAT()和TO_BINARY_DOUBLE()函数,分别对应float和double类型,但针对整数,有没有类似的、能实现约束转换的方法呢?
内容的提问来源于stack exchange,提问作者Charles Burns
相关产品推荐
相关产品推荐

