Esta es la contestación más acertada que encomtrarás compartir, pero mírala pausadamente y valora si es compatible a tu trabajo.
Solución:
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
.
A string literal o string constante ('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. Por documentación:
Una constante numérica que no contiene punto decimal ni exponente es inicialmente se supuso que era tipo
integer
si su valor se ajusta al tipointeger
(32 bits); de lo contrario, se presume que es de tipo
bigint
si su valor se ajusta al tipobigint
(64 bits); de lo contrario, se toma como tiponumeric
. Siempre se supone inicialmente que las constantes que contienen puntos decimales y/o exponentes son del tiponumeric
.
Más explicaciones y enlaces en esta respuesta relacionada:
- ERROR de PostgreSQL: la función to_tsvector (carácter variable, desconocido) no existe
Solución
Agregar moldes explícitos para el smallint
parámetros o citarlos.
Manifestació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í
Viejo sqlfiddle.