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
integer
te 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 typenumeric
te 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.