PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Npgsql/Postgresql:Fehlermeldung „Funktion existiert nicht“, wenn dies der Fall ist

Beachten Sie, dass Postgres Funktionsüberladung zulässt , also muss nicht nur die Funktion NAME existieren, sondern die Typen der Funktionsparameter werden auch verwendet, um zu bestimmen, welche Überladung verwendet werden soll, z. B.

CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, varchar, boolean)   

Ist nicht die gleiche Funktion wie

CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, boolean, varchar)

usw.

Beim Aufruf dieser Funktionen müssen die Parameternamen, Typen und ggf. Reihenfolgen übereinstimmen, sonst erhalten Sie das

Ein weiterer Fallstrick, der mich immer wieder nervt, sind die Groß-/Kleinschreibungsregeln von Postgressql bei der Definition von Funktionen. Zum Beispiel ohne umgebendes "" Anführungszeichen, die folgende Funktionsdefinition (unter Verwendung der Standardeinstellungen in pgAdmin 3):

CREATE FUNCTION MySchema.MyFunction(Parameter1 VARCHAR(40), parameTer2 VARCHAR(20))

registriert die Funktion mit der Signatur:(verwenden Sie ein IDE-Tool, um dies zu überprüfen)

myschema.myfunction(parameter1 VARCHAR(40), parameter2 VARCHAR(20))

Daher wird jeder Versuch in C#, an

zu binden
command.Parameters.Add("Parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameTer2", NpgsqlDbType.Varchar, 20);

wird mit dem Fehler fehlschlagen. Stattdessen müssen Sie sich an die Parameter binden, die nur in Kleinbuchstaben geschrieben sind, d. h.

command.Parameters.Add("parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameter2", NpgsqlDbType.Varchar, 20);

Es sei denn, Sie definieren die Funktion mit Anführungszeichen:

CREATE FUNCTION "MySchema"."MyFunction"("Parameter1" VARCHAR(40), "parameTer2" VARCHAR(20))

Deshalb ist es wichtig, dass Sie sich in Ihrer Datenbank / Organisation auf eine Gehäusekonvention einigen und sich dann daran halten (alles Kleinbuchstaben ist durchaus üblich)

Eine Alternative, obwohl auch anfällig für Brüchigkeit, besteht darin, überhaupt keine Bindung mit benannten Parametern vorzunehmen und stattdessen die Ordinalposition des Parameters zu verwenden, um ihn z. B.

zu binden
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)