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 :

augmentation d'un rollback segment lors d'un update dans un curseur


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2004
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 21
    Par défaut augmentation d'un rollback segment lors d'un update dans un curseur
    Bonjour,
    Je fais un update dans un curseur. J'ai mis mon commit à la fin (pas dans la boucle du curseur). La requete doit retourner 4 lignes (c'est a dire que j'update juste 4 lignes) mais le rollback augmente de 700 mega.
    Pourquoi ? avez vous une solution ?
    Merci.

  2. #2
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    tu devrais montrer ta requête à mon avis tu update beaucoup plus que tu crois!

  3. #3
    Membre averti
    Inscrit en
    Septembre 2004
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 21
    Par défaut
    voila ma requete
    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
    DECLARE
    	   cursor x is
    			  select res1, res2 , res3
    			  from a , b , c 
    			  where ... 
    			  and ...
    			  And ...;
    			  -- variables d'accueil
    			  var x%rowtype;
    begin
    	 for var in x loop
    	 	 update a
    		 set res2='val'; 
    	 end loop;
    	 commit;	 
    end;
    Quand je lance la requete seule. Je n'obtiens que 4 lignes.

  4. #4
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    Salut,
    tu n'as pas de clause WHERE dans ton update !!!

    ça veut dire que tu update L'INTEGRALITE de la table à CHAQUE tour du Loop...

    pas terrible !!

  5. #5
    Membre averti
    Inscrit en
    Septembre 2004
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 21
    Par défaut
    en fait je pensais que que dans la boucle du curseur il ne prend que les valeurs que j'obtiens de mon select qui est en dessus.
    puisque si j'ai bien compris les curseurs, je declare d'abord mon curseur avec mon select et le curseur prend dont les valeurs du select (soit mes 4 lignes). ensuite dans la boucle for ma variable var boucle juste sur ces 4 lignes...

    Je vais essayer en mettant where dans mon update.
    Merci

    Je debute en pl/sql... donc merci pour les infos.

  6. #6
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    Tant que tu y es, tu devrais mettre un comptage dans ta boucle pour t'assurer que tu n'as bien que 4 lignes. Parceque le problème avec les updates, c'est que si tu fais 1000 fois la meme chose le resultat sera le meme qu'avec une et c'est difficile à detecter.

  7. #7
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    Citation Envoyé par liloo974
    en fait je pensais que que dans la boucle du curseur il ne prend que les valeurs que j'obtiens de mon select qui est en dessus.
    puisque si j'ai bien compris les curseurs, je declare d'abord mon curseur avec mon select et le curseur prend dont les valeurs du select (soit mes 4 lignes). ensuite dans la boucle for ma variable var boucle juste sur ces 4 lignes...
    ...
    ce qu'il faut, c'est que dans le select du curseur tu récupère un ID déterminant pour identifier la ligne à mettre à jour, puis dans le loop, tu utilise cet ID pour la mise à jour...
    comme ceci :
    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
    Declare
     
        cursor c1 is 
            Select
                    col1    -- ID déterminant 
                    , col2
                    , col3
            From    maTable
            Where   ...     ;
     
    Begin
     
        for i in c1
        Loop
     
            Update maTable
            set colXXX = 'ma nouvelle valeur'
            WHERE COL1 = i.Col1 ;
     
            -- explication : 
            -- WHERE COL1 = i.Col1 ;
            -- implique que maTable va être mise à jour UNIQUEMENT pour l'ID  i.Col1 
            -- i représente ici l'occurence en cours du curseur 
            -- (déclaré implicitement dans la syntaxe For i in...) 
     
        End Loop ;
     
        Commit ;
     
    End ;

Discussions similaires

  1. Réponses: 7
    Dernier message: 12/05/2010, 15h33
  2. Oracle 8.1.7.4 : Vider les Rollback segments
    Par beyonder2005 dans le forum Oracle
    Réponses: 7
    Dernier message: 02/11/2005, 14h37
  3. Taille des Rollback Segments
    Par slyv dans le forum Oracle
    Réponses: 9
    Dernier message: 17/03/2005, 12h02
  4. Les Rollback Segments
    Par blids dans le forum Administration
    Réponses: 20
    Dernier message: 18/05/2004, 19h22
  5. remise à jour des rollback segment par oracle
    Par juin29 dans le forum Administration
    Réponses: 9
    Dernier message: 23/04/2004, 14h51

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