Votre fonction a quelques smallint
paramètres.
Mais dans l'appel, vous utilisez des littéraux numériques supposés être de type integer
.
Un littéral de chaîne ou une constante de chaîne ('123'
) n'est pas tapé immédiatement. Il reste de type "inconnu" jusqu'à ce qu'il soit assigné ou transtypé explicitement.
Cependant, un littéral numérique ou une constante numérique est tapé immédiatement. Le manuel :
Une constante numérique qui ne contient ni point décimal ni exposant est initialement présumée être de type
integer
si sa valeur correspond au typeinteger
(32 bits); sinon, il est présumé être de typebigint
si sa valeur correspond au typebigint
(64 bits); sinon il est pris pour être de typenumeric
. Les constantes qui contiennent des points décimaux et/ou des exposants sont toujours initialement supposées être de typenumeric
.
Voir aussi :
- ERREUR PostgreSQL :la fonction to_tsvector (caractère variable, inconnu) n'existe pas
Solution
Ajouter des conversions explicites pour le smallint
paramètres ou transmettre des littéraux entre guillemets (non typés).
Démo
CREATE OR REPLACE FUNCTION f_typetest(smallint)
RETURNS bool AS 'SELECT TRUE' LANGUAGE sql;
Appel incorrect :
SELECT * FROM f_typetest(1);
Appels corrects :
SELECT * FROM f_typetest('1');
SELECT * FROM f_typetest(smallint '1');
SELECT * FROM f_typetest(1::int2);
SELECT * FROM f_typetest('1'::int2);
db<>jouez ici
Vieux sqlfiddle.