Прежде всего, позвольте мне разобраться с точностью и масштабом. Согласно документации указано:
Для числовых столбцов вы можете указать столбец как:
имя_ столбца NUMBER
При желании вы также можете указать точность
(общее количество цифр) и масштаб (количество цифр справа от
десятичная точка):
имя_ столбца NUMBER (точность, масштаб)
В вашем случае:
frequency NUMBER(10,10)
Это означает, что общее количество цифр равно 10, и это означает, что столбец может содержать значения из:
0.0000000001
до:
9999999999
Сюда входят целые числа до 9999999999 (10 девяток) и значения с плавающей запятой от 0,0000000001 (9 нулей и 1 в конце).
Теперь, когда мы это знаем, давайте перейдем к проблеме ..
Вам нужен этот запрос, чтобы никогда не ошибаться с ORA-01438
:
update table1 set frequency = num/denom where id>XXX;
Вы можете выполнить следующую проверку по времени обновления:
update table1
set frequency = CASE LENGTH(TRUNC(num/denom)) >=10
THEN TRUNC(num/denom, 10)
ELSE
ROUND(num/denom), 10 - LENGTH(TRUNC(num/denom))) --TRUNC
END
where id>XXX;
Что бы это сделать, это проверить:
1. Если вся часть деления больше или равна 10; в этом случае верните только первые 10 цифр (TRUNCATE
).
2. Если вся часть меньше 10; в этом случае ROUND
результат с десятичными разрядами "10 - LENGTH_OF_WHOLE_PART
", но с точностью до 10, что соответствует столбцу.
* Примечание: ROUND
выше на самом деле ROUND
результат, что дает вам неточное значение. Если вам нужно получить необработанное усечение результата, используйте TRUNCATE
вместо ROUND
выше!
Приветствия