2015-12-10 3 views
1

Наше приложение основано на Java, JPA и базе данных Oracle. Если операция базы данных завершилась неудачно, я получаю SQLException или один из его производных.Дифференцировать SQLExceptions - список кодов ошибок для Oracle?

В моем случае я хотел бы отличить, вызвана ли проблема SQLIntegrityConstraintViolationException проблемой с уникальным или внешним ключом.

В журнале показан код ошибки ORA-00001 за уникальное нарушение ограничений, однако я искал список других кодов, чтобы реагировать на нужные.

Я знаю, что эти коды специфичны для поставщиков, а SO - легко найти answer for MySQL. Для Oracle мне тоже нужно было бы.

ответ

1

Не удивительно, что есть список в OracleDOcumentation:

http://docs.oracle.com/cd/B28359_01/server.111/b28278/toc.htm

но копаться в сверху, это тоже не так легко найти. Поскольку MySql-Answers было намного легче найти, я надеюсь, что это Q & A служит для обеспечения столь же быстрого пути к этой информации.

К сожалению, один из них не может легко искать внутри списка, потому что он был распространен на нескольких страницах без особого указания, в каком диапазоне содержатся какие ошибки.

Однако мне удалось найти коды для моей конкретной проблемы: нарушение UQ - ORA-00001, где, поскольку ошибки внешнего ключа находятся в ORA-02290 (отсутствующий родительский элемент) и ORA-02291 (попытка удаления с зависимыми детьми существующий).

1

Эта проблема может быть еще шире. Обработка ошибок специфична для поставщика, и JDBC не обрабатывает специфические для поставщика компоненты.

Например, JBOSS имеет класс в названии: ExceptionSorter см. OracleExceptionSorter. В этом классе перечислены все критические коды ошибок, описывающие ситуацию, когда ошибка находится на «уровне соединения». Поэтому соединение должно быть закрыто и (через какое-то время) нужно создать новое.

Затем появляются ошибки на уровне транзакции. Очевидно, что это тупик «ORA-0060», а затем какая-то сумасшедшая ошибка, возвращаемая параллельными заявлениями «MERGE». Обычно эту ошибку можно решить путем откат повторной попытки всей транзакции.

Остальные ошибки, как правило, связаны с целостностью данных, и их нельзя повторить.

Я не знаю о какой-либо сортировке исключений, которая охватывает все классы ошибок. Возможно, его даже невозможно реализовать, так как это может зависеть от потребностей приложения.

+0

Я никогда не искал реализацию, которая охватывает все случаи. Такая реализация действительно будет утомительной и трудной для правильной работы, и на самом деле не возникает никакого реального случая использования. Вместо этого я хочу отреагировать на конкретную ошибку или класс ошибок, чтобы я мог обеспечить действие для восстановления. Все остальные ошибки оставлены в покое и следуют нормальному пути распространения. Для этой фильтрации важно знать коды ошибок. – Louise

Смежные вопросы