1

我正在尝试使用 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);

}

4

2 回答 2

1

PostgreSQL API 不支持“忽略所有错误”之类的标志。如果您想忽略结果,那么就不要在主机环境中检查结果。但这是一个糟糕的策略。

于 2012-11-20T13:44:31.063 回答
1

如果您从中获取PGRES_FATAL_ERRORPQresultStatus您应该使用PQresultErrorField从结果集中获取所有错误数据以提供有用的错误消息。这将允许您确定此处的实际错误(很可能是从服务器发送的错误)。

考虑创建一个类来保存可以从 qPQresult指针构造的 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 来完成所有这些操作)

于 2012-11-20T13:47:08.683 回答