Числовое значение c Переполнение поля при вычитании из числового значения c в Postgresql - PullRequest
0 голосов
/ 09 марта 2020

Относительно новый для Postgres, и возникли проблемы с вычитанием значения из типа значения NUMERI C (4,2) в операторе обновления. Следующий код:

UPDATE  Tickets
SET     ticketPrice = ticketPrice-3
FROM    Showings
WHERE   Showings.priceCode = modTicket

Вызывает следующую ошибку:

ERROR: numeric field overflow
  Detail: A field with precision 4, scale 2 must round to an absolute value less than 10^2.

ticketPrice имеет тип значения NUMERI C (4,2). Как мне сделать это вычитание? Нет никаких возможных значений, которые вычитало бы, что это вычитание простиралось бы после двух десятичных знаков или в отрицаниях вообще. Единственные значения, к которым применяется это вычитание: 5,00, 3,50 и 8,00.

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Вы можете попытаться выяснить источник ошибки следующим образом:

do $$
    declare r record;
    foo numeric(4,2);
begin
    for r in (select t.* from Tickets as t, Showings as s where s.priceCode = t.modTicket) loop
        foo := r.ticketPrice - 3;
    end loop;
exception
    when others then raise notice '%', r;
    raise;
end $$;

Пример:

do $$
    declare r record;
    foo numeric(1);
begin
    for r in (with t(x,y) as (values(1,2),(3,4)) select * from t) loop
        foo := r.y + 7;
    end loop;
exception
    when others then raise notice '%', r;
    raise;
end $$;

Вывод:

NOTICE:  (3,4)
ERROR:  numeric field overflow
DETAIL:  A field with precision 1, scale 0 must round to an absolute value less than 10^1.
CONTEXT:  PL/pgSQL function inline_code_block line 1 at assignment
0 голосов
/ 09 марта 2020
UPDATE  Tickets as t
SET     ticketPrice = ticketPrice-3
FROM    Showings as s
WHERE   s.priceCode = t.modTicket

Документация запроса ОБНОВЛЕНИЕ

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