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

PL/SQL Oracle Discussion :

[Débutant] Fetch across commits


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 67
    Par défaut [Débutant] Fetch across commits
    Bonjour,

    J'ai besoin de supprimer plusieurs lignes d'un table. Seulement cette table est assez grosse (plus de 4 millions de lignes), j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DELETE MA_TABLE WHERE poid_list IS NULL
           *
    ERROR at line 16:
    ORA-30036: unable to extend segment by 8192 in undo tablespace 'UNDO'
    Je voudrais mettre en place un curseur afin de commiter tous les 10000 delete par exemple:

    J'ai donc mis le code suivant:
    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
     
    DECLARE
            v_cpt NUMBER(6);
            v_row MA_TABLE%ROWTYPE;
            CURSOR cur_ma_table IS SELECT * FROM MA_TABLE FOR UPDATE OF ID;
    BEGIN
            v_cpt := 0;
            OPEN cur_ma_table;
            LOOP
                    FETCH cur_ma_table INTO v_row;
                    EXIT WHEN cur_ma_table%NOTFOUND;
                    DELETE FROM MA_TABLE WHERE CURRENT OF cur_ma_table;
                    v_cpt := v_cpt +1;
                    IF v_cpt = 10000 THEN
                       v_cpt := 0;
                       CLOSE cur_ma_table;
                       COMMIT;
                       OPEN cur_ma_table;
                    END IF;
            END LOOP;
            COMMIT;
            CLOSE cur_ma_table;
    END;
    /
    J'ai l'impression que le CLOSE et le OPEN que je mets dans ma boucle ne sont pas très corrects. Si je les enlève j'ai un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "ORA-1002: fetch out of sequence"
    Le code est-il correct ? Y'a-t-il un moyen plus intelligent d'éviter l'erreur initiale ?

    Je vous remercie.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 316
    Par défaut
    bonjour,
    je cois que cela est liée au fait que le curseur soit en select .. for update

    voir
    http://ora-01002.ora-code.com/

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 67
    Par défaut
    Oui, c'est ce que j'avais lu également. Seulement, je n'ai pas le choix, je suis obligé de mettre un FOR UPDATE sinon je ne pourrais pas mettre DELETE... WHERE CURRENT OF...

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    "For update Of" signifie posez des verrous. "Commit" libère les verrous posées ; donc le curseur initial n’est plus valide d’où l’anomalie 1002.
    "Where current Off" est traduit par Oracle par Where Rowid = :l_Rowid.
    Je fais parti de ceux qui pensent que dans ce cas la meilleure solution est de fournir à Oracle ce qu’il a besoin : assez d’espace de rollback dans ce cas.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 67
    Par défaut
    Je n'ai pas la possibilité d'augmenter l'espace de rollback...
    Donc, si je comprend bien, je devrais enlever FOR UPDATE OF... et remplacer WHERE CURRENT OF.... par Where Rowid = :l_Rowid ?
    Ceci fonctionnerait-il sur une 9.2.0 ?

    Merci

  6. #6
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Lisez aussi Fetching Across Commits.

    [Edit]
    Vous avez un exemple. Ca marche au moins depuis la version 7 mais des
    autres solutions existent aussi.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 67
    Par défaut
    Ok, ça marche nickel.
    Merci tout le monde.

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

Discussions similaires

  1. Débutant XML
    Par viny dans le forum XML/XSL et SOAP
    Réponses: 8
    Dernier message: 25/07/2002, 12h07
  2. [Kylix] Re Re: débutant sur Kylix et Linux.....
    Par Eclypse dans le forum EDI
    Réponses: 2
    Dernier message: 08/06/2002, 22h53
  3. [Kylix] Le débutant en Kylix et Linux....
    Par Eclypse dans le forum EDI
    Réponses: 2
    Dernier message: 08/05/2002, 10h37
  4. Réponses: 3
    Dernier message: 07/05/2002, 16h06
  5. [HyperFile] 2 questions de débutant
    Par khan dans le forum HyperFileSQL
    Réponses: 2
    Dernier message: 29/04/2002, 23h18

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