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. La syntaxe de la séquence d’échappement call
avec des paramètres OUT est la suivante :
{call procedure-name[([parameter][,[parameter]]...)]}
Notes
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 en utilisant le caractère ? (point d'interrogation). Ce caractère fait office d'espace réservé pour les valeurs de paramètre qui sont retournées 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 seconde 2.
Notes
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. Notez que 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"));
}
}
Pour les pilotes version 12.6 et ultérieures, une nouvelle propriété de connexion useFlexibleCallableStatements
a été introduite. Lorsqu’elle est définie sur true
, cette propriété conserve l’ancien comportement du pilote, ce qui permet aux utilisateurs d’utiliser une combinaison de positions ordinales et de noms de paramètres lors de l’identification des paramètres. Lorsqu’il est défini sur false
, l’utilisateur doit utiliser l’une ou l’autre, mais ne peut pas utiliser les deux à la fois.
En outre, useFlexibleCallableStatements
conserve le comportement existant concernant l’ordre flexible dans lequel les paramètres d’instruction peuvent être définis lorsque la propriété est définie sur true
. Lorsque la valeur est définie false
, l’ordre doit correspondre à la définition de la procédure stockée. Ces deux fonctionnalités pour useFlexibleCallableStatements=true
sont visibles dans l’exemple suivant :
public static void executeStoredProcedure(Connection con) throws SQLException {
try(CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}"); ) {
cstmt.registerOutParameter("managerID", java.sql.Types.INTEGER);
cstmt.setInt(1, 5);
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. Si tel n’est pas le cas, les objets ResultSet et les nombres de mises à jour qui n’ont pas encore été extraits 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.
Voir aussi
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : pendant toute l’année 2024, nous allons éliminer progressivement Problèmes GitHub comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, voir :Soumettre et afficher des commentaires pour