如何使用RDBMS DML创建任意错误 背景 我正在用RDBMS编写一个Java应用程序 该应用程序使用Oracle和PostgreSQL作为数据存储 问题

如何使用RDBMS DML创建任意错误 背景 我正在用RDBMS编写一个Java应用程序 该应用程序使用Oracle和PostgreSQL作为数据存储 问题,java,oracle,postgresql,error-handling,dbunit,Java,Oracle,Postgresql,Error Handling,Dbunit,现在,我正在测试一些SQLException的错误处理例程。例如,我想将ORA-00001(唯一约束冲突)或ORA-00054(无法获取独占锁)视为可恢复的错误。另一方面,我想将ORA-00060(死锁)视为不可恢复的错误 现在我正试图为这个错误处理例程编写JUnit测试用例。为了使测试用例尽可能可移植,我正在寻找一种通过简单的DML生成任意错误(ORA-00001,ORA-00054,…)的方法,比如从DUAL中选择RAISE_ERROR(-54)。另外,我希望避免在测试用例中模拟SQLExc

现在,我正在测试一些SQLException的错误处理例程。例如,我想将ORA-00001(唯一约束冲突)或ORA-00054(无法获取独占锁)视为可恢复的错误。另一方面,我想将ORA-00060(死锁)视为不可恢复的错误

现在我正试图为这个错误处理例程编写JUnit测试用例。为了使测试用例尽可能可移植,我正在寻找一种通过简单的DML生成任意错误(ORA-00001,ORA-00054,…)的方法,比如从DUAL中选择RAISE_ERROR(-54)。另外,我希望避免在测试用例中模拟SQLException本身,因为SQLException的内容可以在RDBMS版本之间更改

问题:
有没有办法在RDBMS(特别是Oracle和PostgreSQL)中使用DML创建任意SQL错误?或者,有没有像DBUnit这样的测试框架具有创建任意SQLException的功能?如果在没有特定表和记录的情况下发生错误,则最好是这样。

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

但我想给你一些一般性的建议:

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

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

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

    另一方面,约束冲突是一种持续性错误。您可以随时重试,但始终会出现相同的错误。“恢复”的唯一方法是运行不同的语句或修改数据库以避免冲突


查看
sqlstate
选项。最简洁的形式是:
do$$begin-raise-sqlstate'23503';完(元)谢谢你的评论。当我用PostgreSQL测试代码时,它会很有用。谢谢你的回答。我所说的“可恢复”是指应用程序的用户可以解决错误的原因并继续他们的业务(例如,当用户尝试注册某项服务,但其用户ID不唯一时,他们可以尝试使用另一个ID。另一方面,用户无法通过其操作解决RDBMS中的死锁)。