PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Keine Funktion stimmt mit dem angegebenen Namen und den angegebenen Argumenttypen überein

Ihre Funktion hat ein paar smallint parameter.
Im Aufruf verwenden Sie jedoch numerische Literale, von denen angenommen wird, dass sie vom Typ integer sind .

Ein Zeichenfolgenliteral oder eine Zeichenfolgenkonstante ('123' ) wird nicht sofort eingegeben. Es bleibt Typ "unbekannt", bis es explizit zugewiesen oder gecastet wird.

Allerdings ein numerisches Literal oder eine numerische Konstante wird sofort getippt. Das Handbuch:

Eine numerische Konstante, die weder einen Dezimalpunkt noch einen Exponenten enthält, wird zunächst als Typ integer angenommen Wenn sein Wert passt, geben Sie integer ein (32 Bit); andernfalls wird angenommen, dass es sich um den Typbigint handelt wenn sein Wert hineinpasst, geben Sie bigint ein (64 Bit); andernfalls wird angenommen, dass es vom Typ numeric ist . Konstanten, die Dezimalpunkte und/oder Exponenten enthalten, werden zunächst immer vom Typ numeric angenommen .

Siehe auch:

  • PostgreSQL-FEHLER:Funktion to_tsvector(Zeichen variiert, unbekannt) existiert nicht

Lösung

Fügen Sie explizite Umwandlungen für smallint hinzu Parameter oder übergeben Sie Literale in Anführungszeichen (nicht typisiert).

Demo

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

Falscher Aufruf:

SELECT * FROM f_typetest(1);

Richtige Aufrufe:

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

db<>hier fummeln
Altes sqlfiddle.