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 :

[PL/SQL + VB] ORA-01002 fetch out of sequence


Sujet :

Oracle

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Points : 55
    Points
    55
    Par défaut [PL/SQL + VB] ORA-01002 fetch out of sequence
    Bonjour,

    Je vais un appel à une procedure stocké via VB6. Cette procédure stocké renvoi un curseur de type Refcursor, tout ce passe bien lorsque je fais juste uniquement renvoyer à ma procédure stocké un curseur.

    Par contre si dans la procédure stocké, j'utilise aussi ce curseur pour faire des mises à jour dans des tables cela plante et me sort l'erreur :
    ORA-01002 fetch out of sequence
    En revanche si je fais l'appel directement, depuis PL/SQL developper cela fonctionne correctement.

    J'ai bien sur regarde l'explication du message mais je dois avoue ne pas tout comprendre mon anglais est vraiment pas terrible, décidement
    ORA-01002 fetch out of sequence

    Cause: In a host language program, a FETCH call was issued out of sequence. A successful parse-and-execute call must be issued before a fetch. This can occur if an attempt was made to FETCH from an active set after all records have been fetched. This may be caused by fetching from a SELECT FOR UPDATE cursor after a commit. A PL/SQL cursor loop implicitly does fetches and may also cause this error.

    Action: Parse and execute a SQL statement before attempting to fetch the data.
    Pour info voici comment j'ouvre mon curseur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure maprocedure (CurCourrier OUT TCurCourrier)
    open CurCourrier for
                str_requete;
     
     loop    
                Fetch CurCourrier into rec;
                Exit when CurCourrier%notfound;
               insert into t_historique(num_cli, num_aff, cod_cou, cod_tab, cod_evt, cod_usr,lib_imgavt,dat_hst)
                     values (rec.numcli, rec.numaff, v_cod_cou, 'CU', 'COK', user, v_lib_cou, to_char(sysdate, 'dd/mm/yyyy'));
            end loop;
            commit;
    end maprocedure
    J'ai vu que cela pouvais ce produire lorsque l'on faisant un SELECT ... FOR UPDATE, mais ce n'est pas mon cas.
    J'espere que ce n'est pas un bug VB6.
    Merci de votre aide.[/code]

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    il manque un CLOSE

    Essaye plutôt cette écriture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure maprocedure 
     
    for rec IN  str_requete
     loop   
               insert into t_historique(num_cli, num_aff, cod_cou, cod_tab, cod_evt, cod_usr,lib_imgavt,dat_hst)
                     values (rec.numcli, rec.numaff, v_cod_cou, 'CU', 'COK', user, v_lib_cou, to_char(sysdate, 'dd/mm/yyyy'));
            end loop;
            commit;
    end maprocedure
    A noter que celle-ci sera plus performante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure maprocedure 
              insert into t_historique(num_cli, num_aff, cod_cou, cod_tab, cod_evt, cod_usr,lib_imgavt,dat_hst) SELECT <le select du curseur>;
            commit;
    end maprocedure
    Evidemment, si TCurCourrier est vraiment nécessaire, il faudra adapter les deux exemples

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Points : 55
    Points
    55
    Par défaut
    Merci Orafrance,
    Par contre j'ai effectivement besoin de CurCourrier en sorti, il y a de l'affichage de curseur via vb après.

    Ton premier exemple me parait un peu bizarre, car str_requete est une requete en faite (sql dynamique).

    Pour ce qui est du deuxième c'est effectivement ce que je voulais faire au début mais la requete contenu dans str_requete est compliqué (et long en temps de traitement env 130 sec), donc je voulais éviter de la lancé deux fois de suite mais c'est peut-etre la seule solution, sachant qu'il me faut le paramètre CurCourrier donc je ne peux pas fermer le curseur.

    Tu en penses quoi ?

    Merci

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    je ne sais pas comment fonctionne VB mais ça me parait bizarre que la fermeture du curseur pose problème

    Qu'est-ce-que ça donne avec des REF CURSOR ?

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Points : 55
    Points
    55
    Par défaut
    En fait le TCurcourrier est un REF curseur, mais si je ferme le curseur dans la procédure stocké, le récupération en VB ne fonctionne plus.
    C'est vrai que c'est assez étrange cette affaire.

    En fait VB, est alors incapable retourvé le fournisseur de donnée, ceci dit cela ne me semble pas complètement illogique non plus...

  6. #6
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    est-ce que par hasard ça ne viendrait pas du fait que tu charge ton curseur Oracle dans un Tableau VB et que ce dernier est trop petit ? soit en nombre d'enregistrements, soit pour une taille de données, ou un nombre de colonnes erroné ?
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  7. #7
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Points : 55
    Points
    55
    Par défaut
    Non en fait je ne charge pas mon curseur dans un tableau VB mais je crée un recordset avec.

  8. #8
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Points : 55
    Points
    55
    Par défaut
    OraFrance, j'ai essaye ton premier exemple de code et j'ai compris ce que tu voulais que je fasses

    Petit souci, c'est que cela ne marche pas, car il semblerait que l'on ne peut pas mettre requete contenu dans une variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
           for rec IN  (str_requeteCurseur)
               loop    
                     insert into t_historique(num_cli, num_aff, cod_cou, cod_tab, cod_evt, cod_usr,lib_imgavt,dat_hst) 
                     values (rec.numcli, rec.numaff, v_cod_cou, 'CU', 'COK', user, v_lib_cou, to_char(sysdate, 'dd/mm/yyyy')); 
               end loop; 
            commit;
    Ce genre de code génère une erreur l'erreur PLS-00103.
    Et pour ta deuxième idée, c'est ce que je voulais faire au départ mais le problème, c'est que j'avais oublie que dans un INSERT ... SELECT il n'était pas possible de mettre plusieurs des select imbriqués, or j'ai impérativement besoin de select imbriqué.

    Franchement je n'ai sais plus comment faire pour insérer ces lignes

    Si quelqu'un avait une idée, pour me sauver la vie!

    [/code]

  9. #9
    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
    Attention.

    dans votre procédure, vous parcourez votre curseur jusqu'au bout.
    Il parait donc normal que la proc VB ne puisse plus rien y lire !
    Il faudrait le fermer dans la proc PL/SQL et le réouvrir pour qu'il soit dispo à partir du 1er enregistrement à la proc VB.
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  10. #10
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Points : 55
    Points
    55
    Par défaut
    Oh j'ai l'impression que ta remarque va me sauver la vie.
    J'essaye de suite

  11. #11
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Points : 55
    Points
    55
    Par défaut
    Eh bien me voila vraiment soulagné cela fonctionne presque parfaitement.

    Je règlerais les 2-3 détails qui traine demain, encore merci

    J'ai une appart quand meme, je fais quand meme pas passer ma nuit au taf

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

Discussions similaires

  1. fetch out of sequence
    Par mooch dans le forum SQL
    Réponses: 3
    Dernier message: 26/01/2008, 22h16
  2. fetch out of sequence
    Par claralavraie dans le forum Oracle
    Réponses: 8
    Dernier message: 28/07/2006, 15h32
  3. erreur ORA-01002: fetch out of sequence
    Par lazzeroni dans le forum Oracle
    Réponses: 2
    Dernier message: 19/06/2006, 14h54
  4. [java.sql.SQLException: ORA-01002: fetch out of sequence]
    Par chouchou93 dans le forum Oracle
    Réponses: 9
    Dernier message: 30/05/2006, 13h05
  5. [8i]ORA-01002: fetch out of sequence
    Par patmaba dans le forum Oracle
    Réponses: 2
    Dernier message: 10/02/2006, 09h10

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