Postgresql ошибка функция не существует

You have defined the last parameter as an OUT parameter, that means you can’t pass a value for it.

You need to use:

select loginattempt ('Jon.Jones88@gmail.com','+_@kjhfdb987', now());

As you are not writing to the parameter attempts I don’t see a reason to define it as an out parameter to begin with. You can simply return the value if you need it:

create or replace function loginAttempt (u_email character varying, u_password character varying, u_date_time timestamptz, u_attempt smallint) 
  returns smallint 
AS $$
BEGIN
  INSERT INTO login_attempts (typed_password, date_time, attempt_nu, email) 
  VALUES (u_password, u_date_time, u_attempt, u_email);
  IF u_attempt = 3 THEN 
    INSERT INTO warnings (u_email,u_password) VALUES (u_email,u_password);
  END IF;
  return u_attempt;
END;
$$ LANGUAGE plpgsql;

As the value 1 is assumed to be an integer, you need to cast that value when calling the function:

select loginattempt ('Jon.Jones88@gmail.com','+_@kjhfdb987', now(), 1::smallint);

Online example: https://rextester.com/YNIQ55561

As the documentation says:

The trigger function must be defined before the trigger itself can be
created. The trigger function must be declared as a function taking
no arguments and returning type trigger
. (The trigger function
receives its input through a specially-passed TriggerData structure,
not in the form of ordinary function arguments.)

The function you have declared is:

insertIntoAutoIncrementExample(companyname text,location text) ... returns void

so it does not fit both in the return type and in the argument types.
A trigger function does not take arguments but can access the values inserted or changed in the row variables NEW and OLD. They get automatically defined in plpgsql, see Trigger procedures in the plpgsql chapter for details and examples.

Concerning the error message:

function insertintoautoincrementexample() does not exist

it means: this function name, with an empty list of arguments, does not exist.
The presence of parentheses around nothing is relevant, because in postgresql, functions always go with their argument types:
foobar(int) is not the same function than foobar(), or foobar(int,int) or foobar(text).

Почесывая голову от этого. Есть похожий вопрос, который может быть связан с «функция не существует», но я действительно думаю, что она существует, и функция PostgreSQL не существует, но ответ (ы) не кажется очень очевидным. PostgreSQL 9.5.

У меня есть запрос членства на основе Npgsql, который выглядит следующим образом:

using (var conn = new NpgsqlConnection(ConnectionString))
{
    conn.Open();
    using (var comm = new NpgsqlCommand("get_user_by_username", conn))
    {
        comm.CommandType = CommandType.StoredProcedure;
        comm.Parameters.Add("_user_name", NpgsqlDbType.Varchar, 250).Value = username;
        comm.Parameters.Add("_application_name", NpgsqlDbType.Varchar, 250).Value = _ApplicationName;
        comm.Parameters.Add("_online", NpgsqlDbType.Boolean).Value = userIsOnline;
        using (var reader = comm.ExecuteReader())
        {
            return GetUsersFromReader(reader).OfType<MembershipUser>().FirstOrDefault();
        }
    }
}

Эта функция существует в моем postgresql db как:

CREATE OR REPLACE FUNCTION public.get_user_by_username(
    _user_name character varying,
    _application_name character varying,
    _online boolean)
  RETURNS SETOF user_record AS
$BODY$begin

if _online then
    return query
    update users
    set
        last_activity = current_timestamp
    where
        lower(application_name) = lower(_application_name)
        and lower(user_name) = lower(_user_name)
    returning
        user_id,
        user_name,
        last_activity,
        created,
        email,
        approved,
        last_lockout,
        last_login,
        last_password_changed,
        password_question,
        comment;
else
    return query
    select
        user_id,
        user_name,
        last_activity,
        created,
        email,
        approved,
        last_lockout,
        last_login,
        last_password_changed,
        password_question,
        comment
    from
        users
    where
        lower(application_name) = lower(_application_name)
        and lower(user_name) = lower(_user_name);
        end if;

end;

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION public.get_user_by_username(character varying, character varying, boolean)
  OWNER TO (configured db login);

Я проверил, дважды проверил и трижды проверил строку подключения… она указала на эту базу данных с соответствующим логином. Функция выполняется нормально из окна pgAdmin.

моя строка подключения похожа на это:

Server=localhost;Port=5432;Database=mysecuritydb;User Id=(configured db login);Password=(my password);Pooling=true;ConvertInfinityDateTime=true;

… с этими учетными данными я вижу функцию:

Тем не менее, когда я использую это как библиотеку со ссылкой в ​​моем проекте asp.net, я получаю следующее сообщение:

