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
integer
pokud se jeho hodnota vejde do typuinteger
(32 bitů); jinak se předpokládá, že jde o typbigint
pokud 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.