Sobes.tech
Middle

Qu'est-ce que les procédures stockées et comment peut-on les appeler via JDBC?

sobes.tech IA

Réponse de l'IA

Les procédures stockées sont un ensemble d'instructions SQL compilées et stockées dans la base de données. Elles s'exécutent comme une unité et peuvent accepter des paramètres, retourner des valeurs. Elles permettent d'encapsuler la logique métier, d'améliorer la performance et la sécurité.

Pour appeler des procédures stockées via JDBC, on utilise l'interface CallableStatement.

import java.sql.*;

public class StoredProcedureExample {

    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase"; // URL de votre base de données
        String user = "myuser";
        String password = "mypassword";

        try (Connection conn = DriverManager.getConnection(url, user, password)) {

            // Appel de procédure sans paramètres
            String sqlNoParams = "{CALL my_procedure_no_params()}";
            try (CallableStatement stmtNoParams = conn.prepareCall(sqlNoParams)) {
                stmtNoParams.execute();
                System.out.println("Procédure sans paramètres exécutée.");
            }

            // Appel de procédure avec paramètre d'entrée
            String sqlWithInParams = "{CALL my_procedure_with_in(?, ?)}";
            try (CallableStatement stmtWithInParams = conn.prepareCall(sqlWithInParams)) {
                stmtWithInParams.setString(1, "Valeur1"); // Définir le premier paramètre IN
                stmtWithInParams.setInt(2, 42);           // Définir le deuxième paramètre IN
                stmtWithInParams.execute();
                System.out.println("Procédure avec paramètres d'entrée exécutée.");
            }

            // Appel de procédure avec paramètre de sortie
            String sqlWithInOutParams = "{CALL my_procedure_with_out(?, ?)}";
            try (CallableStatement stmtWithInOutParams = conn.prepareCall(sqlWithInOutParams)) {
                stmtWithInOutParams.setInt(1, 123); // Définir le paramètre IN
                stmtWithInOutParams.registerOutParameter(2, Types.VARCHAR); // Enregistrer le paramètre OUT
                stmtWithInOutParams.execute();
                String outValue = stmtWithInOutParams.getString(2);
                System.out.println("Procédure avec paramètre de sortie exécutée. Valeur de sortie : " + outValue);
            }

            // Appel de procédure retournant ResultSet
             String sqlWithResultSet = "{CALL my_procedure_return_rs()}";
             try (CallableStatement stmtWithResultSet = conn.prepareCall(sqlWithResultSet)) {
                 boolean hasResultSet = stmtWithResultSet.execute();

                 if (hasResultSet) {
                     try (ResultSet rs = stmtWithResultSet.getResultSet()) {
                         while (rs.next()) {
                             // Traitement des données du ResultSet
                             System.out.println("ID : " + rs.getInt("id") + ", Nom : " + rs.getString("name"));
                         }
                     }
                 }
             }


        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Étapes principales :

  1. Obtenir une connexion à la base de données (Connection).
  2. Créer un objet CallableStatement en utilisant connection.prepareCall(). La chaîne d'appel doit être au format {CALL nom_procedure(...)}.
  3. Si la procédure a des paramètres d'entrée (IN ou INOUT), définir leurs valeurs avec les méthodes setXyz(). La numérotation des paramètres commence à 1.
  4. Si la procédure a des paramètres de sortie (OUT ou INOUT), ils doivent être préalablement enregistrés avec le type de données via registerOutParameter(int parameterIndex, int sqlType).
  5. Exécuter l'appel à la procédure stockée avec execute() ou executeQuery() (si la procédure retourne un ResultSet).
  6. Pour les paramètres de sortie, récupérer leurs valeurs avec getXyz().
  7. Traiter le ResultSet si la procédure en retourne un.
  8. Fermer CallableStatement, ResultSet et Connection. Il est recommandé d'utiliser try-with-resources.

L'utilisation de CallableStatement permet de travailler avec différents types de paramètres dans les procédures stockées, y compris les tableaux, structures et objets de types spécifiques à la base de données.