2012-11-20 32 views
1

我想调用PostgreSQL中用PL/pgSQL声明的函数。为此我写下面的代码。我的功能正在工作,但在此之后,我正在采取“PGRES_FATAL_ERROR”。另外,当我用“DELETE * FROM TABLE1”这样的sql查询改变了“select removestopwords()”时,它就成功了。如何从C++代码调用PL/pgSQL函数

我在考虑,即使现在正在工作,这个错误在将来可能会导致一些大问题。如何在不出错的情况下调用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

我没有在你的问题中看到plpgsql函数的定义。 –

回答

1

如果您从PQresultStatus得到PGRES_FATAL_ERROR,则应使用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以及所有这些)

1

PostgreSQL的API不支持一些像 “忽略所有错误” 标志。如果你想忽略结果,那么就不要在主机环境中检查结果。但这是不好的策略。