Din funktion har et par smallint
parametre.
Men i opkaldet bruger du numeriske bogstaver, der formodes at være typen integer
.
En strengliteral eller strengkonstant ('123'
) skrives ikke med det samme. Det forbliver typen "ukendt", indtil det tildeles eller castes eksplicit.
Dog en numerisk bogstavelig eller numerisk konstant tastes med det samme. Manualen:
En numerisk konstant, der hverken indeholder et decimaltegn eller en aneksponent, antages oprindeligt at være typen integer
hvis dens værdi passer til typen integer
(32 bit); ellers formodes det at være typebigint
hvis dens værdi passer ind i typen bigint
(64 bit); ellers antages det at være type numeric
. Konstanter, der indeholder decimaltegn og/eller eksponenter, antages altid i første omgang at være typen numeric
.
Se også:
- PostgreSQL FEJL:funktion to_tsvector (tegn varierende, ukendt) findes ikke
Løsning
Tilføj eksplicitte casts til smallint
parametre eller bestå citerede (utypede) bogstaver.
Demo
CREATE OR REPLACE FUNCTION f_typetest(smallint)
RETURNS bool AS 'SELECT TRUE' LANGUAGE sql;
Forkert opkald:
SELECT * FROM f_typetest(1);
Korrekte opkald:
SELECT * FROM f_typetest('1');
SELECT * FROM f_typetest(smallint '1');
SELECT * FROM f_typetest(1::int2);
SELECT * FROM f_typetest('1'::int2);
db<>spil her
Gamle sqlfiddle.