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

SQL Oracle Discussion :

Erreur ORA-01002 inexplicable ?


Sujet :

SQL Oracle

  1. #1
    Membre expérimenté Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Par défaut Erreur ORA-01002 inexplicable ?
    Bonjour,

    Je suis sous Oracle 10gR2.
    J'ai un problème avec un bout de code en PL/SQL qui plante avec l'erreur ORA-01002 : fetch out of sequence.
    Après recherche, il apparaitrait que cette erreur se produit dans un des 3 cas suivant :
    1. Fetch d'un curseur alors que toutes les lignes ont été lues
    2. Commit à l'intérieur d'une boucle FOR LOOP sur un curseur ouvert en mode FOR UPDATE
    3. Re-bind de variable d'une requête SQL et fetch sans rééxecuter la requête
    Le code a l'aspect suivant: (dans un package)
    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
     
    PROCEDURE MAPROC IS
    CURSOR C1 IS
      SELECT ...
      FROM TABLE_DES_VOYAGES M
      WHERE M.KEY = MaVariableKey
      AND EXISTS (SELECT 1 FROM TABLE_DES_TRAVAUX T WHERE T.KEY = M.KEY AND T.STATUS <> 'X')
      FOR UPDATE;
    R1 C1%ROWTYPE;
    CURSOR C2 IS
       SELECT ...
       FROM TABLE_DES_TRAVAUX 
       WHERE KEY = R1.KEY
       FOR UPDATE;
    CURSOR C3 IS
       SELECT ...
       FROM TABLE_QUELCONQUE
       WHERE << condition >>;
    R3 C3%ROWTYPE;
    BEGIN
       FOR FORTDV IN C1 LOOP 
           R1.KEY = FORTDV.KEY;
           UPDATE TABLE_DES_VOYAGES
           SET CHAMP = Calcul
           WHERE CURRENT OF C1;
     
           PROC_INSERT_TEMP; -- procédure autonome
     
           OPEN C3;
           LOOP
               FETCH C3 INTO R3;
               EXIT WHEN C3%NOTFOUND;
               -- calcul sur R3
           END LOOP;
           CLOSE C3;
     
           FOR R2 IN C2 LOOP
               UPDATE TABLE_DES_TRAVAUX
               SET CHAMP = Calcul
               WHERE CURRENT OF C2;
           END LOOP;
       END LOOP;
    EXCEPTION ...
    END;
    La procédure PROC_INSERT_TEMP est une procédure autonome (PRAGMA AUTONOMOUS_TRANSACTION) qui fait une insertion dans une table et un commit.

    A la vue du code, j'ai d'abord cherché la présence d'un COMMIT qui agirait dans un des 2 FOR LOOP. Malheureusement, le seul présent est dans la procédure autonome, et j'ai effectué plusieurs tests qui m'ont montré que dans ce cas, il n'y a pas d'erreur.

    J'ai ensuite envisagé une erreur sur le fetch du curseur C3, mais là aussi, des tests m'ont montré que j'ai beau faire plus de fetch que le curseur a de lignes, je ne tombe pas en erreur. Tout au plus, ma variable receptrice vaut NULL et j'ai C3%FOUND = FALSE.

    Donc, à ce stade, je suis bloqué aux constatations suivantes :
    1. Le cas du fetch alors que toutes les lignes ont déjà été lues ne semble pas être le problème (d'ailleurs, je n'arrive pas à reproduire cette erreur)
    2. Le cas du commit dans une boucle FOR LOOP avec un curseur FOR UPDATE n'est pas le problème de manière quasiment certaine
    3. J'avoue ne pas comprendre ce que veut dire le rebind ? D'ailleurs, je remets la définition en anglais au cas où ma traduction soit hasardeuse : Rebinding any placeholders in the SQL statement, then issuing a fetch before reexecuting the statement
    Je ne peux hélas pas débugger ce bout de code, ni rejouer le package car cela se passe en production. Avez-vous des idées sur le problème ?

  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
    Par défaut
    C'est bizarre: il y avait un bug dans les versions 8i qui ressemble beaucoup à votre problème:

    Bug 1375214 Commit in an AUTONOMOUS transaction resets SELECT FOR UPDATE cursors (ORA-1002 on next fetch)
    Mais il a été corrigé en 8.1.7.2 et 9.0.1.0.

    Si vous êtes absolument sûr de:
    • la version d'Oracle côté serveur
    • du code utilisé (uniquement un COMMIT dans une transaction autonome et non dans la transaction principale)

    je vous conseille de contacter le support Oracle.

  3. #3
    Membre expérimenté Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Par défaut
    D'après les fonctionnels (donc à prendre avec les pincettes géantes d'usage ), cette erreur ne se produirait qu'en cas de traitement de fort volume. Ce qui est quasiment certain (mais rien ne l'est vraiment totalement), c'est qu'elle n'est pas liée aux données puisque une entrée précédemment en erreur, se déroule correctement lors de l'exécution suivante.

    Si je continue sur la piste du volume, est-ce que ce genre de cas parle à quelqu'un ? De quel côté cela vous semble plus cohérent de chercher, rollback segment ? extent ? Là, je suis un peu perdu

Discussions similaires

  1. erreur ORA-01002: fetch out of sequence
    Par lazzeroni dans le forum Oracle
    Réponses: 2
    Dernier message: 19/06/2006, 14h54
  2. Erreur ORA-12514 avec database link
    Par gafreu dans le forum Administration
    Réponses: 20
    Dernier message: 09/09/2004, 11h53
  3. code retour UNIX sur erreur ORA
    Par vinz_07 dans le forum Administration
    Réponses: 7
    Dernier message: 25/08/2004, 11h04
  4. erreur ora-12801 : error signaled in parallel query server
    Par dngaya dans le forum Administration
    Réponses: 5
    Dernier message: 15/04/2004, 16h25
  5. erreur "ORA-22905" lors de l'execution d'un requet
    Par benji999 dans le forum Administration
    Réponses: 26
    Dernier message: 14/04/2004, 11h47

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