Получение ошибки переполнения чисел для меньших чисел, но успех для больших чисел - PullRequest
0 голосов
/ 05 сентября 2018

Моя функция тестирования:

create or replace FUNCTION test
RETURN NUMBER
AS
  v_count   number(15);
  v_msisdn  number(15);
BEGIN
  v_msisdn:= 225952 * 10000;
  -- v_msisdn:=50510060853 * 10000;

  return v_msisdn;
END;

Когда я выполняю функцию как

select test() from dual;

Я получаю ошибку

1426. 00000 -  "numeric overflow"
*Cause:    Evaluation of an value expression causes an overflow/underflow.

Однако, если я обновлю

v_msisdn:=50510060853 * 10000;

Я не получаю сообщение об ошибке.

Может ли кто-нибудь объяснить это поведение, поскольку второй запрос является большим числом?

1 Ответ

0 голосов
/ 05 сентября 2018

Это можно исправить, приведя один из целочисленных литералов к integer или number:

v_msisdn:= cast(225952 as integer) * 10000;

Маленькие целочисленные литералы обрабатываются как pls_integer по соображениям производительности. К сожалению, этот тип вызывает исключение при переполнении:

Вычисление с двумя значениями PLS_INTEGER, которое выходит за пределы диапазона PLS_INTEGER, вызывает исключение переполнения, даже если вы присваиваете результат типу данных NUMBER. Для вычислений вне диапазона PLS_INTEGER используйте INTEGER, предопределенный подтип типа данных NUMBER.

Во втором примере одно из значений (50510060853) не входит в диапазон pls_integer и, таким образом, интерпретируется как integer.

Вот аналогичный вопрос в AskTom: Номер типа данных приводит к переполнению числа, хотя значение достаточно мало

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...