StoredProcedureResult call (java.lang.String sql, Object... parameters)
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 effectue les opérations suivantes :
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 effectue les opérations suivantes :
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 effectue les opérations suivantes :
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 effectue les opérations suivantes :