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
就适合您的情况。
为什么这个 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
就适合您的情况。