Din funktion har ett par smallint parametrar.
Men i samtalet använder du numeriska bokstaver som antas vara typ integer .
En strängliteral eller strängkonstant ('123' ) skrivs inte omedelbart. Den förblir typ "okänt" tills den tilldelas eller castas explicit.
Däremot en numerisk bokstavlig eller numerisk konstant skrivs omedelbart. Manualen:
En numerisk konstant som varken innehåller en decimalpunkt eller anexponent förmodas initialt vara typen
integerom dess värde passar in i typeninteger(32 bitar); annars antas det vara typbigintom dess värde passar in typbigint(64 bitar); annars antas det vara typnumeric. Konstanter som innehåller decimaler och/eller exponenter antas alltid initialt vara typnumeric.
Se även:
- PostgreSQL FEL:funktion to_tsvector (tecken varierar, okänt) finns inte
Lösning
Lägg till explicita casts för smallint parametrar eller passera citerade (otypade) bokstaver.
Demo
CREATE OR REPLACE FUNCTION f_typetest(smallint)
RETURNS bool AS 'SELECT TRUE' LANGUAGE sql; Felaktigt samtal:
SELECT * FROM f_typetest(1);
Rätt samtal:
SELECT * FROM f_typetest('1');
SELECT * FROM f_typetest(smallint '1');
SELECT * FROM f_typetest(1::int2);
SELECT * FROM f_typetest('1'::int2);
db<>spela här
Gammal sqlfiddle.