Vaše funkce má několik smallint parametry.
Ve volání však používáte číselné literály, o kterých se předpokládá, že jsou typu integer .
Řetězcový literál nebo řetězcová konstanta ('123' ) se nezadá okamžitě. Zůstává typu „unknown“, dokud není přiřazen nebo explicitně odeslán.
Nicméně číselný literál nebo číselná konstanta je napsáno okamžitě. Manuál:
Číselná konstanta, která neobsahuje desetinnou čárku ani exponent, se zpočátku považuje za typ
integerpokud se jeho hodnota vejde do typuinteger(32 bitů); jinak se předpokládá, že jde o typbigintpokud se jeho hodnota vejde do typubigint(64 bitů); jinak to bude typnumeric. Konstanty, které obsahují desetinné čárky a/orexponenty, se vždy zpočátku považují za typnumeric.
Viz také:
- CHYBA PostgreSQL:funkce to_tsvector(znak různý, neznámý) neexistuje
Řešení
Přidejte explicitní přetypování pro smallint parametry nebo předat literály v uvozovkách (bez typu).
Ukázka
CREATE OR REPLACE FUNCTION f_typetest(smallint)
RETURNS bool AS 'SELECT TRUE' LANGUAGE sql; Nesprávný hovor:
SELECT * FROM f_typetest(1);
Správná volání:
SELECT * FROM f_typetest('1');
SELECT * FROM f_typetest(smallint '1');
SELECT * FROM f_typetest(1::int2);
SELECT * FROM f_typetest('1'::int2);
db<>zde hrajte
Starý sqlfiddle.