PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Npgsql/ Postgresql:funkcja nie istnieje komunikat o błędzie, gdy tak się dzieje

Pamiętaj, że postgres umożliwia przeciążanie funkcji , więc nie tylko funkcja NAZWA musi istnieć, ale typy parametrów funkcji będą również używane do określenia, którego przeciążenia użyć, np.

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

To nie ta sama funkcja, co

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

itp.

Podczas wywoływania tych funkcji wszystkie nazwy parametrów, typy i prawdopodobnie zamówienia muszą być zgodne, w przeciwnym razie otrzymasz

Dodatkowym problemem, który mnie ciągle gryzie, są reguły uwzględniania wielkości liter w Postgressql podczas definiowania funkcji. Na przykład bez otaczającego "" cudzysłowy, następująca definicja funkcji (przy użyciu domyślnych ustawień w pgAdmin 3):

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

rejestruje funkcję z podpisem:(użyj narzędzia IDE, aby to sprawdzić)

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

W rezultacie każda próba powiązania w C# z

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

nie powiedzie się z błędem. Zamiast tego będziesz musiał powiązać się z parametrami pisanymi małymi literami, tj.

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

Chyba że zdefiniujesz funkcję za pomocą cudzysłowów:

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

Dlatego ważne jest, abyś zgodził się na konwencję wielkości liter w swojej bazie danych / organizacji, a następnie się jej trzymał (wszystkie małe jest dość powszechne)

Alternatywą, choć również podatną na delikatność, jest nie wiązanie w ogóle z nazwanymi parametrami, a zamiast tego użycie pozycji porządkowej parametru, aby go powiązać np.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używanie UUID z EclipseLink i PostgreSQL

  2. Wybierz wszystkie kolumny z wyjątkiem niektórych PostgreSQL

  3. Postgres wybierając aktualne dane godzinowe

  4. Właściwy generator identyfikatorów Hibernate dla kolumny postgres serial/bigserial?

  5. Uzyskaj różne następujące po sobie zakresy dat z nakładających się zakresów dat