sql >> データベース >  >> RDS >> PostgreSQL

Npgsql / Postgresql:関数が存在する場合、存在しないというエラーメッセージが表示されます

    postgresでは関数のオーバーロード が許可されていることに注意してください 、したがって、関数NAMEが存在する必要があるだけでなく、関数パラメータのタイプも使用するオーバーロードを決定するために使用されます。例:

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

    と同じ機能ではありません
    CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, boolean, varchar)
    

    など

    これらの関数を呼び出すときは、パラメーター名、タイプ、場合によっては順序がすべて一致している必要があります。一致していない場合は、

    を取得します。

    私を悩ませ続けるもう1つの落とし穴は、関数を定義するときのPostgressqlの大文字と小文字を区別するルールです。たとえば、周囲に""がない場合 引用符、次の関数定義(pgAdmin 3のデフォルト設定を使用):

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

    関数を署名で登録します:(これを確認するにはIDEツールを使用します)

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

    その結果、C#で

    にバインドしようとすると
    command.Parameters.Add("Parameter1", NpgsqlDbType.Varchar, 40);
    command.Parameters.Add("parameTer2", NpgsqlDbType.Varchar, 20);
    

    エラーで失敗します。代わりに、すべて小文字のパラメータに対してバインドする必要があります。つまり、

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

    関数を引用符で定義しない限り:

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

    そのため、データベース/組織の大文字と小文字の規則に同意し、それに固執することが重要です(すべて小文字 非常に一般的です)

    別の方法としては、脆弱になりがちですが、名前付きパラメーターとはまったくバインドせず、代わりにパラメーターの序数位置を使用してバインドします。例:

    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. PostgresALTERTABLEの問題

    2. Oracleの文字列を比較する

    3. 再帰クエリを使用したテーブル依存グラフの作成

    4. PHPコードを使用してmysqlテーブルをCSVにエクスポートします