Actuellement dans le développement d'une reprise d'un abandonware (BoulderDash) nous voulons connecter notre programme à une base de donnée MYSQL.
Pour ceci nous utilisons le driver JDBC, MYSQL (Xamp) ainsi que Eclipse. Je vous explique mon soucis :
Ayant bien configuré la connexion, le programme se connecte bien à la BDD. Je voudrais appeler une procédure stockée (avec un argument) et récupérer ce qu'elle renvoie. Cependant Eclipse me donne une erreur disant qu'il n'y a aucun retour.
Voilà les 3 bouts de code :
final class BoulderDashBDDConnector {
/** The instance. */
private static BoulderDashBDDConnector instance;
/** The login. */
private static String user = "root";
/** The password. */
private static String password = "";
/** The url. */
private static String url = "jdbc:mysql://localhost/boulderdash?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC";
Partie configuration des paramètres de connexion JDBC
public static Example callMapContent(final int id_map) throws SQLException {
final CallableStatement callStatement = prepareCall(callMapContent);
Example example = null;
callStatement.setInt(1,id_map);
callStatement.execute();
String result = callStatement.getString(1);
System.out.println(result);
return example;
}
Méthode d'appel et récupération de la procédure stockée.
DELIMITER |
CREATE PROCEDURE CallMap
(IN ID INT(2))
BEGIN
SELECT content_map AS "Map Content"
FROM maps
WHERE id_map = ID;
END |
DELIMITER ;
/*
Exemple d'appel :
CALL CallMap(1);
*/
Partie code de la procédure stockée.
L'erreur en question :
java.sql.SQLException: No output parameters returned by procedure.
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:545)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:513)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:505)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:479)
at com.mysql.cj.jdbc.CallableStatement.getOutputParameters(CallableStatement.java:1472)
at com.mysql.cj.jdbc.CallableStatement.getString(CallableStatement.java:1555)
at model.dao.ExampleDAO.callMapContent(ExampleDAO.java:41)
at model.ModelFacade.callMapContent(ModelFacade.java:29)
at controller.ControllerFacade.start(ControllerFacade.java:45)
at main.Main.main(Main.java:28)
EDIT :
J'ai résolu le problème, en effet je n'avais effectivement pas de paramètre OUT dans ma procédure stockée. Par conséquent j'ai maintenant ça :
DELIMITER |
CREATE PROCEDURE CallMap
(IN ID INT(2), OUTPUT content varchar(250000) )
BEGIN
SELECT content_map INTO content
FROM maps
WHERE id_map = ID;
END |
DELIMITER ;
Et je n'ai plus l'erreur de non retour. Cependant après j'ai eu une erreur comme quoi la variable était pas enregistrée comme variable de sortie ducoup j'ai du entrer cette ligne :
Et voilà, j'ai encore une erreur, cette fois en aucun cas un rapport avec la BDD :
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at com.mysql.cj.jdbc.CallableStatement.checkIsOutputParam(CallableStatement.java:583)
at com.mysql.cj.jdbc.CallableStatement.registerOutParameter(CallableStatement.java:1757)
at com.mysql.cj.jdbc.CallableStatement.registerOutParameter(CallableStatement.java:1764)
at model.dao.ExampleDAO.callMapContent(ExampleDAO.java:38)
at model.ModelFacade.callMapContent(ModelFacade.java:29)
at controller.ControllerFacade.start(ControllerFacade.java:45)
at main.Main.main(Main.java:28)
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.