是否有任何方法可以在Oracle DB中的FLOAT Datatype列中插入负无穷大。
CREATE TABLE test_data ( value BINARY_FLOAT );
然后您可以使用BINARY_FLOAT_INFINITY
文字:
INSERT INTO test_data ( value ) VALUES ( binary_float_infinity );
如果你想要负无穷大,只需在它前面加一个减号:
INSERT INTO test_data ( value ) VALUES ( -binary_float_infinity );
然后:
SELECT * FROM test_data;
输出:
|VALUE||:----||Inf||-Inf|
db<>小提琴这里
更新
数据类型为
FLOAT
ANSIFLOAT
数据类型只是OracleNUMBER
数据类型的别名。
来自Oracle文档:
FLOAT [(p)]
-精度为p
的NUMBER
数据类型的一个子类型。FLOAT
的值在内部表示为NUMBER
。精度p
的范围可以从1到126个二进制数字。FLOAT
值需要1到22个字节。
从技术上讲,将无穷大放入FLOAT
数据类型中是可能的(特别是如果您使用绕过常规验证方法的外部应用程序(。一个这样的例子是使用DBMS_STATS.CONVERT_RAW_VALUE
:
CREATE FUNCTION negative_infinity RETURN FLOAT
IS
value FLOAT;
BEGIN
DBMS_STATS.CONVERT_RAW_VALUE(
UTL_RAW.CAST_TO_RAW( CHR(255)||CHR(101)),
value
);
RETURN value;
END;
/
然后你可以做:
CREATE TABLE test_data2( value FLOAT );
INSERT INTO test_data2 ( value ) VALUES ( negative_infinity() );
但这并不意味着该值得到支持:
SELECT SUM(value) FROM test_data2;
提供:
ORA-01426: numeric overflow
db<>小提琴这里
如果要支持无穷大,请使用支持它的数据类型BINARY_FLOAT
或BINARY_DOUBLE
;不要试图将值转换为FLOAT
或NUMBER
数据类型,如果绕过常规验证方法但实际上不受支持,理论上它们可以为o。
是否有任何方法可以在Oracle DB中的FLOAT Datatype列中插入负无穷大。
否,不是以Oracle在SQL或PL/SQL中插入数据的标准方式。
在19c数据库上:
select banner from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
FLOAT不支持无穷大:
create table float_infinity_test (id float);
insert into float_infinity_test values (1/0f);
Error report -
ORA-01426: numeric overflow
而BINARY_FLOAT会:
create table bin_float_test as (select 1/0f as id from dual);
desc bin_float_test;
Name Null? Type
---- ----- ------------
ID BINARY_FLOAT
Integer和float支持无穷大,这只是Oracle的SQL和PLSQL引擎不支持的。您可以使用以下功能绕过相同的
CREATE OR replace FUNCTION Bypass_number_validation(v1 IN NUMBER,
v2 IN NUMBER)
RETURN FLOAT
IS
vnum FLOAT;
BEGIN
dbms_stats.Convert_raw_value(utl_raw.Cast_to_raw(Chr(v1)
||Chr(v2)), vnum);
RETURN vnum;
END;
create table t1p( id float);
insert into t1p values(bypass_number_validation(255,101));
select * from t1p;
ID
-Infinity
您可以使用文字BINARY_FLOAT_INFINITY来选择列,如下所示
select * from t1p where id= -BINARY_FLOAT_INFINITY;
如果你想在该表中进行任何聚合,只需排除无穷大的
select sum(id) from t1p where id <> -BINARY_FLOAT_INFINITY;
如果有使用FLOAT而不是BINARY FLOAT的约束,则可以获得与以下相同的聚合结果
SELECT SUM (id)
FROM (SELECT ( id ) id
FROM t1p
WHERE ( id <> -binary_float_infinity
AND id <> binary_float_infinity )
UNION ALL
SELECT ( -binary_float_infinity )
FROM t1p
WHERE id = -binary_float_infinity
UNION ALL
SELECT ( binary_float_infinity )
FROM t1p
WHERE id = binary_float_infinity);