2010-03-14 1 views
2

Бизнес-логика кодируется в процедурах и функциях пакетов pl/sql. Программы Java вызывают процедуры и функции pl/sql для работы с базами данных.Исключения PL/SQL и Java-программы

Программы pl/sql сохраняют исключения в таблицах Oracle всякий раз, когда возникает исключение.

Как бы мои программы Java получить исключения, так как исключение вместо того, чтобы распространяться из PL/SQL для Java становится сохранялось в таблицу оракула и проки/функция просто возвращает 1 или 0.

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

+0

Вы можете прочитать stacktrace исключения, если вы используете CallableStatement для запуска pl/sql-процессов. –

ответ

1

java.sql.CallableStatement throws java.sql.SQLException. Если ваш сохраненный proc выдает исключение, ваш Java-код будет знать об этом. Код, вызывающий хранимую процедуру, должен обрабатывать это исключение.

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

Но исключение не «потеряно» в любом случае. Вы получаете его из JVM или таблицы.

Я голосую за JVM, потому что это проще. Меньше кода PL/SQL, меньше кода Java.

+0

Duffymo благодарит за ответ в воскресенье :-D Блок pl/sql генерирует исключение, но он сохраняется в таблице, а затем возвращает 1 или 0, а фактическое исключение теряется. – edwards

+0

Нет, если они обрабатываются в sp. .. – YogoZuno

+0

@YogoZuno - правильный. Не забудьте сохранить запомненную процедуру proc и перетащите ее в таблицу. – duffymo

1

Предполагая, что вы не можете изменить код PLSQL, вам необходимо будет контролировать таблицу. И, конечно же, это будет работать, только если таблица ошибок хранит какой-то сеанс или использует идентификатор.

+0

Почему эта нить проголосовала за вариант yogozunos является законным – edwards

0

Просто, если вы используете фреймворк, который поддерживает аспекты, было бы легко сделать аспект, который проверяет исключение в соответствующей таблице. Если нет, то вы можете написать что-то похожее на этот код:

 ResultSet exRs = null;  

     try { 
      connection.setAutoCommit(false); 
      Statement statement = connection.createStatement(); 
      statement.execute(normalSql); 
      exRs = statement.executeQuery(exceptionSql); 
      exRs.next(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
      connection.rollback(); 
     } 

     if (null != exRs.getString(exceptionColumn)) 
      connection.commit(); 
     else 
      connection.rollback(); 

Жаль, что я не мог быть более конкретным.

+0

Azder благодарит за ответ, однако код, который вы мне дали, не применим в ситуации, когда задействован хранимый процесс - это правильно? – edwards

1

«сохраняется в таблице оракула» Вы можете создать триггер на этой таблице, который отклоняет вставку. Например, если таблица ошибок содержит столбец «error_description», вы могли бы иметь ПЕРЕД ВСТАВИТЬ на error_table КАЖДОЙ СТРОКЕ триггер, который делает raise_application_error (-20001,: NEW.ERROR_DESCRIPTION)

Когда код PL/SQL идет чтобы зарегистрировать ошибку, это приведет к ошибке с заменой ошибки, и если вам повезет, получите ссылку на уровень Java.

Это уродливый взлом, но если вы действительно не можете изменить код, он может работать.

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