Я пытаюсь вызвать функцию, которая объявлена в 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);
}
Если вы получаете 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)
PostgreSQL API не поддерживает некоторые флаги, такие как «игнорировать все ошибки». Если вы хотите игнорировать результат, просто не проверяйте результат в хост-среде. Но это плохая стратегия.