Como usar um procedimento armazenado com um status de retorno
Um procedimento armazenado do SQL Server que você pode chamar é um que retorna um parâmetro de status ou resultado. Esse status é usado para indicar o êxito ou a falha do procedimento armazenado. O Microsoft JDBC Driver para SQL Server fornece a classe SQLServerCallableStatement que pode ser usada para chamar esse tipo de procedimento armazenado e para processar os dados que ele retorna.
Ao chamar esse tipo de procedimento armazenado usando o driver JDBC, você deve usar a sequência de escape call
do SQL em conjunto com o método prepareCall da classe SQLServerConnection. A sintaxe da sequência de escape call
com um parâmetro de status de retorno é a seguinte:
{[?=]call procedure-name[([parameter][,[parameter]]...)]}
Observação
Para obter mais informações sobre as sequências de escape SQL, confira Como usar sequências de escape do SQL.
Ao construir a sequência de escape call
, especifique o parâmetro de status de retorno usando o caractere ?
(ponto de interrogação). Esse caractere age como um espaço reservado para o valor de parâmetro que retornará do procedimento armazenado. Para especificar um valor para um parâmetro de status de retorno, é necessário especificar o tipo de dados do parâmetro usando o método registerOutParameter da classe SQLServerCallableStatement antes de executar o procedimento armazenado.
Observação
Ao usar o driver JDBC com um banco de dados do SQL Server, o valor que você especificar para o parâmetro de status de retorno no método registerOutParameter será sempre um inteiro, condição que você pode especificar usando o tipo de dados java.sql.Types.INTEGER.
Além disso, ao passar para o método registerOutParameter um valor para um parâmetro de status de retorno, você deve especificar não só o tipo de dados a ser usado para o parâmetro, mas também o posicionamento ordinal do parâmetro na chamada de procedimento armazenado. No caso do parâmetro de status de retorno, a posição ordinal será sempre 1 porque ele é sempre o primeiro parâmetro na chamada para o procedimento armazenado. Embora a classe SQLServerCallableStatement dê suporte ao uso do nome do parâmetro para indicar o parâmetro específico, você só pode usar o número de posição ordinal para parâmetros de status de retorno.
Como exemplo, crie o seguinte procedimento armazenado no banco de dados de exemplo 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
Esse procedimento armazenado retorna o valor de status 1 ou 0, dependendo se a cidade especificada no parâmetro cityName se encontra ou não na tabela Person.Address.
No seguinte exemplo, uma conexão aberta com o banco de dados de amostra AdventureWorks2022 é passada para a função, e o método execute é usado para chamar o procedimento armazenado 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();
}
}