powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Максимальная длина типа number
44 сообщений из 44, показаны все 2 страниц
Максимальная длина типа number
    #39592220
Ребята, а можно ли через sql получить максимальное значение типа number? что-нибудь типа select max_value(number) from dual
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39592244
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о максимальных типах данныхРебята, а можно ли через sql получить максимальное значение типа number? что-нибудь типа select max_value(number) from dual

можно конечно

Код: plsql
1.
2.
3.
4.
5.
6.
7.
SELECT to_char(val), val - val FROM (
  SELECT utl_raw.cast_to_number('ff65') val FROM dual
)

TO_CHAR(VAL)                                VAL-VAL
---------------------------------------- ----------
~                                                 0



это положительная бесконечность, если сразу не понятно.

http://www.orafaq.com/wiki/Number
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39592256
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о максимальных типах данных,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
SQL> declare
  2    x number := 1;
  3    y number;
  4    i int := 0;
  5  begin
  6    -- finding max i which does not cause value error for power(2, i)
  7    while true loop
  8      begin
  9        i := i + 1;
 10        x := power(2, i);
 11      exception
 12        when value_error then
 13          exit;
 14      end;
 15    end loop;
 16    x := power(2, i - 1);
 17    y := ceil(x / 2);
 18
 19    -- incrementing x until x = x + y (due to precision loss)
 20    i := 0;
 21    while true loop
 22      i := i + 1;
 23      if x + y is infinite then
 24        y := ceil(y / 2);
 25      else
 26        x := x + y;
 27        if x = x + y then
 28          exit;
 29        end if;
 30      end if;
 31    end loop;
 32
 33    dbms_output.put_line(x);
 34    dbms_output.put_line(y);
 35    dbms_output.put_line(i);
 36    dbms_output.put_line(x + y);
 37    dbms_output.put_line(x + y + y);
 38    dbms_output.put_line(x + 2 * y);
 39  end;
 40  /
9.999999999999999999999999999999999999999000000000000000000000000000000000000000000000000000000E+125
31082702275611665134711390509176302508500000000000000000000000000000000000000000000000
203
9.999999999999999999999999999999999999999000000000000000000000000000000000000000000000000000000E+125
9.999999999999999999999999999999999999999000000000000000000000000000000000000000000000000000000E+125
~

PL/SQL procedure successfully completed.
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39592298
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о максимальных типах данныха можно ли через sql получить максимальное значение типа number?А зачем?
dbpatchэто положительная бесконечностьКоторую давным-давно похерили , а твой клиент всёго лишь по старой памяти именно так показывает тебе такой not-a-number
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39592735
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicо максимальных типах данныха можно ли через sql получить максимальное значение типа number?А зачем?
dbpatchэто положительная бесконечностьКоторую давным-давно похерили , а твой клиент всёго лишь по старой памяти именно так показывает тебе такой not-a-number

Кого куда похерили? только что проверил 12.2 - все работает.

Ты у нас знатный любитель тыкать других в RTFM? ну ок, давай и тебя потыкаем, вона жирным отмечено:
В других местах можешь поискать сам, их там довольно много. В 11.2 оное вообще явно в Concepts описано, но мож для тебя это уже давно-давно, поди тебя пойми.

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/drdas/datatype-support-and-conversion.html#GUID-89213067-1FE9-4557-8C7B-D350401CBA8D 7.2.1 Oracle NUMBER



Oracle NUMBER has the following characteristics:


Lower Range

1E-130


Upper Range

9.999 999 999 999 999 999 999 999 999 999 999 999 9E+125


Infinity

Supported for both negative and positive infinity


Not A Number

Not supported
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39592749
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchВ 11.2 оное вообще явно в Concepts описаноDRDA все же не Conceptы. К тому же, доку по маргинальным технологиям редко приводят в соответствие с действительностью.
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39592755
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchВ 11.2 оное вообще явно в Concepts описаноТы всё же не пшыкай, а ткни конкретно, где это тебе пригрезилось.
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39592759
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicdbpatchВ 11.2 оное вообще явно в Concepts описаноТы всё же не пшыкай, а ткни конкретно, где это тебе пригрезилось.

насчет 11.2 мне может и померещилось, гугл отказывается выдавать нужный тынц. но в 11.1 оное все еще в наличии

