ORA-01438: значение больше указанной точности позволяет для этого столбца

Иногда мы получаем следующую ошибку из базы данных нашего партнера:

<i>ORA-01438: value larger than specified precision allows for this column</i>

Полный ответ выглядит следующим образом:

<?xml version="1.0" encoding="windows-1251"?>
<response>
  <status_code></status_code>
  <error_text>ORA-01438: value larger than specified precision allows for this column ORA-06512: at &quot;UMAIN.PAY_NET_V1_PKG&quot;, line 176 ORA-06512: at line 1</error_text>
  <pay_id>5592988</pay_id>
  <time_stamp></time_stamp>
</response>

Что может быть причиной этой ошибки?

9 ответов

Число, которое вы пытаетесь сохранить, слишком велико для поля. Посмотрите на МАСШТАБ и ТОЧНОСТЬ. Разница между ними заключается в количестве цифр перед десятичной точкой, которое вы можете сохранить.

select cast (10 as number(1,2)) from dual
             *
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column

select cast (15.33 as number(3,2)) from dual
             *
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column

Все на нижнем конце усекается (молча)

select cast (5.33333333 as number(3,2)) from dual;
CAST(5.33333333ASNUMBER(3,2))
-----------------------------
                         5.33

Ошибка, кажется, не в символьном поле, а в числовом. (Если бы речь шла о строковой проблеме, такой как WW, вы получили бы "слишком большое значение" или что-то подобное.) Возможно, вы используете больше цифр, чем допустимо, например, 1,000000001 в столбце, определенном как число (10,2).

Посмотрите на исходный код, упомянутый в WW, чтобы выяснить, какой столбец может вызывать проблему. Затем по возможности проверьте данные, которые там используются.

В дополнение к предыдущим ответам следует отметить, что в столбце, определенном как VARCHARS(10), будет храниться 10 байтов, а не 10 символов, если вы не определите его как VARCHAR2 (10 CHAR)

[Вопрос ОП, похоже, связан с числом... это на тот случай, если у кого-то еще есть похожая проблема]

К сведению: нарушения числового поля приведут к ORA-01438: значение, превышающее указанную точность, разрешенную для этого столбца

Нарушения длины поля VARCHAR2 приведут к ORA-12899: слишком большое значение для столбца...

Oracle различает типы данных столбца на основе кода ошибки и сообщения.

Это указывает на то, что вы пытаетесь поместить что-то слишком большое в столбец. Например, у вас есть столбец VARCHAR2(10), и вы вводите 11 символов. То же самое с номером.

Это происходит в строке 176 пакета UMAIN. Вы должны пойти и посмотреть на это, чтобы увидеть, что это такое. Надеемся, что вы можете найти его в вашем контроле исходного кода (или из user_source). Более поздние версии Oracle лучше сообщают об этой ошибке, сообщая, какой столбец и какое значение.

С http://ora-01438.ora-code.com/ (окончательный ресурс за пределами поддержки Oracle):

ORA-01438: значение, превышающее указанную точность, разрешенную для этого столбца
Причина: при вставке или обновлении записей было введено числовое значение, превышающее точность, определенную для столбца.
Действие: введите значение, соответствующее точности числового столбца, или используйте параметр MODIFY с командой ALTER TABLE, чтобы увеличить точность.

http://ora-06512.ora-code.com/:

ORA-06512: в строке
Причина: сообщение Backtrace, поскольку стек разматывается необработанными исключениями.
Действие: Исправьте проблему, вызывающую исключение, или напишите обработчик исключения для этого условия. Или вам может потребоваться связаться с администратором вашего приложения или администратором базы данных.

Хорошей практикой может быть определение переменных, как показано ниже:

v_departmentid departments.department_id%TYPE;

НЕ как ниже:

v_departmentid NUMBER(4)

У меня была одна проблема, и это было ужасно сложно, это то, что вызов OCI для описания атрибутов столбца ведет себя по-разному в зависимости от версий Oracle. Описание простого столбца NUMBER, созданного без каких-либо предварительных или масштабных значений, возвращает разность 9i, 10g и 11g

Также можно получить этот код ошибки, если вы используете PHP и привязанные целочисленные переменные (oci_bind_by_name с SQLT_INT). Если вы попытаетесь вставить NULL через связанную переменную, то вы получите эту ошибку или иногда вставляется значение 2 (что еще хуже).

Чтобы решить эту проблему, вы должны связать переменную как строку (SQLT_CHR) с фиксированной длиной. Перед вставкой NULL должен быть преобразован в пустую строку (равно NULL в Oracle), а все остальные целочисленные значения должны быть преобразованы в его строковое представление.

Другие вопросы по тегам