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.