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.