Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Максимальная длина типа number / 25 сообщений из 44, страница 1 из 2
27.01.2018, 18:22
    #39592220
Максимальная длина типа number
Ребята, а можно ли через sql получить максимальное значение типа number? что-нибудь типа select max_value(number) from dual
...
Рейтинг: 0 / 0
27.01.2018, 20:20
    #39592244
dbpatch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Максимальная длина типа number
о максимальных типах данныхРебята, а можно ли через 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
27.01.2018, 21:08
    #39592256
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Максимальная длина типа number
о максимальных типах данных,

Код: 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
28.01.2018, 09:34
    #39592298
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Максимальная длина типа number
о максимальных типах данныха можно ли через sql получить максимальное значение типа number?А зачем?
dbpatchэто положительная бесконечностьКоторую давным-давно похерили , а твой клиент всёго лишь по старой памяти именно так показывает тебе такой not-a-number
...
Рейтинг: 0 / 0
29.01.2018, 12:57
    #39592735
dbpatch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Максимальная длина типа number
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
29.01.2018, 13:08
    #39592749
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Максимальная длина типа number
dbpatchВ 11.2 оное вообще явно в Concepts описаноDRDA все же не Conceptы. К тому же, доку по маргинальным технологиям редко приводят в соответствие с действительностью.
...
Рейтинг: 0 / 0
29.01.2018, 13:18
    #39592755
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Максимальная длина типа number
dbpatchВ 11.2 оное вообще явно в Concepts описаноТы всё же не пшыкай, а ткни конкретно, где это тебе пригрезилось.
...
Рейтинг: 0 / 0
29.01.2018, 13:23
    #39592759
dbpatch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Максимальная длина типа number
ElicdbpatchВ 11.2 оное вообще явно в Concepts описаноТы всё же не пшыкай, а ткни конкретно, где это тебе пригрезилось.

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

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

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

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

жесть
...
Рейтинг: 0 / 0
29.01.2018, 13:43
    #39592775
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Максимальная длина типа number
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
29.01.2018, 13:49
    #39592779
dbpatch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Максимальная длина типа number
-2-сначала нужно опрделить критерии, что считать за "работают".
в моем случае все проще - приложение зачем-то их пишет и читает. эта часть работает.
какие такие арифметические операции должна сама база над ними уметь делать - лично мне это не интересно.

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

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

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

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

тебе было обидно, что тебя отправили на RTFM? ну а кому сейчас легко?
...
Рейтинг: 0 / 0
29.01.2018, 17:24
    #39592900
merch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Максимальная длина типа number
dbpatch, тише, тише... какой ты агрессивный.
...
Рейтинг: 0 / 0
29.01.2018, 18:47
    #39592940
x + 2 * y
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Максимальная длина типа number
dbpatchты не удосужился даже изучить пример, что идет третим постом в этом топикеЯ изучил, но до меня не дошло. Разъясни, пожалуйста.
...
Рейтинг: 0 / 0
29.01.2018, 19:50
    #39592973
dbpatch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Максимальная длина типа number
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
29.01.2018, 20:37
    #39592991
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Максимальная длина типа number
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
29.01.2018, 20:58
    #39592996
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Максимальная длина типа number
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
30.01.2018, 07:32
    #39593070
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Максимальная длина типа number
dbpatchну а кому сейчас легко? 20144853
...
Рейтинг: 0 / 0
30.01.2018, 11:32
    #39593201
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Максимальная длина типа number
Не ссорьтесь ребята, длины намбера на всех хватит.
...
Рейтинг: 0 / 0
30.01.2018, 12:50
    #39593272
dbpatch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Максимальная длина типа number
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
30.01.2018, 13:02
    #39593280
dbpatch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Максимальная длина типа number
да, похоже так и есть. т.е. 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
30.01.2018, 13:25
    #39593300
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Максимальная длина типа number
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
30.01.2018, 13:27
    #39593301
dbpatch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Максимальная длина типа number
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Максимальная длина типа number / 25 сообщений из 44, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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