Bonjour à tous,
Pourriez-vous m'aider à résoudre mon problème :
Cela fait quelques jours que je n'arrive pas à trouver une solution complète.
Je dois créer un programme qui exécute la création de diverses procédures stockées sous éclipse.
Pour cela j'utilise une classe qui contient les méthodes avec toutes les procédures : ProcedureSQL
Ensuite je rempli mon POJO Paramètre : LectureParametreDivers.processProperties()
J'ouvre ma connexion.
Je crée le Statement et je lui passe ma chaîne de caractères contenant toutes mes procédures stockées.
Voici le Main :
"""""""""""""""""""""""""
public static void main(String[] args) throws SQLException
{
// TODO Auto-generated method stub
ProcedureSQL pSQL = new ProcedureSQL();
LectureParametreDivers lectureParametreDivers=new LectureParametreDivers();
Parametre parametre=lectureParametreDivers.processProperties();
Connexion.ouvrirConnexion(parametre);
Statement st = Connexion.getConnect().createStatement();
st.execute(pSQL.toString());
st.close();
Connexion.fermerConnexion();
}
""""""""""""""""""""""""""
A fonctionne :
Si Ma String (pSQL) retourne qu'une seule procédure, ça fonctionne.
voir ci dessous :
"""""""""""""""""""""""""""""""""""""""""""
public class ProcedureSQL {
private String str="";//"USE `mmr`; ";
public ProcedureSQL()
{
//dropProcedure();
rechercherPatientMedidocNom();
/*rechercherPatientMedidocPrenom();
rechercherPatientMedidocPrenomNom();
rechercherPatientMedidocDateNaiss();
rechercherPatientMedidocNiss();
insertionDansTablePatient();
insertionDansTableSoignant();
insertionDansTableLocalite();*/
}
private void dropProcedure() {
// TODO Auto-generated method stub
}
private void rechercherPatientMedidocNom()
{
str+=""+//"DROP PROCEDURE IF EXISTS `RECHERCHEPARNOM`; "+
"CREATE PROCEDURE `RECHERCHEPARNOM`(IN `nom` VARCHAR(50)) "+
"SELECT name, firstname, inv_date, niss "+
"FROM PATIENT "+
"INNER JOIN Donneesdiv ON fk_ID_DONNEESDIV = ID_DONNEESDIV "+
"WHERE name LIKE @nom; ";
}
private void rechercherPatientMedidocPrenom()
{
str+=""+//"DROP PROCEDURE IF EXISTS `RECHERCHEPARPRENOM`; "+
"CREATE PROCEDURE `RECHERCHEPARPRENOM`(IN `prenom` VARCHAR(50)) "+
"SELECT name,firstname,inv_date,niss "+
"FROM PATIENT "+
"INNER JOIN Donneesdiv ON fk_ID_DONNEESDIV=ID_DONNEESDIV "+
"WHERE FIRST_NAME like @prenom; ";
}
""""""""""""""""""""""""""""""""""""
(je n'ai pas mis tout le code car cet exemple suffit mais je le mets à disposition en pièce jointe)
(les codes en commentaire sont diverses tests qui ont échoués)
La seule méthode non en commentaire exécutée contenant une procédure stockée se retrouve bien dans mon SGBD.
B Erreur :
Si Ma String (pSQL) retourne plus d'une procédure, ça plante.
console :
""""""""""""""""""""""""""""""
16 avr. 2013 18:14:52,272[main] DEBUG mmr.logger.ClasseLogger - connexion réussie
Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CREATE PROCEDURE `RECHERCHEPARPRENOM`(IN `prenom` VARCHAR(50)) SELECT name,first' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1053)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2728)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2678)
at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:894)
at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:732)
at mmr.oldData.sql.LancementProcedureStockee.main(LancementProcedureStockee.java:23)
""""""""""""""""""""""""""""""
Ce qui est fort étonnant, c'est qui si je copie à l'exactitude mes procédures dans mes méthodes et que je les colles dans PHPMyAdmin et que j’exécute le code, il m'enregistre bien toutes mes procédures...
Auriez-vous une idée qui me décoincerais?
J'utilise :
*java jdk6
*Eclipse v. JUNO
*Connecteur mysql v. 5.1.22
*XAMPP portable v.3.1.0 beta 4
Merci d'avance pour vos réponses.
ps : si besoin, je peux mettre tout le projet en pièce jointe.
Partager