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.