Share via


Utilisation d'une procédure stockée avec des paramètres de sortie

Télécharger le pilote JDBC

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

Utilisation d'instructions avec des procédures stockées