sql >> Base de Datos >  >> RDS >> PostgreSQL

Ninguna función coincide con el nombre dado y los tipos de argumentos

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.