IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

Erreur lors de l'appel d'une procédure stockée


Sujet :

JDBC Java

  1. #1
    Membre actif Avatar de aperrin
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    221
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 221
    Points : 272
    Points
    272
    Par défaut Erreur lors de l'appel d'une procédure stockée
    Bonjour à tous,

    J'ai réalisé un appel de procédure stockée (suivant le tutoriel CallableStatement) de ce cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    		Connection con = HibernateUtil.currentSession().connection();
    		int i = 1; // on commence à 1 à cause du resulset de sortie (je
    		// suppose)
    		String sql = "{? = CALL CONT_NOM1[(?, ?)]}";
    		ResultSet resultat1 = null;
    		ResultSet resultat2 = null;
    		try {
    			CallableStatement cs = con.prepareCall(sql,
    					ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
     
    			cs.setString("" + i++, "" + Config.Parametres.getAnnee());
    			cs.registerOutParameter("" + i++, java.sql.Types.SMALLINT);
    			if (cs.execute()) {
    				// recupération du flag de sortie
    				short flag = cs.getShort(3);
    				log
    						.info("procedure stockée CONT_NOMEN : valeur du flag de sortie :"
    								+ flag);
     
    				// récupération des ResultSet
    				resultat1 = cs.getResultSet();
    				cs.getMoreResults(Statement.KEEP_CURRENT_RESULT);
    				resultat2 = cs.getResultSet();
    				// traitement des informations
    				while (resultat1.next()) {
    					for (int j = 0; i < resultat1.getMetaData()
    							.getColumnCount(); j++) {
    						log.info(resultat1.getObject(j + 1) + ", ");
    					}
    					log.info("");
    				}
    				resultat2.next();
    				log.info("Nombre de lignes = " + resultat2.getObject(1));
     
    			}
    		} catch (SQLException sqle) {
    			log.info(sqle);
     
    		} finally {
    			try {
    				resultat1.close();
    				resultat2.close();
    			} catch (SQLException sqle1) {
    				String errMsg = "Echec de la procedure stockée CONT_NOMEN : \n";
    				log.info(errMsg + sqle1.getMessage());
    				throw new TechnicalException(errMsg + sqle1.getMessage());
    			}
    		}
    Et j'obtiens le message d'erreur suivant :
    JDBC 3 method called - not yet supported

    Sur la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cs.setString("" + i++, "" + Config.Parametres.getAnnee());
    Y a t-il un moyen de contourner le problème ?
    En essayant continuellement, on finit par réussir. Donc plus ça rate, plus on a de chances que ça marche !

  2. #2
    Membre actif Avatar de aperrin
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    221
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 221
    Points : 272
    Points
    272
    Par défaut Réponse
    Voici le bon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    		Connection con = HibernateUtil.currentSession().connection();
    		int i =0; 
    		String sql = "{CALL CONT_NOM1(?, ?)}";
    		ResultSet resultat1 = null;
    		ResultSet resultat2 = null;
    		try {
    			CallableStatement cs = con.prepareCall(sql,
    					ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
     
    			cs.setString(i++, "" + Config.Parametres.getAnnee());
     
    			cs.registerOutParameter( i++, java.sql.Types.SMALLINT);
    			if (cs.execute()) {
    				// recupération du flag de sortie
    				short flag = cs.getShort(2);
    				log
    						.info("procedure stockée CONT_NOMEN : valeur du flag de sortie :"
    								+ flag);
     
    				// récupération des ResultSet
    				resultat1 = cs.getResultSet();
    				cs.getMoreResults(Statement.KEEP_CURRENT_RESULT);
    				resultat2 = cs.getResultSet();
    				// traitement des informations
    				while (resultat1.next()) {
    					for (int j = 0; j < resultat1.getMetaData()
    							.getColumnCount(); j++) {
    						log.info(resultat1.getObject(j + 1) + ", ");
    					}
    					log.info("");
    				}
    				resultat2.next();
    				log.info("Nombre de lignes = " + resultat2.getObject(1));
     
    			}
    		} catch (SQLException sqle) {
    			String errMsg = "Echec de la procedure stockée CONT_NOMEN : \n";
    			log.info(errMsg + sqle.getMessage());
    			throw new TechnicalException(errMsg + sqle.getMessage());
    		} finally {
    			try {
    				if(resultat1 != null) {
    					resultat1.close();
    				} 
    				if(resultat2 != null)  {
    					resultat2.close();
    				}
    			} catch (SQLException sqle1) {
    				String errMsg = "Echec de la procedure stockée CONT_NOMEN : \n";
    				log.info(errMsg + sqle1.getMessage());
    				throw new TechnicalException(errMsg + sqle1.getMessage());
    			}
    		}
    Et la bonne ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cs.setString(i++, "" + Config.Parametres.getAnnee());
    En fait pour le 1er paramètre de la méthode setString il faut un int et pas une String qui correspond à autre chose.

    Maintenant le message d'erreur n'était pas trés explicite...
    En essayant continuellement, on finit par réussir. Donc plus ça rate, plus on a de chances que ça marche !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur lors de l'exécution d'une procédure stockée
    Par sab_info dans le forum Développement
    Réponses: 7
    Dernier message: 15/03/2013, 16h27
  2. Plantage lors de l'appel d'une procédure stockée
    Par thor76160 dans le forum ASP.NET MVC
    Réponses: 7
    Dernier message: 27/12/2012, 16h32
  3. Réponses: 7
    Dernier message: 05/06/2008, 14h37
  4. Erreur lors de l'appel d'une DLL créée avec Visual
    Par WELCOMSMAIL dans le forum C++Builder
    Réponses: 6
    Dernier message: 06/09/2006, 15h53
  5. Problème lors de l'appel d'une procédure stockée
    Par ToxiZz dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 21/05/2006, 23h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo