Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
kebot
5 / 5 / 4
Регистрация: 11.07.2012
Сообщений: 196
1

Поле NUMBER в ORACLE

10.10.2016, 12:55. Просмотров 583. Ответов 7
Метки нет (Все метки)

Доброго времени суток всем.

Работаю с базой ORACLE
(Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production)

У меня есть в базе поле типа number - храню там большие целые числа

и вот столкнулся с такой проблемой, что если в числе 16 чисел и больше то ORACLE округляет это число

т.е. например вставляю 153122387330596864 а вставляется 1,53122387330597E17 и последние
три знака я просто теряю.
Я уже как только не пробовал задавать точность и масштаб number(38), number(38,1)
всеравно не могу сохранить в базе то что мне нужно

Ведь сказано же в руководстве - до 38 значащих цифр - разве 15 чисел это 38 ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2016, 12:55
Ответы с готовыми решениями:

Ошибка Invalid Number при получении полей из БД Oracle
Вот объясните дураку, где здесь ошибка? ADOQuery1.Active:=false;...

Загрузка файла в поле blob таблицы сервера Oracle
Необходимо создать приложение которое будет выбирать файл (предположительно...

Найти среди запискй number ту, в которой number самий большой
если так делать то виводит какието нули, што делать? type tpidr = record...

const n=20; type number=0.9; num= array[1.n] of number; var a,b,c: num; t: boolean;
Помогите решить пожалуйста) const n=20; type number=0..9; num=...

