Как я могу узнать, подходит ли 10385274000: NUMBER (10) для Oracle? - PullRequest
4 голосов
/ 01 августа 2009

Я всю неделю работала над устранением производственной ошибки.

В конце концов я понял, что могу найти запись о виновнике, которая является причиной всего беспорядка.

У меня следующее сообщение об ошибке:

java.sql.SQLException: [BEA][Oracle JDBC Driver][Oracle]ORA-01438: value larger than specified precision allows for this column

Из всей информации, думаю, это могут быть неверные данные, система пытается вставить:

10385274000

В НОМЕР (10)

Как я могу узнать, подходит ли это значение или нет?

Спасибо

EDIT

Согласно предложению Мишеля Тодда:

create table xyz( testfield number( 10 ) );

insert into xyz values( 10385274000 )


Error: ORA-01438: value larger than specified precision allowed for this column

Спасибо, ребята !!!

Спасибо stackoverflow

EDIT

Заметки к себе (чтобы не забыть в чем проблема)

У меня был этот продукт Oracle, который хранит в таблице базы данных время события

START_TIME|END_TIME

Оказывается, каждую ночь он копирует эту информацию в другую таблицу, но выполняет процесс преобразования в процессе. Хранится как:

TOTALTIME

Проблема возникает, когда это поле рассчитывается путем вычитания ENDTIME - STARTTIME. Полученный номер сохраняется в этом столбце, который определяется как: NUMBER (10)

Что ж, получается, если END_TIME-START_TIME слишком далеко во времени (около 4 месяцев или около того), значение (в миллисекундах) будет настолько большим, что не поместится в целевой колонке (я думаю, что оно имеет что-то вроде endTime.getTime () - startTime.getTime () внутри кода)

Все это звучит слишком легко и слишком глупо сейчас, но мне потребовалось 4 дня +, чтобы выяснить это, потому что, поскольку это закрытое приложение, я понятия не имел, что происходит, единственное, что у меня было, было трассировка стека.

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

Когда я это сделал, у меня возникла та же ошибка в моем "ручном коде-миграторе", и я узнал, как ее решить!

1 Ответ

11 голосов
/ 01 августа 2009

Число 10 в НОМЕРЕ (10) указывает размер поля. Это означает, что поле может содержать число длиной до 10 символов. Ваш номер имеет 11 цифр, и, таким образом, значение слишком велико, чтобы соответствовать. Все, что меньше (<) 10 миллиардов (10 000 000 000), может быть вставлено без проблем. Это то, что вам нужно проверить, если вы хотите проверить значение перед вставкой. </p>

...