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