Ping based random number generator
Реализован генератор случайных чисел, использующий Ping (измерение времени...

7
Grossmeister
Модератор
3409 / 2462 / 419
Регистрация: 21.01.2011
Сообщений: 10,791
10.10.2016, 13:30 2
Цитата Сообщение от kebot Посмотреть сообщение
вставляю 153122387330596864 а вставляется 1,53122387330597E17 и последние
Скорее всего проблема не в том, как вставляется, а в том, как отображается в той программе, которая для этого используется.
SQL
1
2
SELECT fld_num, to_char(fld_num)
FROM tab1
или так
SQL
1
2
3
SELECT   153122387330596864,
  to_char(153122387330596864),
FROM dual
Добавлено через 7 минут
Например, в SQL*Plus можно воспользоваться таким способом:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SQL> SELECT fld_num
FROM tab1;
 
    AL_NUM
 ----------
 1.5312E+17
 
SQL> col fld_num format 99999999999999999999
SQL> SELECT fld_num
FROM tab1;
 
               AL_NUM
---------------------
 153122387330596864
0
kebot
5 / 5 / 4
Регистрация: 11.07.2012
Сообщений: 196
10.10.2016, 13:37  [ТС] 3
В том то и дело, что когда назад из базы это число получаю (на делфи клиенте)

Delphi
1
2
3
4
5
var    n :Int64;
 
.........
 
n:= Query.FieldByName('TG_PARAMS').Value;

то возвращается уже далеко не то что туда клал
причем обрезка числа (округление) происходит именно в момент записи в поле, проверял на pl/sql developer (из него же
и смотрел)
0
Grossmeister
Модератор
3409 / 2462 / 419
Регистрация: 21.01.2011
Сообщений: 10,791
10.10.2016, 13:52 4
Цитата Сообщение от kebot Посмотреть сообщение
проверял на pl/sql developer
PL/SQL Dev здесь как раз не авторитет. Я в нем наталкивался на такую штуку: в числе много цифр после запятой, например, несколько значимых, потом куча нулей и в конце еще парочка значимых. Так он показывал число только до начала нулей. Выявилось только тогда, когда результат запроса скопировали в Excel. Excel в ячейке тоже показывает урезанное число, а на строчке сверху - полное.
Попробуй посмотреть так, как я показал (через to_char или через SQL*Plus с установкой формата).
К слову сказать, никаких E в числах в самой БД не хранится, это уже фокусы отображения используемых клиентских программ.

Добавлено через 4 минуты
Кстати, сейчас проверил в SQL Developer (это который производства Oracle и который можно бесплатно скачать с их сайта). Там все железно показывает: сколько цифр есть, столько и на экране.
0
kebot
5 / 5 / 4
Регистрация: 11.07.2012
Сообщений: 196
10.10.2016, 14:10  [ТС] 5
Скопировал в Excel

в ячейке 1,53E+17
в верху 153122387330597000 (а надо 153122387330596864) т.е. 6844 округлил до 7000

Применил запрос
SQL
1
 SELECT t.tg_params,to_char(t.tg_params), t.rowid FROM ALEX.IPACK_OPTIONS t
в pl/sql dev в столбце to_char(t.tg_params) получаю 153122387330597000

Ну и с чего все началось прежде чем я в эти дебри полез - клиент, на клиент мне неверное значение
возвращается (округленное)

Понятное дело, что то что мы видим - отображаемые данные еще не истина в последней инстанции что
именно это значение в базе лежит - но в данном случае -Я НЕМОГУ ПОНЯТЬ ПОЧЕМУ ОН МНЕ НУЛЯМИ ТО ВСЕ
ДОЗАПИСЫВАЕТ по принцыпу 15й знак округляет а дальше нули ???????
0
Grossmeister
Модератор
3409 / 2462 / 419
Регистрация: 21.01.2011
Сообщений: 10,791
10.10.2016, 14:19 6
Цитата Сообщение от kebot
ПОЧЕМУ ОН МНЕ НУЛЯМИ
Для начала надо выяснить, кто ОН. Раз ты написал в этом форуме, то полагаю, что запись идет из программы на Delphi.
Попробуй выполнить INSERT из того же PL/SQL Dev или из SQL*Plus. Если все запишется правильно, значит глюк в используемых компонентах Delphi.
0
kebot
5 / 5 / 4
Регистрация: 11.07.2012
Сообщений: 196
10.10.2016, 14:54  [ТС] 7
Прямо в pl/sql dev сделал вставку

SQL
1
2
    
   INSERT INTO alex.IPACK_OPTIONS (stat_period,tg_params) VALUES (1,153122387330596864)
Все то же самое и в excel и в dev

Компоненты - использую DOA вставка с клиента

Delphi
1
2
lFormParam.fID_o:=DataForm.Debug5Pack.CallIntegerFunction('InsertIPACK_OPTIONS',[
    GetParams_value(RG_StatPeriod,0,'I'), .................
т.е. идет вызов функции из пакета которая и производит вставку - но сдается мне все это
не важно - я же ведь и напрямую немогу корректно число в базу сохранить

Там все железно показывает: сколько цифр есть, столько и на экране.
Сегодня 14:37
у меня вот такого нет - даже если вручную запросом в самой базе - ГДЕ ТО ЕСТЬ НЮАНС
0
Grossmeister
Модератор
3409 / 2462 / 419
Регистрация: 21.01.2011
Сообщений: 10,791
10.10.2016, 15:05 8
Цитата Сообщение от kebot Посмотреть сообщение
я же ведь и напрямую немогу корректно число в базу сохранить
Это что-то сомнительно. У меня все четко вставляется. Никаких жалоб на других форумах по этому поводу тоже не видел. Правда у меня есть Ora 8 и Ora 11, Ora 12 под рукой нет.
Можно еще попробовать INSERT из SQL*Plus, обычно это самая "верная" среда.
0
10.10.2016, 15:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.10.2016, 15:05

If the number requested is –1, the function returns as many entries as possible
в win32 developer's references DWORD WNetEnumResource( HANDLE hEnum, //...

Invalid use of keyword. Tokken: FROM Line number: 2.
Здравствуйте. Возникла проблема. Кинул на форму Query, зашел в SQL Builder,...

Invalid use of keyword. Token null. line number 3
Добрый день. У меня программа работает с базой данных DBase. Запрос должен...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru