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

Npgsql/ Postgresql:função não existe mensagem de erro quando existe


Observe que o postgres permite sobrecarga de função , portanto, não apenas a função NAME precisa existir, mas os tipos dos parâmetros da função também serão usados ​​para determinar qual sobrecarga usar, por exemplo,
CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, varchar, boolean)   

Não é a mesma função que
CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, boolean, varchar)

etc.

Ao chamar essas funções, os nomes dos parâmetros, tipos e possivelmente pedidos devem corresponder, caso contrário, você obterá o

Uma pegadinha adicional que continua me mordendo são as regras de diferenciação de maiúsculas e minúsculas do Postgressql ao definir funções. Por exemplo, sem qualquer "" ao redor aspas, a seguinte definição de função (usando as configurações padrão no pgAdmin 3):
CREATE FUNCTION MySchema.MyFunction(Parameter1 VARCHAR(40), parameTer2 VARCHAR(20))

registra a função com a assinatura:(use uma ferramenta IDE para verificar isso)
myschema.myfunction(parameter1 VARCHAR(40), parameter2 VARCHAR(20))

Como resultado, qualquer tentativa em C# de se ligar a
command.Parameters.Add("Parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameTer2", NpgsqlDbType.Varchar, 20);

falhará com o erro. Em vez disso, você precisará vincular os parâmetros em letras minúsculas, ou seja,
command.Parameters.Add("parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameter2", NpgsqlDbType.Varchar, 20);

A menos que você defina a Função com aspas:
CREATE FUNCTION "MySchema"."MyFunction"("Parameter1" VARCHAR(40), "parameTer2" VARCHAR(20))

É por isso que é importante que você concorde com uma convenção de caixa em seu banco de dados/organização e cumpra-a (todos em minúsculas é bastante comum)

Uma alternativa, embora também propensa a ser frágil, é não vincular com parâmetros nomeados e, em vez disso, usar a posição ordinal do parâmetro, para vinculá-lo, por exemplo
var myParameter = new NpgsqlParameter
{
    // Leave `ParameterName` out entirely,
    Direction = ParameterDirection.Input,
    IsNullable = false,
    NpgsqlDbType = NpgsqlDbType.Varchar,
    Size = 20,
    Value = "SomeValue"
};
command.Parameters.Add(myParameter);
// Same for other parameter(s)