sql >> Databáze >  >> RDS >> PostgreSQL

Npgsql/ Postgresql:funkce neexistuje chybová zpráva, když existuje

Upozorňujeme, že postgres umožňuje přetížení funkcí , takže nejen že funkce NAME musí existovat, ale typy parametrů funkce budou také použity k určení, jaké přetížení použít, např.

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

Není stejná funkce jako

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

atd.

Při volání těchto funkcí se musí všechny názvy parametrů, typy a případně objednávky shodovat, jinak dostanete

Dalším problémem, který mě neustále kousá, jsou pravidla Postgressql pro rozlišování velkých a malých písmen při definování funkcí. Například bez jakéhokoli okolního "" uvozovky, následující definice funkce (s použitím výchozího nastavení v pgAdmin 3):

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

zaregistruje funkci s podpisem:(k ověření použijte nástroj IDE)

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

Výsledkem je jakýkoli pokus v C# o vazbu na

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

selže s chybou. Místo toho se budete muset vázat na parametry s malými písmeny, tj.

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

Pokud nedefinujete funkci s uvozovkami:

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

Proto je důležité, abyste se ve své databázi/organizaci dohodli na konvenci velkých a malých písmen a pak se jí drželi ( všechna malá písmena je docela běžné)

Alternativou, i když také náchylnou ke křehkosti, je nesvázat se s pojmenovanými parametry vůbec a místo toho použít ordinální pozici parametru, např.

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)


  1. Django Different nefunguje

  2. Nelze spustit mysql server v ubuntu

  3. Sdružování připojení je pomalejší než udržování jednoho připojení otevřeného

  4. Proveďte více dotazů v jediném příkazu Oracle v C#