https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT313
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39592762
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-dbpatchВ 11.2 оное вообще явно в Concepts описаноDRDA все же не Conceptы. К тому же, доку по маргинальным технологиям редко приводят в соответствие с действительностью.

какая действительность тебе нужна? значения работают в 12.2, официального уведомления о прекращении поддержки не было.

какие еще маргиналы? о чем ты вообще?
там что, написано - осторожно, читать со скепсисом, сейчас вам будет описана маргинальная технология?

жесть
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39592775
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchзначения работают в 12.2сначала нужно опрделить критерии, что считать за "работают".
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
SQL> select binary_double_infinity a from dual;

         A
----------
       Inf

SQL> select binary_double_infinity + 1 a from dual;

         A
----------
       Inf

SQL> select case when binary_double_infinity is infinite then 'INF' else 'CON' end a from dual;

A
---
INF

SQL> select utl_raw.cast_to_number('ff65') a from dual;

         A
----------
         ~

SQL> select utl_raw.cast_to_number('ff65') + 1 a from dual;
select utl_raw.cast_to_number('ff65') + 1 a from dual
                                      *
ERROR at line 1:
ORA-01426: numeric overflow


SQL> select case when utl_raw.cast_to_number('ff65') is infinite then 'INF' else 'CON' end a from dual;
select case when utl_raw.cast_to_number('ff65') is infinite then 'INF' else 'CON' end a from dual
                                                *
ERROR at line 1:
ORA-01426: numeric overflow
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39592779
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-сначала нужно опрделить критерии, что считать за "работают".
в моем случае все проще - приложение зачем-то их пишет и читает. эта часть работает.
какие такие арифметические операции должна сама база над ними уметь делать - лично мне это не интересно.

агрегатные функции работают, статистика считается - ну и ладно.
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39592790
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchно в 11.1 оное все еще в наличииТ.е. ты не в состоянии дочитать до конца:RTFM(generated only by importing from an Oracle Database, Version 5)
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39592795
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchв моем случае все проще - приложение зачем-то их пишет и читает. эта часть работает.
какие такие арифметические операции должна сама база над ними уметь делать - лично мне это не интересно.

агрегатные функции работают, статистика считается - ну и ладно.Если у тебя принято разрабатывать по принципу "что вижу - то пою", это ещё не значит, что все должны ходить по лезвию.
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39592898
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicЕсли у тебя принято разрабатывать по принципу
Если ты не в состоянии
"что вижу - то пою",
все высказал? ты вообще о чем сейчас?

ты не удосужился даже изучить пример, что идет третим постом в этом топике,
но напрыгнул со своим "особо ценным мнением", на что тебе и указали - ты сел в лужу, это тебе не STFF и RTFM пионерам разбрасывать,

ты изучи сначала вопрос (да да, сам сначала STFF и RTFM), а потом будешь рассказывать, что там что в состоянии, переходя на личности.

тебе было обидно, что тебя отправили на RTFM? ну а кому сейчас легко?
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39592900
merch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatch, тише, тише... какой ты агрессивный.
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39592940
x + 2 * y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbpatchты не удосужился даже изучить пример, что идет третим постом в этом топикеЯ изучил, но до меня не дошло. Разъясни, пожалуйста.
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39592973
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
x + 2 * ydbpatchты не удосужился даже изучить пример, что идет третим постом в этом топикеЯ изучил, но до меня не дошло. Разъясни, пожалуйста.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
    dbms_output.put_line(x + 2 * y);

    x := x + 2 * y;

    dbms_output.put_line(x);
    
    dbms_output.put_line(utl_raw.cast_from_number(x));
  end;



Документация 11.1 (и ниже, ИМНИП) вещает, что эти positive/negative infinity можно получить только якобы только импортировав некую "УЖАСНУЮ" тайм-бобму из Oracle v5 (наверное в виде 7-и битовых байтов...)

Еще Том Кайт понапугал впечатлительных падаванов вот тут https://asktom.oracle.com/pls/asktom/asktom.search?tag=number-datatype-200110#10760491574770

с тех пор это своего рода городская легенда .

Но пример выше показывает, как вполне легально получить искомое ff65 значение в дампе.

Хотя вот оператор is infinite таки не документирован, а использовать недокументированные фичи...
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39592991
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dbpatchНо пример выше показывает, как вполне легально получить искомое ff65 значение в дампе.пример у dbms_photoshop был про PL/SQL...
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
SQL> var n number
SQL> begin
  2   :n:=
  3    9.999999999999999999999999999999999999999e125
  4   +0.000000000000000000000000000000000000001e125;
  5  end;
  6  /

