如何从 Oracle 中的数字返回整数?

问题描述 投票:0回答:1

用 Oracle 来说,这将是一个

NUMBER(9, 0)
或任何映射到 32 位(甚至 16 位或 64 位)整数的内容。

CREATE TABLE T(C1 NUMBER, C2 NUMBER(9, 0) ); -- Unconstrained and constrained number
INSERT INTO T(C1, C2) VALUES (10, 10);

SELECT C1, C2 FROM T; -- C1 is NUMBER, C2 is NUMBER(9,0)

Oracle 假定了精度和小数位数,然后似乎没有办法在不修改表结构本身的情况下设置它们:

SELECT
    CAST(C1 AS INTEGER) FAILURE1, -- Unconstrained number
    TRUNC(C1)           FAILURE2, -- Unconstrained number
    ROUND(C1, 0)        FAILURE3, -- Unconstrained number
    CAST(ROUND(C1, 0) AS NUMBER(9, 0)) FAILURE4, -- Unconstrained number
    TO_NUMBER(TO_CHAR(PERCENT_DONE, '99') FAILURE5, -- ~Overcomplicated and still fails
FROM T

这使得编写与 Oracle 一起使用的应用程序变得更加困难,并且还使它们变得更慢且内存效率更低。像 Stack Overflow 自己的 Dapper 这样的 ORM 及其底层驱动程序不知道不受约束的数字可能包含什么,因此它们将这些列映射到类型,例如

System.Decimal
,而不仅仅是简单的整数类型。

Oracle 确实有

TO_BINARY_FLOAT()
TO_BINARY_DOUBLE()
分别映射到 float 和 double,但是如何用整数来完成呢?

oracle orm dapper
1个回答
0
投票

您可以对列使用约束来确保值符合 32 位有符号限制:

CREATE TABLE T
 (C1 NUMBER,
  C2 NUMBER(10, 0)
    CONSTRAINT T_C2_VALUE_CHECK
      CHECK(C2 BETWEEN -2147483648 AND 2147483647))

不知道/您的 ORM 是否可以利用此信息。

这里是db-fiddle

© www.soinside.com 2019 - 2024. All rights reserved.