0

Java/Postgres アプリケーションでのエラー処理を改善しようとしていますが、固定長の列に対して入力が長すぎるというエラーが頻繁に発生します。これが発生したときにトランザクションをロールバックしますが、ロールバックが完了する前に、どの列が長さの制約に違反しているかを特定して、このエラーのデバッグをより簡単かつ効率的にする方法を見つけようとしています。

私のアプローチは次のとおりです。

  1. informationschema.columnsエラー メッセージに表示された長さのすべての列名を取得するクエリ
  2. 手順 1 で返された各列をクエリして、長さの制約を確認します

ただし、情報スキーマを照会しようとすると、次のエラーが発生します。

ERROR: current transaction is aborted, commands ignored until end of transaction block

このトランザクションで Java から引き続きクエリを実行する方法はありますか、または長さの制約に違反している列を取得するためのより良い方法はありますか?

4

1 に答える 1

1

あなたがやりたいことをすることは、ある程度可能です。

SAVEPOINTすべてのステートメントの前に作成し、その後ROLLBACK TO SAVEPOINTにエラーを作成して続行できます。

これはトランザクションにかなりのオーバーヘッドを発生させるため、通常は良いアイデアではありませんが、便利な場合があります。

この場合ROLLBACK、トランザクション全体でテーブルの状態をクエリするか、別のセッションからクエリを実行します。これは、トランザクション内から DDL を実行している場合を除き、情報提供のみを目的として問題ありません。対象のトランザクション内から DDL をSAVEPOINT実行している場合は、DML を実行する前に DDL をグループ化し、その後に実行することROLLBACK TO SAVEPOINTを検討してください。これにより、トランザクションを参照したときにテーブルをクエリできます。

PostgreSQL からのより構造化されたエラー メッセージをサポートする作業が進行中であることを知りたいと思われるでしょう。この作業は PgJDBC に引き継がれ、エラーに関するより詳細な情報を取得できるようにする必要があります。これには、影響を受けるテーブル、制約なども含まれます。 (s)違反など

于 2013-06-08T11:19:38.940 に答える