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

Oracle Discussion :

[java.sql.SQLException: ORA-01002: fetch out of sequence]


Sujet :

Oracle

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 204
    Points : 102
    Points
    102
    Par défaut [java.sql.SQLException: ORA-01002: fetch out of sequence]
    bonjour quelq un oeux m epliquer cette erreur

    Je vosu explique brievement ce que j eveux, faire

    J essaie de poser un verrou sur une table, mes requetes sql sont faites en java:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT id FROM my_sequence WHERE name_table = ? FOR UPDATE
    et pour la mise a jour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE my_sequence SET id= ? WHERE name_table = ?
    par co,tre j obtiens l erreur "fetch out of sequence"

    ca veut dire quoi?

  2. #2
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    $ oerr ora 01002
    01002, 00000, "fetch out of sequence"
    // *Cause: This error means that a fetch has been attempted from a cursor
    // which is no longer valid. Note that a PL/SQL cursor loop
    // implicitly does fetches, and thus may also cause this error.
    // There are a number of possible causes for this error, including:
    // 1) Fetching from a cursor after the last row has been retrieved
    // and the ORA-1403 error returned.
    // 2) If the cursor has been opened with the FOR UPDATE clause,
    // fetching after a COMMIT has been issued will return the error.
    // 3) Rebinding any placeholders in the SQL statement, then issuing
    // a fetch before reexecuting the statement.
    // *Action: 1) Do not issue a fetch statement after the last row has been
    // retrieved - there are no more rows to fetch.
    // 2) Do not issue a COMMIT inside a fetch loop for a cursor
    // that has been opened FOR UPDATE.
    // 3) Reexecute the statement after rebinding, then attempt to
    // fetch again.

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 204
    Points : 102
    Points
    102
    Par défaut
    j avais deja regardé ces préconisation (merci)

    Alors pour éclaircir un peu, j utilise la meme connection pour ces 2 requetes, à savoir que ma base est en autoCommit, est ce que cela peut poser probleme?

  4. #4
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Il faudrait avoir la trace des étapes de parsing/prepare, des phases d'exécution et de binding pour savoir ce qui se passe exactement.

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 204
    Points : 102
    Points
    102
    Par défaut
    ok

    mais comme c est du java et du sql, j espere ne pas me tromper de forum, voici mon 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
     public static Integer updateIdNumber2(String nameTable,Connection connection) throws GedFatalExceptionDB,
       NamingException, Exception {
      Integer id =null;
      ResultSet resultSet = null;
      PreparedStatement preparedStmt = null;
      try {
       connection = getConnection();
       preparedStmt = connection.prepareStatement(RETUNN_ID);
       preparedStmt.setObject(CONSTANT, nameTable.trim(), Types.VARCHAR);
       resultSet = preparedStmt.executeQuery();
       while (resultSet.next()) {
        id = new Integer(resultSet.getInt("ID"));
       }
       preparedStmt = connection.prepareStatement(UPDATE_ID);
       preparedStmt.setInt(CONSTANT, id.intValue());
       preparedStmt.setObject(CONSTANT + 1, nameTable.trim(), Types.VARCHAR);
       preparedStmt.executeUpdate();
       
      } catch (SQLException e) {
       LOGGER.error(e.getMessage(), e);
       throw new GedFatalExceptionDB("problème sur la table des Id");
      } catch (Exception e) {
       LOGGER.error(e.getMessage(), e);
       throw new GedFatalExceptionDB("Impossible d'établir une connection");
      }
      finally{
       closeConnection(connection);
      }
     
      return id;
     }
    mon code plante la ou il y a du rouge

  6. #6
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Moi, j'utilise plutôt ce type de syntaxe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        ....
        req =  "SELECT " ;
        req += "NOM, NVL(PRENOM,' '), IDENTIFIANT, NVL(SOCIETE,' '), " ;
        req += "NVL(FONCTION,' '), ACTIF, INTERNE, NVL(TEL_BUREAU,' ') " ;
        req += "FROM UTILISATEURS " ;
        req += "WHERE LOGIN = '" + login + "'" ;    
     
        Statement stmt = conn.createStatement ();
        ResultSet rset  = stmt.executeQuery ( req ); 
        while (rset.next ())
        ....

  7. #7
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 204
    Points : 102
    Points
    102
    Par défaut
    bon et bien j ai trouvé

    Explication:

    Moi je susi en autoCOmmit, mais le requete FOR UPDATE ne doit pas etre en auto commit

    du coup j ai ajouté 2 lignes de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       connection.setAutoCommit(false);
    et avant de fermer ma connection je commit tout

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
     connection.commit();

  8. #8
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    D'accord mais je pense que vous aviez l'erreur sur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while (resultSet.next())
    et que cela correspond au cas suivant:
    // 2) If the cursor has been opened with the FOR UPDATE clause,
    // fetching after a COMMIT has been issued will return the error.
    car votre le COMMIT était réalisé à chaque exécution de requête.

    De façon générale, avoir une connexion JDBC/ODBC en autocommit avec Oracle est à éviter: une transaction doit comporter toutes les instructions nécessaires à sa bonne exécution ni plus ni moins.

  9. #9
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 204
    Points : 102
    Points
    102
    Par défaut
    honnettement n étant pas une experte de BdD, je ne sais meme pas comment ma base est configuré en autocommit, apparemment c est par défaut

  10. #10
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    C'est la propriété par défaut des connexions JDBC/ODBC quelque soit la base utilisée en fait.

    Pour plus d'info à ce sujet: http://asktom.oracle.com/pls/ask/f?p...:1519405621318

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 21/08/2007, 13h47
  2. erreur ORA-01002: fetch out of sequence
    Par lazzeroni dans le forum Oracle
    Réponses: 2
    Dernier message: 19/06/2006, 14h54
  3. [8i]ORA-01002: fetch out of sequence
    Par patmaba dans le forum Oracle
    Réponses: 2
    Dernier message: 10/02/2006, 09h10
  4. Réponses: 4
    Dernier message: 25/01/2006, 18h25
  5. [PL/SQL + VB] ORA-01002 fetch out of sequence
    Par superfly dans le forum Oracle
    Réponses: 10
    Dernier message: 03/01/2005, 20h33

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