Utilisation d'une procédure stockée avec des paramètres de sortie
Une procédure stockée SQL Server que vous pouvez appeler est une procédure qui retourne un ou plusieurs paramètres OUT, qui sont des paramètres utilisés par la procédure stockée pour retourner des données à l’application appelante. Le pilote JDBC Microsoft pour SQL Server fournit la classe SQLServerCallableStatement que vous pouvez utiliser pour appeler ce type de procédure stockée et traiter les données qu'elle retourne.
Quand vous appelez ce type de procédure stockée avec le pilote JDBC, vous devez utiliser la séquence d’échappement SQL call
conjointement avec la méthode prepareCall de la classe SQLServerConnection. Pour la séquence d’échappement call
avec les paramètres OUT, la séquence est la suivante :
{call procedure-name[([parameter][,[parameter]]...)]}
Remarque
Pour plus d’informations sur les séquences d’échappement SQL, consultez Utiliser des séquences d’échappement SQL.
Quand vous construisez la séquence d’échappement call
, spécifiez les paramètres OUT à l’aide du caractère ? (point d’interrogation). Ce caractère fait office d'espace réservé pour les valeurs de paramètre qui est retourné par la procédure stockée. Pour spécifier une valeur pour un paramètre OUT, vous devez spécifier le type de données de chaque paramètre avec la méthode registerOutParameter de la classe SQLServerCallableStatement avant d’exécuter la procédure stockée.
La valeur que vous spécifiez pour le paramètre OUT dans la méthode registerOutParameter doit être un des types de données JDBC contenus dans java.sql.Types, qui est mappé à un des types de données SQL Server natifs. Pour plus d’informations sur les types de données SQL Server et JDBC, consultez Comprendre les types de données du pilote JDBC.
Quand vous passez une valeur à la méthode registerOutParameter pour un paramètre OUT, vous devez spécifier non seulement le type de données à utiliser pour le paramètre, mais également la position ordinale du paramètre ou le nom du paramètre dans la procédure stockée. Par exemple, si votre procédure stockée contient un seul paramètre OUT, sa valeur ordinale est 1. Si la procédure stockée contient deux paramètres, la première valeur ordinale est 1 et la deuxième valeur ordinale est 2.
Remarque
Le pilote JDBC ne prend pas en charge l’utilisation des types de données CURSOR, SQLVARIANT, TABLE et TIMESTAMP de SQL Server en tant que paramètres OUT.
Par exemple, créez la procédure stockée suivante dans l’exemple de base de données AdventureWorks2022 :
CREATE PROCEDURE GetImmediateManager
@employeeID INT,
@managerID INT OUTPUT
AS
BEGIN
SELECT @managerID = ManagerID
FROM HumanResources.Employee
WHERE EmployeeID = @employeeID
END
Cette procédure stockée retourne un seul paramètre OUT (ManagerID), un nombre entier, basé sur le paramètre IN spécifié (EmployeeID), qui est également un nombre entier. La valeur retournée dans le paramètre OUT est le ManagerID basé sur l'EmployeeID contenu dans la table HumanResources.Employee
.
Dans l’exemple suivant, une connexion ouverte à l’exemple de base de données AdventureWorks2022 est passée à la fonction, et la méthode execute est utilisée pour appeler la procédure stockée 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));
}
}
Cet exemple utilise les positions ordinales pour identifier les paramètres. Vous pouvez également identifier un paramètre en utilisant son nom plutôt que sa position ordinale. L'exemple de code suivant modifie l'exemple précédent afin de démontrer comment utiliser des paramètres nommés dans une application Java. Les noms des paramètres correspondent aux noms des paramètres dans la définition de la procédure stockée :
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"));
}
}
Remarque
Ces exemples utilisent la méthode execute de la classe SQLServerCallableStatement pour exécuter la procédure stockée. Elle est utilisée parce que la procédure stockée n'a pas retourné de jeu de résultats. Si elle l’avait fait, la méthode executeQuery serait utilisée.
Les procédures stockées peuvent retourner des nombres de mises à jour et des jeux de résultats multiples. Le pilote JDBC Microsoft pour SQL Server suit la spécification JDBC 3.0, qui stipule que les jeux de résultats et nombres de mises à jour multiples doivent être récupérés avant les paramètres OUT. Autrement dit, l’application doit extraire tous les objets ResultSet et tous les nombres de mises à jour avant de récupérer les paramètres OUT avec les méthodes CallableStatement.getter. Autrement, les objets ResultSet et les nombres de mises à jour qui n’ont pas encore été extraits par le pilote sont perdus lors de l’extraction des paramètres OUT. Pour plus d’informations sur les nombres de mises à jour et les jeux de résultats multiples, consultez Utiliser une procédure stockée avec un nombre de mises à jour et Utiliser plusieurs jeux de résultats.