Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Um procedimento armazenado do SQL Server ao qual pode chamar é aquele que devolve um ou mais parâmetros OUT, sendo estes parâmetros que o procedimento armazenado utiliza para devolver dados à aplicação que o chamou. O Microsoft JDBC Driver para SQL Server fornece a classe SQLServerCallableStatement , que pode usar para chamar este tipo de procedimento armazenado e processar os dados que ele devolve.
Quando invoca este procedimento armazenado usando o driver JDBC, deve utilizar a sequência de escape SQL call combinada com o método prepareCall da classe SQLServerConnection. Para a call sequência de escape com parâmetros OUT, a sintaxe é a seguinte:
{call procedure-name[([parameter][,[parameter]]...)]}
Observação
Para mais informações sobre as sequências de escape SQL, consulte Utilização de sequências de escape SQL.
Quando constróis a call sequência de escape, especifica os parâmetros OUT usando o carácter de ponto de interrogação (?). Este caractere funciona como um marcador para os valores dos parâmetros que são retornados pelo procedimento armazenado. Para especificar um valor para um parâmetro OUT, deve especificar o tipo de dado de cada parâmetro usando o método registerOutParameter da classe SQLServerCallableStatement antes de executar o procedimento armazenado.
O valor que especifica para o parâmetro OUT no método registerOutParameter deve ser um dos tipos de dados JDBC contidos em java.sql.Types, que por sua vez mapeiam para um dos tipos nativos de dados do SQL Server. Para mais informações sobre os tipos de dados JDBC e SQL Server, consulte Compreensão dos tipos de dados do driver JDBC.
Quando passa um valor ao método registerOutParameter para um parâmetro OUT, deve especificar não só o tipo de dado a ser usado para o parâmetro, mas também a posição ordinal do parâmetro ou o nome do parâmetro no procedimento armazenado. Por exemplo, se o seu procedimento armazenado contiver um único parâmetro OUT, o seu valor ordinal é 1. Se o procedimento armazenado contiver dois parâmetros, o primeiro valor ordinal é 1 e o segundo valor ordinal é 2.
Observação
O driver JDBC não suporta a utilização de tipos de dados CURSOR, SQLVARIANT, TABLE e TIMESTAMP SQL Server como parâmetros OUT.
Por exemplo, crie o seguinte procedimento armazenado na base de dados de exemplo AdventureWorks2025:
CREATE PROCEDURE GetImmediateManager
@employeeID INT,
@managerID INT OUTPUT
AS
BEGIN
SELECT @managerID = ManagerID
FROM HumanResources.Employee
WHERE EmployeeID = @employeeID
END
Este procedimento armazenado devolve um único parâmetro OUT (managerID), que é um inteiro, baseado no parâmetro IN especificado (employeeID), que também é um inteiro. O valor que é devolvido no parâmetro OUT é o ManagerID baseado no EmployeeID contido na HumanResources.Employee tabela.
No exemplo seguinte, uma ligação aberta à base de dados de exemplo AdventureWorks2025 é passada para a função, e o método execute é usado para chamar o procedimento guardado GetImmediateManager.
public static void executeStoredProcedure(Connection con) throws SQLException {
try(CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}");) {
cstmt.setInt(1, 5);
cstmt.registerOutParameter(2, java.sql.Types.INTEGER);
cstmt.execute();
System.out.println("MANAGER ID: " + cstmt.getInt(2));
}
}
Este exemplo utiliza as posições ordinais para identificar os parâmetros. Em alternativa, pode identificar um parâmetro usando o seu nome em vez da sua posição ordinal. O exemplo de código seguinte modifica o exemplo anterior para demonstrar como usar parâmetros nomeados numa aplicação Java. Os nomes dos parâmetros correspondem aos nomes dos parâmetros na definição do procedimento armazenado:
public static void executeStoredProcedure(Connection con) throws SQLException {
try(CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}"); ) {
cstmt.setInt("employeeID", 5);
cstmt.registerOutParameter("managerID", java.sql.Types.INTEGER);
cstmt.execute();
System.out.println("MANAGER ID: " + cstmt.getInt("managerID"));
}
}
Observação
Estes exemplos utilizam o método execute da classe SQLServerCallableStatement para executar o procedimento armazenado. Isto é usado porque o procedimento armazenado também não devolveu um conjunto de resultados. Se o fizesse, seria usado o método executeQuery .
Os procedimentos armazenados podem retornar contagens de atualizações e múltiplos conjuntos de resultados. O Microsoft JDBC Driver para SQL Server segue a especificação JDBC 3.0, que afirma que múltiplos conjuntos de resultados e contagens de atualizações devem ser recuperados antes de os parâmetros OUT serem recuperados. Ou seja, a aplicação deve recuperar todos os objetos ResultSet e contagens de atualizações antes de recuperar os parâmetros OUT usando os métodos CallableStatement.getter. Caso contrário, os objetos ResultSet e as contagens de atualizações que o driver não recuperou são perdidos quando os parâmetros OUT são recuperados. Para mais informações sobre contagens de atualizações e múltiplos conjuntos de resultados, consulte Utilização de um procedimento armazenado com contagem de atualizações e Utilização de Múltiplos Conjuntos de Resultados.