Поднять Java SQLException from SQL Серверная хранимая процедура? - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть SQL Серверная хранимая процедура, подобная этой:

CREATE PROCEDURE proc1
(
    @param DECIMAL
)
AS
    BEGIN
        INSERT INTO table1 (@param);
        -- further commands
    END;
GO

Эта процедура вызывается из Java. Я ввел уникальное ограничение для table1 в том же столбце, который вставлен выше. Ожидается получить SQLException в Java в случае нарушения ограничения, но это не происходит. Когда процедура выполняется вручную из SSMS, я вижу, что она печатает ошибку нарушения ограничения, а затем продолжает всю оставшуюся часть процесса, что, на мой взгляд, странно, я ожидала, что она потерпит неудачу. Поэтому я изменил это так:

CREATE PROCEDURE proc1
(
    @param DECIMAL
)
AS
    BEGIN
        BEGIN TRY
            INSERT INTO table1 (@param);
        END TRY
        BEGIN CATCH
            THROW 51000, 'Unable to insert', 1;
        END CATCH
        -- further commands
    END;
GO

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

ОБНОВЛЕНИЕ: Java вызывающий слой:

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String connectionUrl = "jdbc:sqlserver://x.x.x.x;database=x";

try (Connection conn = DriverManager.getConnection(connectionUrl, "x", "x")) {
    try (CallableStatement stmt = conn.prepareCall("{call proc1(?)}")) {
        stmt.setInt(1, 1);

        stmt.execute();

        System.out.println("Done");
    }
}

В конце я вижу напечатанное сообщение «Готово» на консоль.

1 Ответ

1 голос
/ 02 апреля 2020

Добавьте SET NOCOUNT ON в качестве первого оператора в pro c для подавления сообщений DONE_IN_PROC (rowcount) TDS. В противном случае код должен использовать все результаты, возвращенные с помощью ResultSet и getMoreResults, до того, как на клиенте возникнет ошибка.

...