PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Nessuna funzione corrisponde al nome specificato e ai tipi di argomento

La tua funzione ha un paio di smallint parametri.
Ma nella chiamata stai usando valori letterali numerici che si presume siano di tipo integer .

Una stringa letterale o una costante stringa ('123' ) non viene digitato immediatamente. Rimane di tipo "sconosciuto" finché non viene assegnato o lanciato in modo esplicito.

Tuttavia, un valore letterale numerico o una costante numerica viene digitato immediatamente. Il manuale:

Si presume che una costante numerica che non contenga né un punto decimale né un esponente inizialmente sia di tipo integer se il suo valore rientra nel tipo integer (32 bit); altrimenti si presume che sia di tipo bigint se il suo valore rientra nel tipo bigint (64 bit); in caso contrario è di tipo numeric . Inizialmente si presume sempre che le costanti che contengono punti decimali e/o esponenti siano di tipo numeric .

Vedi anche:

  • ERRORE PostgreSQL:la funzione to_tsvector(carattere variabile, sconosciuto) non esiste

Soluzione

Aggiungi cast espliciti per smallint parametri o passare letterali tra virgolette (non tipizzati).

Dimostrazione

CREATE OR REPLACE FUNCTION f_typetest(smallint)
  RETURNS bool AS 'SELECT TRUE' LANGUAGE sql;

Chiamata errata:

SELECT * FROM f_typetest(1);

Chiamate corrette:

SELECT * FROM f_typetest('1');
SELECT * FROM f_typetest(smallint '1');
SELECT * FROM f_typetest(1::int2);
SELECT * FROM f_typetest('1'::int2);

db<>gioca qui
Sqlfiddle vecchio.