如何使用RDBMS DML创建任意错误

问题描述

背景

  • 我正在使用RDBMS编写Java应用程序。
  • 该应用程序使用Oracle和Postgresql作为数据存储。

问题

现在,我正在测试一些sqlException的错误处理例程。例如,我想将ORA-00001(违反唯一约束)或ORA-00054(无法获得排他锁)视为可恢复的错误。另一方面,我想将ORA-00060(死锁)视为不可恢复的错误

现在,我正在尝试为此错误处理例程编写JUnit测试用例。为了使测试用例尽可能地可移植,我正在寻找一种使用像SELECT RAISE_ERROR(-54) FROM DUAL这样的简单DML生成任意错误(ORA-00001,ORA-00054等)的方法。另外,我想避免在测试用例中模拟sqlException本身,因为在RDBMS版本之间可以更改sqlException的内容

问题

是否有任何方法可以在RDBMS(特别是Oracle和Postgresql)中使用DML创建任意sql错误?或者,是否有像DBUnit这样的测试框架具有创建任意sqlException的功能?如果没有特定的表和记录就可能发生错误,这是可取的。

解决方法

没有一种可移植的方法来人为地导致SQL中的给定错误,您必须为每个数据库编写代码。

但我想给您一些一般性建议:

  • 使用标准化的SQLSTATE而非系统特定的错误代码,例如Oracle的ORA-xxxxx号。那应该是便携式的。

    所有RDBMS应该都有一种方法来检索错误消息的SQLSTATE。

  • 我不知道您所说的“可恢复错误”是什么意思,但是死锁显然不是持久性错误-如果您重复事务,它可能会成功。

    另一方面,违反约束是持续存在的错误。重试所需的次数,将始终出现相同的错误。 “恢复”的唯一方法是运行其他语句或修改数据库以避免冲突。