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.