DBMS_RANDOM.VALUE 返回值等于 HIGH 值

DBMS_RANDOM.VALUE returned value equals HIGH value

为什么这个 return 值介于 1 和 5 之间?

declare
    v numeric;
begin
    v := dbms_random.value(1, 5);
    DBMS_OUTPUT.PUT_LINE(v);
end;

根据 documentation 它应该 return 值介于 1 和 4 之间。

注意:我使用的是 Oracle 12c 第 2 版

我认为这是因为您使用的 numeric 不是标准的 Oracle 数据类型。看起来 Oracle 将其视为 integer 的同义词并四舍五入到最接近的整数。

尝试使用 NUMBER,您可能根本看不到 5.000000000000。

它为您四舍五入。

declare
    v numeric(6,5);
    w numeric;
begin
    v := dbms_random.value(1, 5);
    w := v;
    DBMS_OUTPUT.PUT_LINE(v);
    DBMS_OUTPUT.PUT_LINE(w);
    DBMS_OUTPUT.PUT_LINE(FLOOR(v));
end;
/

一个结果:

dbms_output:
4.92843
5
4

文档说 numeric 数据类型可以(可选)采用小数位数和精度。重要的是,如果您不指定它们,文档会这样说:

The NUMERIC and DECIMAL datatypes can specify only fixed-point numbers. For those datatypes, the scale (s) defaults to 0.

https://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements001.htm#SQLRF00213

您将数据类型定义为 numeric,Oracle 将其转换为 number(38,0) - 意思是最多 38 位的整数(Oracle 限制)。

您使用 RANDOM 生成小数,但是当它们被插入整数列时(就像您的一样,通过应用记录的默认值),值首先四舍五入为最接近的整数。因此,这意味着您生成的所有介于 4.5 和 5.0 之间的值都会四舍五入为整数 5。

要解决此问题,请不要向 numeric 添加小数位数和精度。相反,养成使用标准 Oracle 数据类型的习惯 - number 就适合您的情况。