如何从C ++代码调用PL / pgSQL函数

时间:2012-11-20 13:13:10

标签: c++ function postgresql plpgsql

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

}

2 个答案:

答案 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>