[oracle] erreur 1000-curseur

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [oracle] erreur 1000-curseur

Re: [oracle] erreur 1000-curseur

par sacramento » 07 nov. 2011, 23:33

Merci pour la réponse.

Je suis en Oracle 10g et pas en Oracle 11g, mais ton lien donne des pistes intéressantes.

Re: [oracle] erreur 1000-curseur

par dunbar » 05 nov. 2011, 14:27

Une piste peut-être ?
Il est noter en bas :
Si la base de données Oracle est à la version 11.1.0.6, le patch 6474441 doit être appliqué à la base de données afin de pouvoir utiliser DRCP. Sans ce patch, les erreurs comme ORA-01000: maximum open cursors exceeded, ORA-01001 invalid cursor ou ORA-01002 fetch out of sequence peuvent survenir. Ce bogue a été corrigé à partir des versions 11.1.0.7.

[oracle] erreur 1000-curseur

par sacramento » 05 nov. 2011, 12:40

Bonjour,

Je fais l'intégration d'un énorme fichier CSV (plusieurs dizaines de milliers de lignes, quasiment 200 colonnes).
Chaque ligne est le produit cartésien de données d'une base dont hélas je ne maîtrise pas les types d'exportations

Code : Tout sélectionner

ID;entreprise;dirigeant; 1;IBM;DUPONT; 1;IBM;DURAND; 2;EDF;DUBOIS; 2;EDF;MARTIN;
Dans cet exemple (simplifié) j'envoie les données dans deux tables : une table des entreprises (ID, nom de l'entreprise) et une table des dirigeants (id de l'entreprise, nom du dirigeant).
Pour simplifier le code, j'ai défini des index uniques: un index unique sur l'ID dans la table des entreprises et un index unique sur le couple (id de l'entreprise, nom du dirigeant) dans la table des dirigeants (je rappelle que je donne un exemple simplifié). Comme ça, je n'ai pas à me poser de question quand je fais mes INSERT : soit l'enregistrement n'est pas déjà dans la table et il est inséré ; soit il y ait déjà et Oracle me renvoie une erreur duplicate index et n'effectue pas l'insertion.

Cela marche. Jusqu'au moment où Oracle m'indique une erreur "ORA-01000: maximum open cursors exceeded" (nombre de curseurs ouverts dépassés). Et à partir de là, il n'y a plus aucune insertion possible : à chaque insertion, il y a cette erreur.
A chaque fois que je relance le code, cela plante exactement au même endroit au bout d'un gros millier d'insertions (ou plutôt de tentatives d'insertions)
J'ai essayé de mettre des temporisations de quelques millisecondes entre chaque INSERT pour lui laisser le temps de fermer les curseurs ; cela permet d'aller un peu plus loin, mais pas beaucoup plus.

En cherchant sur les forums, j'ai souvent trouvé cette erreur associée à du java. Les conseils sont de se déconnecter de la base de temps en temps pour fermer les curseurs et de se reconnecter. C'est ce que j'ai mis en place : toutes les 50 insertions, je fais un disconnect et je me reconnecte. Je fais même un unset du handler de la base de données entre la déconnexion et la reconnexion.
Encore une fois, je gagne un peu, mais au bout d'un moment, j'ai à nouveau mes curseurs ouverts en dépassement.

J'en arrive à douter que les ordres de déconnexion de PHP effectuent réellement une déconnexion de la base ! Pourtant quand j'interromps le script et que je relance, les premières insertions fonctionnent à nouveau : donc la "fin" du PHP ferme bien la connexion.

Est-ce que quelqu'un a déjà eu ce problème ? Si oui, comment l'a t'il résolu ?
(J'aimerais éviter si c'est possible de faire un select avant chaque insert pour voir si l'enregistrement est déjà ou pas dans la base).

Merci de vos réponses.