Su función tiene un par de smallint
parámetros.
Pero en la llamada, está utilizando literales numéricos que se supone que son de tipo integer
.
Un literal de cadena o una constante de cadena ('123'
) no se escribe inmediatamente. Permanece del tipo "desconocido" hasta que se asigna o emite explícitamente.
Sin embargo, un literal numérico o constante numérica se escribe inmediatamente. El manual:
Una constante numérica que no contiene un punto decimal ni un exponente inicialmente se supone que es de tipo integer
si su valor se ajusta al tipo integer
(32 bits); de lo contrario, se supone que es de tipo bigint
si su valor cabe en el tipo bigint
(64 bits); de lo contrario, se considera que es de tipo numeric
. Siempre se supone inicialmente que las constantes que contienen puntos decimales y/o exponentes son de tipo numeric
.
Ver también:
- ERROR de PostgreSQL:la función to_tsvector (carácter variable, desconocido) no existe
Solución
Agregue conversiones explícitas para el smallint
parámetros o pasar literales entrecomillados (sin tipo).
Demostración
CREATE OR REPLACE FUNCTION f_typetest(smallint)
RETURNS bool AS 'SELECT TRUE' LANGUAGE sql;
Llamada incorrecta:
SELECT * FROM f_typetest(1);
Llamadas correctas:
SELECT * FROM f_typetest('1');
SELECT * FROM f_typetest(smallint '1');
SELECT * FROM f_typetest(1::int2);
SELECT * FROM f_typetest('1'::int2);
db<>violín aquí
Sqlfiddle antiguo.