Использование хранимых процедур с состояниями возврата
Вызываемая хранимая процедура SQL Server — это процедура, которая возвращает параметр состояния или параметр результата. Обычно это состояние используется для указания успешного выполнения или ошибки хранимой процедуры. Microsoft JDBC Driver для SQL Server предоставляет класс SQLServerCallableStatement, который можно использовать для вызова этого типа хранимой процедуры и обработки возвращаемых ею данных.
При вызове хранимой процедуры этого типа с помощью драйвера JDBC следует использовать escape-последовательность SQL call
совместно с методом prepareCall класса SQLServerConnection. Ниже приводится синтаксис escape-последовательности call
с возвращаемым параметром состояния:
{[?=]call procedure-name[([parameter][,[parameter]]...)]}
Примечание.
Дополнительные сведения об использовании escape-последовательностей в SQL см. в этой статье.
При создании escape-последовательности call
укажите возвращаемый параметр состояния с помощью символа ?
(знак вопроса). Этот символ выполняет роль заполнителя для значения параметра, которое будет возвращено из хранимой процедуры. Чтобы указать значение возвращаемого параметра состояния, необходимо задать тип данных параметра с помощью метода registerOutParameter класса SQLServerCallableStatement до выполнения хранимой процедуры.
Примечание.
При использовании драйвера JDBC с базой данных SQL Server значение, указываемое для возвращаемого параметра состояния в методе registerOutParameter, всегда будет целым числом, которое можно задать с помощью типа данных java.sql.Types.INTEGER.
Кроме того, при передаче значения методу registerOutParameter для возвращаемого параметра состояния необходимо указать не только тип данных, который будет использоваться для параметра, но также порядковое размещение параметра в вызове хранимой процедуры. Порядковое местоположение возвращаемого параметра состояния всегда будет 1, поскольку этот параметр всегда является первым в вызове в хранимой процедуры. Хотя класс SQLServerCallableStatement обеспечивает поддержку использования имени параметра для указания определенного параметра, для возвращаемых параметров состояния можно использовать только номер порядкового местоположения.
Например, создайте следующую хранимую процедуру в примере базы данных AdventureWorks2022:
CREATE PROCEDURE CheckContactCity
(@cityName CHAR(50))
AS
BEGIN
IF ((SELECT COUNT(*)
FROM Person.Address
WHERE City = @cityName) > 1)
RETURN 1
ELSE
RETURN 0
END
Эта хранимая процедура возвращает значение состояния 1 или 0, в зависимости от того, включен ли город, указанный в параметре cityName, в таблицу Person.Address.
В следующем примере открытое подключение к образцу базы данных AdventureWorks2022 передается в функцию, а метод выполнения используется для вызова хранимой процедуры CheckContactCity:
public static void executeStoredProcedure(Connection con) {
try(CallableStatement cstmt = con.prepareCall("{? = call dbo.CheckContactCity(?)}");) {
cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
cstmt.setString(2, "Atlanta");
cstmt.execute();
System.out.println("RETURN STATUS: " + cstmt.getInt(1));
}
// Handle any errors that may have occurred.
catch (SQLException e) {
e.printStackTrace();
}
}