我正在尝试使用PL / pgSQL调用在PostgreSQL中声明的函数。为此我写下面的代码。我的功能正在运行,但之后我正在使用“PGRES_FATAL_ERROR”。此外,当我使用像“DELETE * FROM TABLE1”这样的SQL查询更改“select removestopwords()”时,它已成功运行。
我正在考虑,即使现在正在工作,这个错误也会在将来引起一些大问题。如何在不出错的情况下调用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);
}
答案 0 :(得分:1)
PostgreSQL API不支持某些标记,例如“忽略所有错误”。如果你想忽略结果,那么就不要在主机环境中检查结果。但这是一个糟糕的策略。
答案 1 :(得分:1)
如果从PGRES_FATAL_ERROR
获得PQresultStatus
,则应使用PQresultErrorField
从结果集中获取所有错误数据,以提供有用的错误消息。这将允许您确定实际错误在这里(很可能是从服务器发送错误)。
考虑创建一个类来保存可以从q PQresult
指针构造的PostgreSQL错误细节,例如:
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以及所有这些)< / p>