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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 13:55:02