Oracle SQL Вставка -ve Infinity в тип данных Float - PullRequest
0 голосов
/ 13 апреля 2020

Есть ли способ вставить отрицательную бесконечность в столбец типа данных FLOAT в Oracle DB.

Ответы [ 3 ]

1 голос
/ 13 апреля 2020
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  |

дБ <> скрипка здесь


Обновление

Тип данных FLOAT

Тип данных ANSI FLOAT просто псевдоним для Oracle NUMBER типа данных.

Из Oracle документации :

FLOAT [(p)] - подтип тип данных NUMBER, имеющий точность p. Значение 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 <> fiddle здесь

Если вы хотите поддерживать бесконечность, то используйте тип данных, который его поддерживает BINARY_FLOAT или BINARY_DOUBLE; не пытайтесь получить значения в тип данных FLOAT или NUMBER, где они могут теоретически o, если вы обходите обычные методы проверки, но на самом деле не поддерживаются.

0 голосов
/ 13 апреля 2020

Целое число и число с плавающей запятой поддерживает бесконечность, это только то, что SQL и PL SQL двигатель Oracle не поддерживает. Вы можете обойти это, используя следующую функцию

 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); 
0 голосов
/ 13 апреля 2020

Есть ли способ вставить отрицательную бесконечность в столбец типа данных FLOAT в Oracle DB.

Нет, не в стандартном Oracle способе вставки данных в SQL или PL / SQL.

Вкл. 19 c база данных:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...