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

Estado SQL:42883, Nenhuma função corresponde ao nome e aos tipos de argumento fornecidos. Mas essa função realmente existe


Provavelmente uma questão de esquema vs. esquema search_path . A função é criada no esquema padrão do usuário criador. Se não estiver no search_path do usuário atual, não é visível.

Detalhes:

Normalmente, você criaria funções públicas no esquema public e ter esse esquema no search_path de todos .
CREATE OR REPLACE FUNCTION public.fun_validatepost(integer, integer)
  RETURNS integer AS
$BODY$
...
$BODY$ LANGUAGE plpgsql;
ALTER FUNCTION public.fun_validatepost(integer, integer) OWNER TO postgres;

A qualificação de esquema só é necessária se public não é o esquema padrão de qualquer maneira.

Além disso, seu GRANT comandos não fazem sentido. O EXECUTE privilégio para funções é concedido a public por padrão. E assim que você conceder a public , não há necessidade de conceder a outros usuários. Especialmente para não postgres , que é o OWNER de qualquer maneira e um superusuário também. O manual:

Você precisa conceder USAGE no SCHEMA onde a função é criada. O public esquema concede USAGE para public (todos) por padrão.
Além 1
Transmitindo para integer não muda nada aqui porque um literal numérico sem ponto decimal é forçado a inteiro automaticamente. Detalhes sobre constantes no manual.
Além 2
Considere urgentemente atualizar para uma versão atual do Postgres. Seu software está completamente desatualizado.