PL / SQL-исключение и Java-программы - PullRequest
2 голосов
/ 14 марта 2010

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

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

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

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

Ответы [ 4 ]

1 голос
/ 15 марта 2010

"настаивает на оракуле" Вы можете создать триггер для этой таблицы, который отклоняет вставку. Например, если таблица ошибок содержит столбец «ERROR_DESCRIPTION», у вас может быть триггер BEFORE INSERT ON error_table FOR EACH ROW, который выполняет RAISE_APPLICATION_ERROR (-20001,: NEW.ERROR_DESCRIPTION)

Когда код PL / SQL идет для регистрации ошибки, она завершится ошибкой с заменой и, если вам повезет, распространится на слой Java.

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

1 голос
/ 14 марта 2010

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

1 голос
/ 14 марта 2010

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

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

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

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

0 голосов
/ 14 марта 2010

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

        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();

Извините, я не могу быть более конкретным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...