Я использую официальный драйвер Sybase JDBC для подключения к базе данных и вызова хранимой процедуры путем создания CallableStatement, привязки к нему параметров и вызова для него .execute().
Однако я обнаружил, что никаких исключений не возникает, даже если хранимая процедура завершается ошибкой. Я могу убедиться, что сбой передается мне, анализируя трафик к базе данных с помощью Wireshark и наблюдая за возвращающимися сообщениями об ошибках.
Наконец, я обнаружил, что использование .executeUpdate() вместо .execute() действительно дает мне исключения, однако у меня осталось два вопроса:
- Почему .execute() и .executeUpdate() ведут себя по-разному? Из документации SUN по интерфейсу кажется, что они должны делать (почти) одно и то же...
- Всегда ли уместно заменить .execute() на .executeUpdate() при вызове хранимой процедуры? Должна ли хранимая процедура соответствовать некоторым конкретным требованиям, чтобы ее можно было вызывать с помощью .executeUpdate()? (например, должен ли он иметь оператор обновления/удаления/вставки в качестве последнего шага?)
Обновление: я попробовал jTDS, и он ведет себя корректно (например, выдает SQLException в обоих случаях — с .execute() и с .executeUpdate()). Однако из-за ограничений, не зависящих от меня, переключение драйвера на самом деле невозможно.
Кроме того: меня не интересует результат, возвращаемый этой хранимой процедурой, это процедура типа вставки/обновления. Мне бы только вставить посмотреть (и суметь отловить/логировать) сбой или нет. Еще одна вещь, которую я пробовал, - это отключить предупреждения от соединения после .execute(), но оно также ничего не содержало.