Oracle Сохранить десятичное число в столбце с типом данных число - PullRequest
0 голосов
/ 31 августа 2018

У меня есть таблица, в которой один из столбцов имеет тип данных число (20) . В одном из случаев мне нужно сохранить десятичное значение в столбце, но столбец автоматически преобразует его в целое число. Ниже приведена простая таблица тестов, которую я создал для тестирования этого сценария.

create table test_tbl
(
  amt    number(20)
)

insert into test_tbl values (9.999)

Выше указано значение 10, а не 9,999. Как я могу сохранить 9.999 в точности как есть?

Спасибо

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

В Oracle вы можете (но не обязаны) указывать точность и масштаб для столбцов типа данных NUMBER. NUMBER(20) является действительным сокращением для NUMBER(20,0), что означает 20 цифр, нет после десятичной точки.

Как это исправить зависит от ваших потребностей. Обычно столбец NUMBER должен быть объявлен просто как NUMBER. Укажите точность и масштаб только в том случае, если у вас есть веские основания для этого.

Например: если ваши числа должны быть ограничены не более чем 20 цифрами перед десятичной запятой и не более чем шестью десятичными разрядами (после десятичной запятой), общая ТОЧНОСТЬ будет 20 + 6 = 26. Затем вы объявите NUMBER(26, 6).

Вы можете изменить столбец, объявленный как NUMBER(20), на NUMBER (если это соответствует вашим потребностям в противном случае), так как при этом изменении не теряется информация. Тем не менее, обратите внимание, что числа, которые УЖЕ сохранены в столбце, имеют УЖЕ УТЕРЯНУЮ информацию, которую нельзя восстановить из таблицы; вам нужно будет обратиться к первоначальному источнику этих чисел, если вам нужно исправить это.

Краткое демо (обратите внимание в последнем выводе, что строка вставлена ​​ДО изменения, значение которого навсегда изменено на 10, восстановление невозможно)

create table test_tbl
(
  amt    number(20)
);

insert into test_tbl values (9.999);

select * from test_tbl;

AMT
---
 10

alter table test_tbl modify (amt number);

insert into test_tbl values (9.999);

select * from test_tbl;

  AMT
-----
   10
9.999
0 голосов
/ 17 июня 2019

Всегда создавайте поля AMOUNT и NUMERIC в качестве типа данных NUMBER без Scale и Precision, если вы не уверены в точности своих полей. Это должно решить вашу проблему.

0 голосов
/ 31 августа 2018

Вы можете попробовать использовать NUMBER(20,18), или BINARY_FLOAT, BINARY_DOUBLE будет больше

NUMBER [(p [, s])] Число с точностью p и масштабом s. Диапазон р: от 1 до 38. Диапазоны s: от -84 до 127. Точность и масштаб указаны в десятичных разрядах.

create table test_tbl
(
   amt NUMBER(20,18)
);

insert into test_tbl values (9.99948489);

Запрос 1 :

SELECT * FROM test_tbl

Результаты

|        AMT |
|------------|
| 9.99948489 |
...