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 :

ORA-01001 : invalid cursor avec Iterator


Sujet :

JDBC Java

  1. #1
    Membre régulier Avatar de Tora21
    Homme Profil pro
    Développeur("Java"); //Débutant
    Inscrit en
    Mai 2011
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur("Java"); //Débutant

    Informations forums :
    Inscription : Mai 2011
    Messages : 140
    Points : 116
    Points
    116
    Par défaut ORA-01001 : invalid cursor avec Iterator
    salut tous le monde,

    Le problème qui m'amène concerne une extraction de donnée, d'une BDD oracle.

    J'ai crée un Iterator, dans mon batch, je vérifie qu'il contient bien des données, mais après je le transforme en objet, et lorsque je veux utiliser la méthode it.next(); je déclenche l'erreur ORA-01001 : invalid cursor.

    voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Iterator it = null;
    it = #####;
     
    System.out.println("test 1");
     
    while (it.hasNext()) {
            System.out.println("test 2");
            obj = it.next();
            System.out.println("test 3");
    Donc dans mon code ça plante au test 3.

    le problème est "obj = it.next();"

    Si vous avez des conseils je suis preneur.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    comment est créé l'iterator? Qu'est-ce qu'il y a derrière? Est-ce que la connexion DB ou le statement n'aurait pas été ouverte? Est-ce que tu n'aurais pas faire une autre requete SQL sur la même connexion depuis la création de l'iterator?

  3. #3
    Membre régulier Avatar de Tora21
    Homme Profil pro
    Développeur("Java"); //Débutant
    Inscrit en
    Mai 2011
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur("Java"); //Débutant

    Informations forums :
    Inscription : Mai 2011
    Messages : 140
    Points : 116
    Points
    116
    Par défaut
    L'Iterator est crée dans le batch et je lui donne en valeur le contenu de la BDD retourné par une méthode d'extraction.

    Pour la connexion oui elle est ouverte au début du batch.

    Pour le statement, je l'ouvre, j'en extrait les données, j'utilise le resultSet, puis je ferme le resultSet et je ferme le statement. Tous ça pour deux requêtes différentes et dans une autre classe.

    L'Iterator est crée après les requêtes.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    code de création de l'iterator svp, je suis pas devin
    Tant que l'iterator est lié à la base de donnée (via le resultset), vous ne pouvez pas effectuer d'autres requetes sur la base de donnée. vous n'avez aucune garantie que la base de donnée gère une quelconque forme de multiplexage de la connexion qui lui permettrait de traiter plusieurs resultset simultanément. Le message d'oracle vous indique que le handle utilisé pour la requete que vous tentez d'utiliser a déjà été détruit.

  5. #5
    Membre régulier Avatar de Tora21
    Homme Profil pro
    Développeur("Java"); //Débutant
    Inscrit en
    Mai 2011
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur("Java"); //Débutant

    Informations forums :
    Inscription : Mai 2011
    Messages : 140
    Points : 116
    Points
    116
    Par défaut
    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
     
        public Iterator getDonneeBord(Connection cnx,int codSect, String dateMiseADispo, int ordre) throws ExceptionDAO {
     
            String sql = "SELECT * FROM CPTA.VIREMENT WHERE CODE_SECTEUR = ? AND DATE_MISE_A_DISPO = ? AND ORDRE = ?";
            try {
                PreparedStatement stmt = cnx.prepareStatement(sql) ;
                stmt.setInt(1,codSect);
                stmt.setString(2,dateMiseADispo);
                stmt.setInt(3,ordre);
                ResultSet rs2 = stmt.executeQuery();
     
                Iterator it = new VirementIterator(rs2, sql);
     
                stmt.close();
                rs2.close();
     
                return it;
     
            } catch (SQLException eSQL) {
                throw new ExceptionDAO("Ne peut executer getDonneeBord\nsql(" + sql + 
                                       ")\n" + eSQL.getMessage(), eSQL);
            }
        }
    puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        private class VirementIterator extends SqlIterator {
            VirementIterator(ResultSet rs, String sql) throws SQLException {
                super(rs, sql);
            }
     
            public Object createObjectFromRow(ResultSet resultSet) throws SQLException {
                return OracleVirementDAO.this.createObjectFromRow(resultSet);
            }
        }
    et enfin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        public Object createObjectFromRow(ResultSet rs3) throws SQLException {
            Virement vir;
     
            vir = new Virement();
     
            vir.setCodSect(rs3.getInt("CODE_SECTEUR")); // c'est à cette ligne que le débugger va en erreur
            vir.etc...
     
            return vir;
        }

  6. #6
    Membre régulier Avatar de Tora21
    Homme Profil pro
    Développeur("Java"); //Débutant
    Inscrit en
    Mai 2011
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur("Java"); //Débutant

    Informations forums :
    Inscription : Mai 2011
    Messages : 140
    Points : 116
    Points
    116
    Par défaut
    Bon ben j'ai viré les stmt.close(); et rs.close(); et ça marche. Mais bon ces truc là ne devraient-ils pas êtres fermés normalement?

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    oui tu dois toujours les fermer. Mais "après" les avoir utilisés

  8. #8
    Membre régulier Avatar de Tora21
    Homme Profil pro
    Développeur("Java"); //Débutant
    Inscrit en
    Mai 2011
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur("Java"); //Débutant

    Informations forums :
    Inscription : Mai 2011
    Messages : 140
    Points : 116
    Points
    116
    Par défaut
    En fouillant bien avec le debugger, j'ai trouvé, ils sont fermé dans une classe bien caché.

    Merci de ton aide, tu m'a mis sur la voie quand ta dit:
    Le message d'oracle vous indique que le handle utilisé pour la requete que vous tentez d'utiliser a déjà été détruit.

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

Discussions similaires

  1. [Oracle] ORA-01001: invalid cursor in
    Par aphp1 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 17/12/2008, 09h25
  2. ORA-01001: invalid cursor
    Par LP-mpascolo dans le forum Administration
    Réponses: 10
    Dernier message: 12/10/2007, 09h50
  3. curseur invalid ora-01001
    Par couse1 dans le forum SQL
    Réponses: 4
    Dernier message: 13/07/2007, 09h37
  4. ora-01001 : invalid cursor
    Par sherdogvdb dans le forum Oracle
    Réponses: 1
    Dernier message: 02/03/2007, 12h36
  5. ORA 01001 invalid cursor
    Par claralavraie dans le forum Oracle
    Réponses: 10
    Dernier message: 28/07/2006, 15h13

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