Les paramètres OUT et INOUT dans les objets StoredProcedureResult

Lorsqu'un objet StoredProcedureResult est renvoyé, la valeur de tout paramètre OUT ou INOUT renvoyé par la procédure mémorisée se trouve dans l'Object[] renvoyé par la méthode getOutputParms() de l'objet StoredProcedureResult.
Les objets StoredProcedureResult sont renvoyés par cette version de la méthode call() de l'interface Data :
StoredProcedureResult call (java.lang.String sql, Object... parameters)

Transmission des paramètres positionnels

Prenons en exemple une procédure mémorisée définie pour contenir deux paramètres IN Integer, un paramètre OUT Float et aucun résultat de requête renvoyé. Vous pourriez l'appeler à l'aide d'une logique telle que :

Integer one = new Integer(1);                                                      1 
Integer three = new Integer(3);
Connection con = DriverManager.getConnection(...);                                 2 
Data db = DataFactory.getData(con);                                                3 

StoredProcedureResult spr = db.call("CALL getRatio(?, ?, ?)", one, three, null);   4 
Object[] outputs = spr.getOutputParms();                                           5 
Float oneThird = outputs[2]; // outputs is Object[3]                               6 
spr.close();   // best practice                                                    7 

Le code exécute les étapes suivantes :

  1. Déclaration et initialisation de deux variables à utiliser pour les paramètres IN.
  2. Création d'une connexion à la base de données.
  3. Création d'une instance de l'implémentation de l'interface Data.
  4. Appel de la méthode Data.call(), qui exécute l'instruction CALL transmettant les valeurs des paramètres IN et qui enregistre le résultat dans une implémentation de StoredProcedureResult.
  5. Stockage des valeurs des paramètres INOUT et OUT dans un tableau Object[]. Les paramètres IN ne sont pas placés dans le tableau et sont accompagnés d'un paramètre fictif NULL
  6. Stockage de la valeur du paramètre OUT dans un objet Float. Notez que la valeur du paramètre OUT est le troisième objet du tableau car les deux premiers objets sont les valeurs des paramètres IN.
  7. Fermeture et libération des éventuelles ressources associées à StoredProcedureResult spr.

Les points d'interrogation sont des marqueurs de paramètre positionnel. Le premier correspond au paramètre Integer one, le deuxième au paramètre Integer three et le dernier au paramètre null. La valeur null est un paramètre fictif pour la valeur du paramètre OUT de la procédure mémorisée.

Pour obtenir un autre exemple, supposons que vous disposez seulement d'informations partielles concernant la méthode SQL getRatio(). Si vous ne saviez pas que la méthode getRatio() renvoie les résultats de la requête et si vous ne saviez pas si certains des paramètres IN étaient également des paramètres OUT, la logique peut se présenter plutôt ainsi :

Integer one = new Integer(1);                                                     1 
Integer three = new Integer(3);
Connection con = DriverManager.getConnection(...);                                2 
Data db = DataFactory.getData(con);                                               3 

StoredProcedureResult spr = db.call("CALL getRatio(?, ?, ?)", one, three, null);   4 
Object[] outputs = spr.getOutputParms();                                           5 
for (int j = 0; j < outputs.length; j++)                                          6 
 System.out.println(j + ": " + outputs[j]); 

 while (spr.moveToNext()) {                                                       7 
      ResultSet rsPtr = spr.getResults();
      ...                                                                         8 
   }
}

spr.close();                                                                      9 

Le code exécute les étapes suivantes :

  1. Déclaration et initialisation de deux variables à utiliser pour les paramètres IN.
  2. Création d'une connexion à la base de données.
  3. Création d'une instance de l'implémentation de l'interface Data.
  4. Appel de la méthode Data.call(), qui exécute l'instruction CALL transmettant les valeurs des paramètres IN et qui enregistre le résultat dans une implémentation de StoredProcedureResult.
  5. Stockage des valeurs des paramètres INOUT et OUT dans un tableau Object[]. Les paramètres IN ne sont pas placés dans le tableau et sont accompagnés d'un paramètre fictif NULL
  6. Impression des valeurs dans le tableau Object[].
  7. Si la procédure mémorisée a renvoyé les résultats de la requête, fermez le paramètre ResultSet renvoyé, le cas échéant, puis passez au paramètre ResultSet suivant.
  8. Traitez le paramètre ResultSet actuel auquel rsPtr fait référence.
  9. Fermez et libérez les éventuelles ressources associées à StoredProcedureResult spr.

