Вашата функция има няколко smallint
параметри.
Но в извикването използвате числови литерали, за които се предполага, че са от тип integer
.
Низов литерал или низова константа ('123'
) не се въвежда веднага. Остава тип "неизвестен", докато не бъде назначен или изрично прехвърлен.
Обаче числов литерал или числова константа се въвежда незабавно. Ръководството:
Числова константа, която не съдържа нито десетична запетая, нито анекспонента, първоначално се предполага, че е тип
integer
ако стойността му отговаря на типinteger
(32 бита); в противен случай се предполага, че е типbigint
ако стойността му отговаря на типbigint
(64 бита); в противен случай се счита, че е типnumeric
. Константите, които съдържат десетични точки и/или експоненти, винаги първоначално се предполагат, че са типnumeric
.
Вижте също:
- ГРЕШКА в PostgreSQL:функция to_tsvector(променлив знак, неизвестен) не съществува
Решение
Добавете изрични прехвърляния за smallint
параметри или предават литерали в кавички (невписани).
Демо
CREATE OR REPLACE FUNCTION f_typetest(smallint)
RETURNS bool AS 'SELECT TRUE' LANGUAGE sql;
Неправилно обаждане:
SELECT * FROM f_typetest(1);
Правилни повиквания:
SELECT * FROM f_typetest('1');
SELECT * FROM f_typetest(smallint '1');
SELECT * FROM f_typetest(1::int2);
SELECT * FROM f_typetest('1'::int2);
db<>цигулка тук
Стар sqlfiddle.