Вашата функция има няколко 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.