java—如何使用rdbms dml创建任意错误

x0fgdtte  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(372)

背景

我正在写一个java应用程序,使用rdbms。
应用程序使用oracle和postgresql作为数据存储。

问题

现在,我正在测试一些sqlexception的错误处理例程。例如,我想将ora-00001(唯一约束冲突)或ora-00054(获取独占锁失败)视为可恢复的错误。另一方面,我想将ora-00060(死锁)视为不可恢复的错误。
现在我正在尝试为这个错误处理例程编写junit测试用例。为了使测试用例尽可能可移植,我正在寻找一种方法来生成任意错误(ora-00001,ora-00054,…),使用一个简单的dml SELECT RAISE_ERROR(-54) FROM DUAL . 另外,我希望避免在测试用例中模拟sqlexception本身,因为sqlexception的内容可以在rdbms版本之间更改。

问题

在rdbms(尤其是oracle和postgresql)中,有没有任何方法可以用dml创建任意的sql错误?或者,有没有像dbunit这样的测试框架具有创建任意sqlexception的功能?如果在没有特定表和记录的情况下可能发生错误,则最好是这样。

s71maibg

s71maibg1#

没有可移植的方法来人为地在sql中引起给定的错误,您必须为每个数据库编写代码。
但我想给你一些建议:
使用标准化的sqlstate,而不是像oracle的ora-xx数字那样的特定于系统的错误代码。应该是便携式的。
所有rdbms都应该有一种方法来检索错误消息的sqlstate。
我不知道你说的“可恢复错误”是什么意思,但死锁显然不是持久性错误——如果你重复事务,它可能会成功。
另一方面,违反约束是一种持久性错误。只要你想再试一次,你总是会得到同样的错误。“恢复”的唯一方法是运行不同的语句或修改数据库以避免冲突。

相关问题