PL/SQL procedure successfully completed.

SQL> print n;

         N
----------
         ~

SQL> select
  2    9.999999999999999999999999999999999999999e125
  3   +0.000000000000000000000000000000000000001e125
  4  from dual
  5  /
 +0.000000000000000000000000000000000000001e125
 *
ERROR at line 3:
ORA-01426: numeric overflow


Фактически infinity у number сейчас недокументирован и не поддерживается и в SQL все арифметические операции с ним неверны:
ОперацияBinary float/doubleNumber1/0 inf errorinf+0 inf errorinf-0 inf error-inf -inf errorinf-inf NaN 0 (неверно!)inf*0 NaN 0 (неверно!)Так что его использование - это очевидная мина замедленного действия
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39592996
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchХотя вот оператор is infinite таки не документирован, а использовать недокументированные фичи...

https://docs.oracle.com/cd/E11882_01/server.112/e41084/conditions003.htm expr must resolve to a numeric data type or to any data type that can be implicitly converted to a numeric data type
xtenderdbpatchНо пример выше показывает, как вполне легально получить искомое ff65 значение в дампе.пример у dbms_photoshop был про PL/SQL...Сначала была мысль запилить подобное (назовём это бинарным поиском максимума) с помощью модели в SQL,
но лень стало писать with functions для отлова исключений да и вообще были опасения что не в коня корм.

Это не меняет факта, что raw для infinity получить можно программно в PL/SQL.
Так же как и дамп для максимального значения которое не infinity.
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593070
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchну а кому сейчас легко? 20144853
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593201
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не ссорьтесь ребята, длины намбера на всех хватит.
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593272
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopdbpatchХотя вот оператор is infinite таки не документирован, а использовать недокументированные фичи...

https://docs.oracle.com/cd/E11882_01/server.112/e41084/conditions003.htm expr must resolve to a numeric data type or to any data type that can be implicitly converted to a numeric data type
xtenderпропущено...
пример у dbms_photoshop был про PL/SQL...Сначала была мысль запилить подобное (назовём это бинарным поиском максимума) с помощью модели в SQL,
но лень стало писать with functions для отлова исключений да и вообще были опасения что не в коня корм.

Это не меняет факта, что raw для infinity получить можно программно в PL/SQL.
Так же как и дамп для максимального значения которое не infinity.

нет, с документацией ты промазал. понятие numeric data type это вовсе не про NUMBER data type.
раздел документации про is infinite и is nan это именно про Floating-Point Numbers, там-же явно написано (и про неявное преобразование).

NUMBER и BINARY_FLOAT, BINARY_DOUBLE это принципиально разные типы, по сути расстояние между ними не меньше, чем
между NUMBER и тем-же VARCHAR2 - факт неявного преобразования еще ничего не означает


но, наверное, объясняет магию оператора IS INFINITE в твоем примере выше - там таки приводилось к BINARY_DOUBLE, не иначе... (пруф?)
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593280
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, похоже так и есть. т.е. is infinite неявно приводит операнд к BINARY_DOUBLE,
а NUMBER в принципе не понимает NaN, потому неявное преобразование в присваивании не проходит (но замечательно проходит в сравнении, т.е. обратное преобразование)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
DECLARE
  x NUMBER;
  f binary_double;
BEGIN
  f := BINARY_DOUBLE_NAN;

  IF f IS NAN THEN
    dbms_output.put_line('ook');
  END IF;


  BEGIN
    x := f; -- ORA-06502 is here

    IF x IS NAN THEN
      dbms_output.put_line('oops');
    END IF;
  EXCEPTION
    WHEN OTHERS THEN dbms_output.put_line(SQLERRM);
  END;

  x := utl_raw.cast_to_number('FF65');


  IF x IS INFINITE THEN
    dbms_output.put_line('ook');
  END IF;

  f := x;

  IF f IS INFINITE THEN
    dbms_output.put_line('ook');
  END IF;
END;
/

ook
ORA-06502: PL/SQL: numeric or value error
ook
ook
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593300
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchда, похоже так и есть. т.е. is infinite неявно приводит операнд к BINARY_DOUBLE,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SQL> explain plan for select * from dual where rownum is infinite;

Explained.

Sou@sou749>; @plan

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------
Plan hash value: 3968617506