Transmission des paramètres dans des beans

Lorsque les paramètres sont transmis à la méthode Data.call() dans un bean ou un objet Map, les valeurs des paramètres renvoyés OUT et INOUT de la procédure mémorisée dans le tableau Object[] sont utilisées pour mettre à jour le bean ou l'objet Map concerné.

Par exemple, imaginons un bean, Ratio, avec un numérateur de propriétés, un dénominateur et un ratio.

Integer one = new Integer(1);                                   1 
Integer three = new Integer(3);
Ratio rValue = new Ratio(one, three);                           2 
Connection con = DriverManager.getConnection(...);              3 
Data db = DataFactory.getData(con);                             4 

StoredProcedureResult spr = db.call(
  "CALL getRatio(:numerator, :denominator, :ratio)", rValue);   5 
Float oneThird = rValue.getRatio();                             6 
spr.close();                                                    7 

Dans cet exemple, l'utilisation des marqueurs de paramètre :nom indique qu'il n'y a qu'un paramètre, à savoir le bean, même s'il aurait aussi bien pu s'agir d'un objet Map.

Le code exécute les étapes suivantes :

  1. Déclaration et initialisation de deux variables, one et three.
  2. Déclaration et initialisation d'une référence à un nouveau bean Ratio rValue, avec transmission de one et three au constructeur pour fournir les valeurs du numérateur et du dénominateur.
  3. Création d'une connexion à la base de données.
  4. Création d'une instance de l'implémentation de l'interface Data.
  5. Appel de la méthode Data.call(), exécutant l'instruction CALL transmise dans rValue. Les propriétés numerator et denominator sont les paramètres IN, et ratio est le paramètre OUT. L'instruction CALL met à jour la valeur de ratio.
  6. Stockage de la valeur du ratio dans le nouveau paramètre Float oneThird.
  7. Fermeture et libération des éventuelles ressources associées à StoredProcedureResult spr.

Transmission des paramètres dans des objets de mappe

Imaginons qu'une procédure mémorisée est appelée en transmettant des valeurs correspondant aux propriétés d'un bean DeptProject pour un ID de projet et une nouvelle date de fin du projet. Le paramètre OUT est un niveau de personnel mis à jour qui est nécessaire pour ce projet du département.

On ne développe pas toujours une procédure mémorisée dans ce seul objectif ; toutefois, des projets mineurs se trouvent dans des projets majeurs, de sorte qu'une mise à jour de la date de fin pour un seul projet pourrait se répercuter sur de nombreux projets le contenant : les procédures mémorisées sont donc adaptées à ce type d'opération en cascade. Le paramètre transmis à la méthode call() peut être un objet DeptProject, mais il n'est pas recommandé d'utiliser des objets que l'on n'a pas l'intention de remplir complètement ou d'utiliser comme on le ferait avec une instance entièrement remplie. Un objet Map est le meilleur choix pour ce type d'utilisation.

Dans l'exemple qui suit, un appel de cette procédure mémorisée peut se présenter ainsi :

Map<String, Object> slipMap;                                             1 

//...                                                                    2 

Connection con = DriverManager.getConnection(...);              3 
Data db = DataFactory.getData(con);                             4 

StoredProcedureResult spr = db.call(
  "CALL newEndDate(":projectId, :endDate, :staffLevel)", slipMap );      5 
spr.close();                                                             6 

Le code exécute les étapes suivantes :

  1. Déclaration du nouveau paramètre Map slipMap.
  2. Définition de projectId et endDate dans slipMap.
  3. Création d'une connexion à la base de données.
  4. Création d'une instance de l'implémentation de l'interface Data.
  5. Appel de la méthode Data.call(), exécutant l'instruction CALL transmise dans slipMap. Les propriétés projectId et endDate sont les paramètres IN, alors que staffLevel est le paramètre OUT. L'instruction CALL met à jour la valeur de staffLevel.
  6. Fermeture et libération des éventuelles ressources associées à StoredProcedureResult spr.

Commentaires