PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Aucune fonction ne correspond au nom donné et aux types d'arguments

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 type integer (32 bits); sinon, il est présumé être de type bigint si sa valeur correspond au type bigint (64 bits); sinon il est pris pour être de type numeric . Les constantes qui contiennent des points décimaux et/ou des exposants sont toujours initialement supposées être de type numeric .

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.