Callable или PreparedStatement и транзакции - PullRequest
5 голосов
/ 23 июля 2010

У меня есть готовый вызов оператора в java, который вызывает процедуру, которая фиксирует или откатывает транзакцию sybase. Есть ли в любом случае я могу проверить из моих вызовов Java результат этой транзакции, т.е. успех для фиксации или неудача для отката? Кроме того, я хочу проверить, что процедура завершена без ошибок - каков наилучший способ сделать это? Спасибо

Ответы [ 3 ]

2 голосов
/ 23 июля 2010

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

2 голосов
/ 23 июля 2010

Хранимая процедура должна возвращать какой-либо статус или код ошибки.
Поместите это в параметр OUT и прочитайте это из proc.

     //Calling a stored procedure which takes in 2 parameters for addition
     /*
     --EXECUTE ADDITION 10,25,NULL
     ALTER PROCEDURE ADDITION
     @A INT
     , @B INT
     , @C INT OUT
     AS
     SELECT @C = @A + @B
     */
     CallableStatement cs2 = con.prepareCall("{call ADDITION(?,?,?)}");
     cs2.registerOutParameter(3,java.sql.Types.INTEGER);
     cs2.setInt(1,10);
     cs2.setInt(2,25);
     cs2.execute();
     int res = cs2.getInt(3);
     System.out.println(res);
1 голос
/ 23 июля 2010

Я думаю, что вы используете неправильный подход.Клиент (в данном случае код JAVA) должен выполнять фиксацию или откат, а не хранимую процедуру sybase.Здесь я предполагаю, что под «вызовом процедуры» вы подразумеваете хранимую процедуру , которая фиксирует или откатывает.

Если вы используете только что упомянутый мной подход, то вы можете попробовать все/ catch блокирует и обрабатывает коммит / откат соответственно.

try {
    PreparedStatement ps = create prepared statement;
    ps.execute();

    // nothing went wrong, commit
} catch (SqlException e) {
    // something wen't wrong, rollback
}

Если под "вызовом процедуры" вы подразумеваете просто другой метод JAVA, то я не знаю, почему у вас есть отдельный метод для выполнениякоммит или откат, вы можете обработать все это в блоке try / catch, как показано выше.

...