Как вызвать хранимую процедуру синхронно с SimpleJdbcCall - PullRequest
0 голосов
/ 18 июня 2020

Я запускал хранимую процедуру с Springs SimpleJdbcCall вот так:

SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate).withProcedureName("example_proc");
jdbcCall.execute();
// do other stuff on other subsystems
// the sysout below is just an example - the real scenario was somewhat different
System.out.println("Supposedly after the end of the stored procedure call");

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

Хранимая процедура была написана на SQL серверном диалекте Microsoft и выглядела так:

CREATE PROCEDURE example_proc
AS
BEGIN
    INSERT INTO example_table_1 SELECT * FROM example_table_2
    UPDATE example_table_1 SET col1 = 'a' WHERE ...
END

Вопрос: как убедиться, что SimpleJdbcCall ждет, пока процедура завершена?

1 Ответ

0 голосов
/ 18 июня 2020

Для этого есть хитрость: заставить хранимую процедуру что-то возвращать, а затем получить это в вызове jdb c.

Это хранимая процедура:

CREATE PROCEDURE example_proc
AS
BEGIN
    INSERT INTO example_table_1 SELECT * FROM example_table_2
    UPDATE example_table_1 SET col1 = 'a' WHERE ...

    -- this is just a hack for running it synchronously:
    SELECT 1 AS success
END

Теперь, когда он что-то возвращает, вызов jdb c может дождаться этого:

SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
        .withProcedureName("example_proc").
        returningResultSet("success", new SingleColumnRowMapper<Integer>());
Map<String, Object> map = jdbcCall.execute();
@SuppressWarnings("unchecked")
List<Integer> storedProcedureResults = (List<Integer>) map.get(success);
int result = storedProcedureResults.get(0);
// I did something to the result. I am not sure if this is really necessary.
// But I was worried if the jvm or javac would optimize the dead code.
// I returned the value from a method. Printing it should also be enough.
System.out.println(result);
...