Intereting Posts
Внедрить оператор присваивания для classа с большим количеством элементов Получить подмножество пакета параметров на основе заданного набора индексов Реализовать функции STL в вариационном шаблоне Конструкторы C ++: почему вызов этой виртуальной функции небезопасен? Получение массива из std: vector c ++ boost :: any, чтобы определить мою собственную печать, API MtGox и websocketpp как написать class журнала с интерфейсом стиля cout (logger << "Ошибка:" << val << endl;) Что происходит с базовым хранилищем при копировании / переносе вектора? Простой вопрос синтаксиса Си ++ о двоеточие Неоднозначная база с множественным наследованием Правильная установка config.h для общей библиотеки с помощью autotools Как проверить, находится ли мышь над элементом управления Рукописный связанный список является segfaulting, и я не понимаю, почему Как узнать, является ли std :: type_index уникальным для моего компилятора?

Как я могу вызвать функцию 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); 

}

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

Подумайте о создании classа для хранения данных об ошибках 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); } 

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

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