----------------------------------------------------------------------------
| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |     1 |     2 |     2   (0)| 00:00:01 |
|   1 |  COUNT              |      |       |       |            |          |
|*  2 |   FILTER            |      |       |       |            |          |
|   3 |    TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter(ROWNUM IS INFINITE)

stdspec.sql
Код: plsql
1.
2.
3.
4.
5.
6.
7.
  function 'IS NAN' (N NUMBER) RETURN BOOLEAN;
…
  function 'IS INFINITE' (N NUMBER) RETURN BOOLEAN;
…
  function 'IS NOT NAN' (N NUMBER) RETURN BOOLEAN;
…
  function 'IS NOT INFINITE' (N NUMBER) RETURN BOOLEAN;
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593301
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderdbpatchНо пример выше показывает, как вполне легально получить искомое ff65 значение в дампе.пример у dbms_photoshop был про PL/SQL...
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
SQL> var n number
SQL> begin
  2   :n:=
  3    9.999999999999999999999999999999999999999e125
  4   +0.000000000000000000000000000000000000001e125;
  5  end;
  6  /

PL/SQL procedure successfully completed.

SQL> print n;

         N
----------
         ~

SQL> select
  2    9.999999999999999999999999999999999999999e125
  3   +0.000000000000000000000000000000000000001e125
  4  from dual
  5  /
 +0.000000000000000000000000000000000000001e125
 *
ERROR at line 3:
ORA-01426: numeric overflow


Фактически infinity у number сейчас недокументирован и не поддерживается и в SQL все арифметические операции с ним неверны:
ОперацияBinary float/doubleNumber1/0 inf errorinf+0 inf errorinf-0 inf error-inf -inf errorinf-inf NaN 0 (неверно!)inf*0 NaN 0 (неверно!)Так что его использование - это очевидная мина замедленного действия


что характерно, из ~ NUMBER можно в SQL получить +INF как BINARY_DOUBLE, но не наоборот

Код: plsql
1.
2.
3.
SELECT CAST('+INF' AS binary_float)  ||'' FROM dual;
SELECT cast(CAST('+INF' AS binary_float) AS NUMBER) ||'' FROM dual; --oops is here
SELECT CAST(utl_raw.cast_to_number('FF65') AS binary_float) ||'' FROM dual; 



~ и -~ как значения для NUMBER документированы, а вот арифметика над ними - нет, ну и? не используйте арифметику.

в остальном - не знаю, что там за мины. как говорилось выше - смотря для чего использовать.
нужно понимать, что NUMBER это все-таки для точного подсчета денег (где бесконечности бессмысленны),
а для сугубо научных математических расчетов его использовать все-таки не стоит, IEEE типы ведут себя иначе
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593304
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicdbpatchда, похоже так и есть. т.е. is infinite неявно приводит операнд к BINARY_DOUBLE,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SQL> explain plan for select * from dual where rownum is infinite;

Explained.

Sou@sou749>; @plan

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------
Plan hash value: 3968617506

----------------------------------------------------------------------------
| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |     1 |     2 |     2   (0)| 00:00:01 |
|   1 |  COUNT              |      |       |       |            |          |
|*  2 |   FILTER            |      |       |       |            |          |
|   3 |    TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter(ROWNUM IS INFINITE)

stdspec.sql
Код: plsql
1.
2.
3.
4.
5.
6.
7.
  function 'IS NAN' (N NUMBER) RETURN BOOLEAN;
…
  function 'IS INFINITE' (N NUMBER) RETURN BOOLEAN;
…
  function 'IS NOT NAN' (N NUMBER) RETURN BOOLEAN;
…
  function 'IS NOT INFINITE' (N NUMBER) RETURN BOOLEAN;



очень хорошо, просто замечательно.
теперь попробуй присвоить в NUMBER значение NAN

