Как я могу вызвать функцию PL / pgSQL из кода C ++

Я пытаюсь вызвать функцию, которая объявлена ​​в PostgreSQL с PL / pgSQL. Для этого я пишу код ниже. Моя функция работает, но после этого я беру «PGRES_FATAL_ERROR». Также, когда я изменил «select removestopwords ()» с помощью SQL-запроса, такого как «DELETE * FROM TABLE1», он работал успешно.

Я считаю, что эта ошибка может вызвать большие проблемы в будущем, даже если сейчас работает. Как я могу вызвать функцию PL / pgSQL без ошибок?

void removeStopWordsDB(PGconn* conn) {

PGresult *res = PQexec(conn, "select removestopwords()");

if (PQresultStatus(res) != PGRES_COMMAND_OK) {
printf("removestopwords failed");
cout<<PQresultStatus(res);
PQclear(res);
exit_nicely(conn);
}

printf("removestopwords - OK\n");

PQclear(res);

}

1

Решение

Если вы получаете PGRES_FATAL_ERROR от PQresultStatus ты должен использовать PQresultErrorField чтобы получить все данные об ошибках из набора результатов, чтобы предоставить полезное сообщение об ошибке. Это позволит вам определить, что именно здесь происходит (скорее всего, ошибка отправляется с сервера).

Подумайте о создании класса для хранения сведений об ошибках PostgreSQL, которые можно построить из q PQresult указатель, например:

PgError(const PGresult *rs)
{
severity = GetErrorField(rs, PG_DIAG_SEVERITY);
sqlstate = GetErrorField(rs, PG_DIAG_SQLSTATE);
primary = GetErrorField(rs, PG_DIAG_MESSAGE_PRIMARY);
// ...
}
static std::string GetErrorField(const PGresult *rs, int fieldCode)
{
const char *message = PQresultErrorField(rs, fieldCode);
if (message == NULL) return "";
return std::string(message);
}

Затем вы можете, например, инкапсулировать выгрузку ошибки в поток в этом объекте, чтобы предоставить подробности точно так же, как это делают psql и друзья (хотя, строго говоря, для всего этого вам также понадобится входной SQL)

1

Другие решения

PostgreSQL API не поддерживает некоторые флаги, такие как «игнорировать все ошибки». Если вы хотите игнорировать результат, просто не проверяйте результат в хост-среде. Но это плохая стратегия.

1

По вопросам рекламы [email protected]