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>

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

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

ORA-06512: при строковой строке

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

Ответ 7

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

v_departmentid departments.department_id%TYPE;

НЕ нравится ниже:

v_departmentid NUMBER(4)

Ответ 8

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

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

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