PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Nenhuma função corresponde ao nome e tipos de argumento fornecidos


Sua função tem alguns smallint parâmetros.
Mas na chamada, você está usando literais numéricos que se presume serem do tipo integer .

Um literal de string ou constante de string ('123' ) não é digitado imediatamente. Permanece tipo "desconhecido" até que seja atribuído ou convertido explicitamente.

No entanto, um literal numérico ou uma constante numérica é digitado imediatamente. O manual:

Uma constante numérica que não contém um ponto decimal nem um expoente é inicialmente presumida como sendo do tipo integer se seu valor couber no tipo integer (32 bits); caso contrário, presume-se que seja do tipobigint se seu valor se encaixa no tipo bigint (64 bits); caso contrário, é considerado o tipo numeric . Constantes que contêm pontos decimais e/ou expoentes são sempre inicialmente presumidas como sendo do tipo numeric .

Veja também:
  • ERRO do PostgreSQL:a função to_tsvector(variação de caracteres, desconhecido) não existe

Solução


Adicione casts explícitos para o smallint parâmetros ou passar literais entre aspas (sem tipo).

Demonstração

CREATE OR REPLACE FUNCTION f_typetest(smallint)
  RETURNS bool AS 'SELECT TRUE' LANGUAGE sql;

Chamada incorreta:
SELECT * FROM f_typetest(1);

Chamadas corretas:
SELECT * FROM f_typetest('1');
SELECT * FROM f_typetest(smallint '1');
SELECT * FROM f_typetest(1::int2);
SELECT * FROM f_typetest('1'::int2);

db<>mexa aqui
Antigo sqlfiddle.