Как я могу узнать, вписывается ли 10385274000 в:ЧИСЛО (10) для Oracle?
Вопрос
Я работал целую неделю над устранением производственной ошибки.
В конце концов я дошел до того, что могу найти запись-виновницу, которая вызывает весь этот беспорядок.
Я получил следующее сообщение об ошибке:
java.sql.SQLException: [BEA][Oracle JDBC Driver][Oracle]ORA-01438: value larger than specified precision allows for this column
В конечном итоге, исходя из всей информации, я думаю, что это могут быть неправильные данные, система пытается вставить:
10385274000
В ЧИСЛО (10)
Как я могу узнать, подходит ли это значение или нет?
Спасибо
Редактировать
Согласно предложению Мишеля Тодда:
create table xyz( testfield number( 10 ) );
insert into xyz values( 10385274000 )
Error: ORA-01438: value larger than specified precision allowed for this column
Спасибо вам, ребята!!!
Спасибо вам, stackoverflow
Редактировать
Заметки для себя ( чтобы не забывать , в чем была проблема )
У меня был этот продукт Oracle, который хранит в таблице базы данных время события
START_TIME|END_TIME
Оказывается, каждую ночь он создает резервные копии этой информации в другую таблицу, но при этом выполняет trnsformation.Он действительно хранится как:
TOTALTIME
Проблема возникает, когда это поле вычисляется путем вычитания ENDTIME - STARTTIME.Результирующее число сохраняется в этом столбце, который определяется как: ЧИСЛО (10)
Ну, оказывается, если END_TIME-START_TIME слишком далеки по времени (около 4 месяцев или около того), значение (в миллисекундах) будет НАСТОЛЬКО большим, что не поместится в целевой столбец (я предполагаю, что внутри кода есть что-то вроде EndTime.getTime() - startTime.getTime() )
Сейчас все это звучит слишком просто и глупо, но мне потребовалось более 4 дней, чтобы это выяснить, потому что, поскольку это закрытое приложение, я понятия не имел, что происходит, единственное, что у меня есть, - это stacktrace.
Мне пришлось перепроектировать (в СТАРОМ смысле этого слова, вручную и, очевидно, без использования исходного кода) весь процесс, чтобы выяснить это.
Когда я это сделал, у меня возникла та же ошибка в моем "ручном коде миграции", и я выяснил, как ее решить!
Решение
Число 10 в NUMBER(10) указывает размер поля.Это означает, что поле может содержать число длиной до 10 символов.Ваш номер состоит из 11 цифр, и поэтому его значение слишком велико, чтобы соответствовать.Что- нибудь меньшее, чем (<) 10 миллиардов (10 000 000 000) могут быть вставлены без проблем.Это то, что вам нужно проверить, если вы хотите проверить значение перед вставкой.