1

PostgreSQL で宣言されている関数を PL/pgSQL で呼び出そうとしています。そのために、以下のコードを書きます。私の機能は機能していますが、その後「PGRES_FATAL_ERROR」を取得しています。また、「select removestopwords()」を「DELETE * FROM TABLE1」のようなSQLクエリで変更すると、正常に機能します。

私は、そのエラーが現在機能していても、将来大きな問題を引き起こす可能性があると考えています。エラーなしで 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_ERRORから取得するPQresultStatus場合は、 を使用PQresultErrorFieldして結果セットからすべてのエラー データを取得し、有用なエラー メッセージを提供する必要があります。これにより、ここで実際のエラーが何であるかを判断できます (サーバーから送信されたエラーである可能性が非常に高い)。

PQresultqポインターから構築できる 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 に答える