Oracle SQL在浮点数据类型中插入ve无穷大



是否有任何方法可以在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)]-精度为pNUMBER数据类型的一个子类型。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_FLOATBINARY_DOUBLE;不要试图将值转换为FLOATNUMBER数据类型,如果绕过常规验证方法但实际上不受支持,理论上它们可以为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); 

最新更新