Server Error in '/' Application.

42883: function get_user_by_username(_user_name => character varying, _application_name => character varying, online => boolean) does not exist

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: Npgsql.PostgresException: 42883: function get_user_by_username(_user_name => character varying, _application_name => character varying, online => boolean) does not exist

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace: 


[PostgresException (0x80004005): 42883: function get_user_by_username(_user_name => character varying, _application_name => character varying, online => boolean) does not exist]

Я использовал эту библиотеку некоторое время, но впервые вижу это сообщение. Я что-то упускаю?

2017-06-29 00:49

2
ответа

Решение

Таким образом, @JGH поймал тот факт, что имена переменных подписи в сообщении об ошибке немного отличаются в библиотеке, чем в опубликованном коде… чего не должно было случиться, но я собрал исходный код, скомпилировал его как проект зависимостей и все работало нормально. Итак, у предварительно скомпилированной библиотеки есть проблема, и я могу обойти ее.

Спасибо за помощь!

2017-06-30 01:10

Еще одна ошибка, которая продолжает меня кусать

Npgsql.PostgresException: 42883: функция не существует

является регистрозависимыми правилами при определении функций. Например, без каких-либо окружающих "" Цитаты, следующее определение:

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)

2017-07-13 12:00

У меня такая же проблема, и вот мой вывод:

Причина этой ошибки в том, что после создания функции PostgreSQL автоматически преобразует имя функции и имя параметра в нижний регистр. Когда Npgsql вызывает эту функцию, имя функции не чувствительно к регистру, но имя параметра чувствительно к регистру.

Полдня я искал причину ошибки. Только что обновили Npgsql с 2.2.5 до 4.1.5, PostgreSQL с 9 до 13, и мой код перестал работать с
42883: function does not exist

Я сделал все параметры в коде C# строчными буквами

var data = dataConnection.QueryProc<FormOutput>("get_form_data", new[] {
    new DataParameter("countryid", countryId),
    new DataParameter("keyvalue", key),
    new DataParameter("maxqty", maxFormQty) });

чтобы справиться с этой ошибкой

Объявление функции ниже

create or replace FUNCTION get_form_data (countryId varchar, key varchar, maxQty int)

2020-11-06 11:45

Еле разобралась с PIVOT в ms sql, а на Postgre, оказалось, что PIVOT функции вообще не существует, а есть CROSSTAB. Погуглила, информация как обычно не явно понятная.

Ввожу в формате:

    select * from
    crosstab('{запрос}') 
    as ({название_столбца тип})

выходит ошибка:

ОШИБКА:  функция crosstab(unknown) не существует
LINE 2:   FROM crosstab(
               ^
HINT:  Функция с данными именем и типами аргументов не найдена. Возможно, вам следует добавить явные приведения типов.

********** Ошибка **********

ОШИБКА: функция crosstab(unknown) не существует
SQL-состояние: 42883
Подсказка: Функция с данными именем и типами аргументов не найдена. Возможно, вам следует добавить явные приведения типов.
Символ: 19

пробовала вводить и так, но итог тот же:

    select * from
    crosstab($${запрос}$$) 
    as ({название_столбца тип})

Я сделал функцию в postgres

CREATE OR REPLACE FUNCTION foobar(
    x TEXT,
    y TEXT,
    z REAL
) RETURNS BOOLEAN AS $func$
.
.
.
$func$ LANGUAGE plpgsql;

Когда я делаю \ df, я получаю следующее:

+----------+--------+------------------+------------------------+---------+
|  Schema  |  Name  | Result data type |  Argument data types   |  Type   |
+----------+--------+------------------+------------------------+---------+
| mySchema | foobar | boolean          | x text, y text, z real | normal  |
+----------+--------+------------------+------------------------+---------+

Но когда я пытаюсь использовать его, я получаю [42883] ОШИБКА: функция foobar (text, text, real) не существует. Подсказка: ни одна функция не соответствует заданному имени и типам аргументов. Возможно, вам потребуется добавить явное приведение типов. Звонок, который я делаю:

SELECT * FROM myTable WHERE foobar(column1::text, 'hello'::text, 7.2::real);

Мне кажется, что функция существует и типы совпадают, я изо всех сил пытаюсь понять, что не так.

Понравилась статья? Поделить с друзьями:
  • Powershell текст ошибки
  • Postgresql ошибка формата потока
  • Postgresql журнал ошибок
  • Postgresql ошибка ссылки между базами не реализованы
  • Postgresql ошибка синтаксиса примерное положение select