кроме того, зачем вот так брать на понт? с каких пор package STANDARD соотвествует реальному SQL?
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593316
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да и спека, на самом деле, определена вот так (нехорошо обманывать взрослых)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  function 'IS NAN' (N NUMBER) RETURN BOOLEAN;
  function 'IS NAN' (F BINARY_FLOAT) RETURN BOOLEAN;
  function 'IS NAN' (D BINARY_DOUBLE) RETURN BOOLEAN;
  function 'IS INFINITE' (N NUMBER) RETURN BOOLEAN;
  function 'IS INFINITE' (F BINARY_FLOAT) RETURN BOOLEAN;
  function 'IS INFINITE' (D BINARY_DOUBLE) RETURN BOOLEAN;
  function 'IS NOT NAN' (N NUMBER) RETURN BOOLEAN;
  function 'IS NOT NAN' (F BINARY_FLOAT) RETURN BOOLEAN;
  function 'IS NOT NAN' (D BINARY_DOUBLE) RETURN BOOLEAN;
  function 'IS NOT INFINITE' (N NUMBER) RETURN BOOLEAN;
  function 'IS NOT INFINITE' (F BINARY_FLOAT) RETURN BOOLEAN;
  function 'IS NOT INFINITE' (D BINARY_DOUBLE) RETURN BOOLEAN;



и сделано это просто для "неявного" преобразования через перегрузку - вон последняя строка, причем это неявное преобразование типов уже в самой функции (где оно явное) сделано откровенно криво и с багом.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
SELECT * FROM (SELECT cast(utl_raw.cast_to_number('FF65') AS  binary_float) val FROM dual) WHERE val IS INFINITE;

SELECT * FROM (SELECT cast(utl_raw.cast_to_number('FF65') AS  binary_double) val FROM dual ) WHERE val IS INFINITE;

SELECT * FROM (SELECT cast(utl_raw.cast_to_number('FF65') AS  FLOAT) val FROM dual ) WHERE val IS INFINITE; -- oops

SELECT * FROM (SELECT cast(123 AS NUMBER) val FROM dual ) WHERE val IS INFINITE; -- 'IS NAN(N NUMBER) is here




и что с того? еще раз - IS INFINITE именно для NUMBER не документирован, он применим только к BINARY_ типам.
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593325
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchкроме того, зачем вот так брать на понт? с каких пор package STANDARD соотвествует реальному SQL?Понты тут только от тебя.
Я же лишь продемонстрировал тебе, что неявного преобразования нет ни в SQL, ни в PL/SQL. Но не в коня корм...
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593336
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchеще раз - IS INFINITE именно для NUMBER не документирован, он применим только к BINARY_ типам.Почитай же, наконец, доку:
RTFMIn both forms of floating-point condition, expr must resolve to a numeric data type or to any data type that can be implicitly converted to a numeric data typeБолее того:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Elic@elic122>; explain plan for select * from dual where dummy is infinite;

Explained.

Elic@elic122>; @plan

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------
Plan hash value: 272002086

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     2 |     2   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(TO_NUMBER("DUMMY") IS INFINITE)
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593337
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchда, похоже так и есть. т.е. is infinite неявно приводит операнд к BINARY_DOUBLEСначала стоит ознакомиться с тем, что лимиты совершенно разные для number и binary_double.
Можно хоть возвести в квадрат 1e125 и все равно это не будет бесконечность для binary_double.
Смотрим лимиты тут

dbpatchпонятие numeric data type это вовсе не про NUMBER data type https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT313 Overview of Numeric Datatypes
The numeric datatypes store positive and negative fixed and floating-point numbers, zero, infinity, and values that are the undefined result of an operation (that is, is "not a number" or NAN).

This section includes the following topics:
NUMBER Datatype
Floating-Point Numbers
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593338
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dbms_photoshopinfinity получить можно программно в PL/SQL.я может плохо искал в документации, я не нашел почему в PL/SQL результат превышения намбером 1e126 приводит к inf, в старой четко написано:
https://docs.oracle.com/cd/B12037_01/appdev.101/b10807/03_types.htm NUMBER
You use the NUMBER datatype to store fixed-point or floating-point numbers. Its magnitude range is 1E-130 .. 10E125. If the value of an expression falls outside this range, you get a numeric overflow or underflow error.
В новой вообще выпилили этот кусок, зато сказали обращаться к SQL'ной доке, а мы видимо что результаты совершенно разные.
Так что имхо это либо какой-то атавизм, либо магия/баг pl/sql оптимизаций.
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593416
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicdbpatchкроме того, зачем вот так брать на понт? с каких пор package STANDARD соотвествует реальному SQL?Понты тут только от тебя.
Я же лишь продемонстрировал тебе , что неявного преобразования нет ни в SQL, ни в PL/SQL. Но не в коня корм...

да ничего ты не продемонстрировал, кроме упертости. что значит нет неявного преобразования? какие еще конные кормы? о чем ты вообще сейчас?

