Uw functie heeft een aantal smallint parameters.
Maar in de aanroep gebruikt u numerieke letterlijke waarden waarvan wordt aangenomen dat ze van het type integer zijn .
Een letterlijke tekenreeks of tekenreeksconstante ('123' ) wordt niet meteen getypt. Het blijft type "onbekend" totdat het expliciet wordt toegewezen of gegoten.
Echter, een numerieke letterlijke of numerieke constante wordt onmiddellijk getypt. De handleiding:
Een numerieke constante die noch een decimaalteken noch een exponent bevat, wordt aanvankelijk verondersteld van het type
integerte zijn als de waarde past in typeinteger(32 bits); anders wordt aangenomen dat het typebigint. is als de waarde past in typebigint(64 bits); anders is het typenumeric. Constanten die decimale punten en/of exponenten bevatten, worden aanvankelijk altijd verondersteld van het typenumericte zijn .
Zie ook:
- PostgreSQL ERROR:functie to_tsvector(karakter variërend, onbekend) bestaat niet
Oplossing
Expliciete casts toevoegen voor de smallint parameters of geef geciteerde (niet-getypte) letterlijke waarden door.
Demo
CREATE OR REPLACE FUNCTION f_typetest(smallint)
RETURNS bool AS 'SELECT TRUE' LANGUAGE sql; Onjuiste oproep:
SELECT * FROM f_typetest(1);
Correcte oproepen:
SELECT * FROM f_typetest('1');
SELECT * FROM f_typetest(smallint '1');
SELECT * FROM f_typetest(1::int2);
SELECT * FROM f_typetest('1'::int2);
db<>viool hier
Oude sqlfiddle.