Что @ Лоренц сказал .
Но почему "странное" сообщение об ошибке?
Ваша синтаксическая ошибка (0,8
вместо 0.8
в cour_g=(((upox_sum+epil_sum)/2)*0,8);
) скрывается добавленными бесплатными скобками , которые интерпретируются как ROW
конструкторы - ключевое слово ROW
является необязательным.
Что вы видите в сообщении об ошибке:
ERROR: invalid input syntax for type numeric: "(0.0000000000000000,8)"
... является выражением строки , состоящим из полей: 0.0000000000000000
и 8
.
Без вводящих в заблуждение скобок присваивание:
cour_g=((upox_sum+epil_sum)/2)*0,8; -- still incorrect: 0,8
... вызвало бы другое (более показательное) сообщение об ошибке:
ERROR: query "SELECT ((upox_sum+epil_sum)/2)*0,8" returned 2 columns
потому что запятая (,
) интерпретируется как разделитель столбцов.
Это сообщение также показывает, что PL / pgSQL оценивает каждое голое выражение с помощью (базового и быстрого) оператора SELECT
внутри. Язык по сути является оберткой вокруг ядра SQL. Это объясняет, почему назначения немного дороже, чем можно ожидать от других PL.
Ваше оригинальное утверждение эквивалентно более подробному ROW
синтаксису:
cour_g=ROW(((upox_sum + epil_sum)/2)*0,8); -- still incorrect: 0,8
... что функционально эквивалентно:
cour_g=(SELECT ROW(((upox_sum + epil_sum)/2)*0,8)); -- still incorrect: 0,8
В обоих случаях выдается одно и то же сообщение об ошибке.
Или:
cour_g=(SELECT ((upox_sum + epil_sum)/2)*0,8); -- still incorrect: 0,8
С другим (уже более показательным) сообщением об ошибке:
ERROR: subquery must return only one column
Требуются круглые скобки вокруг вложенного, явного SELECT
. Если вы отбрасываете ненужные SELECT
, удалите с ним заключающие в скобки скобки, или они интерпретируются как конструктор ROW
(с или без шумового слова ROW
).
Так что используйте:
cour_g := (upox_sum + epil_sum) / 2 * 0.8;
Скобки вокруг ((upox_sum+epil_sum)/2)
также излишни, потому что *
и /
имеют одинаковый приоритет оператора и все равно оцениваются слева направо. Но в этом случае добавленные скобки представляют собой безвредный шум (который может или не может помочь читаемости).
или упростить до:
cour_g := (upox_sum + epil_sum) * 0.4;
Тем не менее, поскольку назначения в PL / pgSQL сравнительно дороги, попробуйте применить стиль программирования с меньшим количеством назначений.
И не все бесплатные скобки безвредны.