вот тут слово "неявного" 21150883 специально взято в кавычки - подразумевается неявное преобразование в SQL, а по факту (в силу каких-то ограничений движка) вместо ожидаемого неявного преобразования работает перегрузка вызовов от типа аргумента.

и это для SQL, как работает это все в PL/SQL - это вообще отдельный вопрос (по факту - ожидаемо работает иначе, ибо там уже честное неявное преобразование)

ты же изначально вовсе соврал, "забыв" указать варианты перегруженных из STANDARD функций с BINARY_ аргументами.
что ты этим хотел доказать - загадка.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT * FROM (SELECT cast(utl_raw.cast_to_number('FF65') AS  binary_double) val FROM dual ) WHERE val IS INFINITE;
SELECT * FROM (SELECT utl_raw.cast_to_number('FF65') val FROM dual ) WHERE val IS INFINITE; -- oops

BEGIN
  IF utl_raw.cast_to_number('FF65') IS INFINITE THEN 
    dbms_output.put_line('isn''t it too lame?');
  END IF;
END;
/



вывод последнего скрипта можешь посмотреть сам.
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593427
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicПочитай же, наконец, доку:
RTFMIn both forms of floating-point condition, expr must resolve to a numeric data type or to any data type that can be implicitly converted to a numeric data typeБолее того:

более того, ты бы сам почитал эту доку - а именно - название раздела, из которого ты взял эту цитату.
там вроде четко сказано, что Floating-point conditions, явная ссылка на Floating-point numbers на Implicit conversions, и нет ни слова про NUMBER.

И не надо рассказывать, что Numeric data type это про NUMBER. Потому что документация сама себе противоречит:

авторNumeric Datatypes

The Oracle Database numeric datatypes store positive and negative fixed and floating-point numbers, zero, infinity, and values that are the undefined result of an operation—"not a number" or NAN. For information on specifying numeric datatypes as literals, refer to "Numeric Literals".

NUMBER не может store NAN

или же мы говорим, что все ок, и это официальное утверждение, что NUMBER может все-таки хранить Infinity, NAN и прочее?
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593437
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchагрегатные функции работают, статистика считается - ну и ладно. ORA-01426: переполнение числа

А ты, чудак, продолжай убеждать себя, что бесконечность нормально обрабатывается.
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593456
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dbpatchавторNumeric Datatypes

The Oracle Database numeric datatypes store positive and negative fixed and floating-point numbers, zero, infinity, and values that are the undefined result of an operation—"not a number" or NAN. For information on specifying numeric datatypes as literals, refer to "Numeric Literals".

NUMBER не может store NAN
интересный подход с выборочным чтением и толкованием документации весь спор из-за игнорирования кусочка чуть ниже:
https://docs.oracle.com/database/121/SQLRF/sql_elements001.htm#SQLRF30020 NUMBER Data Type
The NUMBER data type stores zero as well as positive and negative fixed numbers with absolute values from 1.0 x 10-130 to but not including 1.0 x 10126. If you specify an arithmetic expression whose value has an absolute value greater than or equal to 1.0 x 10126, then Oracle returns an error.
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593488
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicdbpatchагрегатные функции работают, статистика считается - ну и ладно. ORA-01426: переполнение числа

А ты, чудак, продолжай убеждать себя, что бесконечность нормально обрабатывается.

Чудак?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQL> CREATE TABLE inf_TEST AS
     SELECT utl_raw.cast_to_number('FF65') val FROM dual
     UNION ALL
     SELECT utl_raw.cast_to_number('00') FROM dual;
Table created

SQL> ANALYZE TABLE inf_test COMPUTE STATISTICS;
Table analyzed

SQL> BEGIN
    dbms_stats.gather_table_stats(USER, 'inf_test');
    END;
    /
PL/SQL procedure successfully completed

SQL> SELECT MIN(val) || '', MAX(val) || '' FROM inf_test;
MIN(VAL)||''                             MAX(VAL)||''
---------------------------------------- ----------------------------------------
-~                                       ~

SQL>



С нетерпением ждем продолжения "срыва покровов" в твоем исполнении. Уже второй день вон какое веселье на примитивном вопросе.
Что особенно забавно, так как эти бесконечности я сам не использую, а лишь натолкнулся на них в одном третьестороннем приложении.

