Как я могу узнать, вписывается ли 10385274000 в:ЧИСЛО (10) для Oracle?

StackOverflow https://stackoverflow.com/questions/1215535

Вопрос

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

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

Я получил следующее сообщение об ошибке:

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) могут быть вставлены без проблем.Это то, что вам нужно проверить, если вы хотите проверить значение перед вставкой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top