Эдак мы еще и до нулевого символа посреди varchar2() дойдем, или до даты вида 0000-00-00 (и ее нескольких разновидностях в dump()-е), с животрепещущими откровениями о недопустимости использования оных вещей, пусть какие падаваны порадуются, старческому-то.
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593496
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderdbpatchпропущено...


NUMBER не может store NAN
интересный подход с выборочным чтением и толкованием документации весь спор из-за игнорирования кусочка чуть ниже:
https://docs.oracle.com/database/121/SQLRF/sql_elements001.htm#SQLRF30020 NUMBER Data Type
The NUMBER data type stores zero as well as positive and negative fixed numbers with absolute values from 1.0 x 10-130 to but not including 1.0 x 10126. If you specify an arithmetic expression whose value has an absolute value greater than or equal to 1.0 x 10126, then Oracle returns an error.

зачем ты выделил zero - загадка
а вот про fixed - уже интереснее.

осталось выяснить, что же такое fixed - в твоем понимании, и в понимании Oracle.

сможешь?
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593498
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dbpatch,

ты видишь там infinity? а sum и avg - это не агрегатные функции?
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593500
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dbpatchУже второй день вон какое веселье на примитивном вопросе.не знаю где тут веселье... тебя отговаривают стрелять себе в ногу, но ты сопротивляешься... тут печаль, а не веселье

зы. все равно скоро всем это надоест и убивайся как хочешь...
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593509
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderdbpatch,

ты видишь там infinity? а sum и avg - это не агрегатные функции?

да?

а что ты ожидаешь от avg(+/-бесконечность), sum(+/-бесконечность)

ноль? увы, правда бывает жестока

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT 
-- AVG(val), -- try this
-- SUM(val), --  try that
MIN(val)||'', 
MAX(val)||'' 
FROM 
(
SELECT CAST(val AS binary_double) val FROM (
 SELECT utl_raw.cast_to_number('FF65') val FROM dual
 UNION ALL 
 SELECT utl_raw.cast_to_number('00') FROM dual
)
)



ну или так, даже интереснее:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT 
-- AVG(val), -- try this
-- SUM(val), --  try that
MIN(val)||'', 
MAX(val)||''
FROM 
(
 SELECT BINARY_DOUBLE_INFINITY val FROM dual
 UNION ALL 
 SELECT -BINARY_DOUBLE_INFINITY FROM dual
 UNION ALL 
 SELECT BINARY_DOUBLE_NAN FROM dual
)
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593510
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderdbpatchУже второй день вон какое веселье на примитивном вопросе.не знаю где тут веселье... тебя отговаривают стрелять себе в ногу, но ты сопротивляешься... тут печаль, а не веселье

зы. все равно скоро всем это надоест и убивайся как хочешь...

ирония в том, что тут ни у кого нет реальной практики с inf, -inf, nan, но все почему-то считают своим долгом
поучать других, дескать я такой опытный неимоверно, пятикратный орденоносец STFF/RTFM третьей степени со стажем, мое мнение верно и незыблимо априори

мне же просто смешно "пошатать трубу", ловя "орденоносцев" на противоречивости и откровенной ложности их высказываний - просто проверяя те или иные примеры в консоли.


бороться против невежества (в особенности своего - я вот не знал про IS INFINITY) - оно не может надоесть.

так что там насчет fixed кстати? будут откровения?
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593521
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dbpatch,

С математикой совсем плохо было? Не позорься как ты уже inf-inf сделал в самом начале
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593541
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderdbpatch,

С математикой совсем плохо было? Не позорься как ты уже inf-inf сделал в самом начале

С чего ты взял про "позориться"? Я просто забросил детектор. Никого не возмутило, видно все забыли и про

https://ru.wikipedia.org/wiki/Раскрытие_неопределённостей

ну и https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html#5001 - это уж точно прочитало дальше первого листа не более 0.01% от разработчиков

вернее забыли то, чего и не знали (хотя как инженер по образованию могу смело сказать - 95% курса матана, начиная со школы - бесполезный хлам, если не рассматривать его как фильтр абитуриентов на гуманитарные направления, а оставшихся 5% как раз хватит для космических полетов и не только).
...
Рейтинг: 0 / 0
Максимальная длина типа number
    #39593550
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dbpatch,

обдумал бы табличку внизу 21148756 и не феерил тут
...
Рейтинг: 0 / 0
44 сообщений из 44, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Максимальная длина типа number
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]