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*Plus Oracle Discussion :

Auto commit via une boucle


Sujet :

Sql*Plus Oracle

  1. #1
    Membre du Club Avatar de magic charly
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 67
    Points
    67
    Par défaut Auto commit via une boucle
    Bonjour,

    Je souhaiterais faire des requêtes de suppression de données ou lles COMMIT se feront par groupes de 1000 échantillions. Je suis donc partie de l'idée de construire une boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    LOOP
    delete from  MA_TABLE
    where (mon_champ<=10)
    AND ROWNUM <= 1000;
     
    EXIT WHEN SQL%ROWCOUNT=0;
     
    COMMIT;
    END LOOP;
    COMMIT;
    END;
    Cependant la notion de LOOP ne semble pas être reconnue par ORACLE. En fouillant ici et là j'ai vu apparaitre l'utilisation de curseur mais j'ai du mal à l'adapter à mon besoin.

    Auriez vous la bonté de me donner une piste ?


    Merci bcp

    PS: je suis en Oracle 9I

  2. #2
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Si, la notion de loop est reconnue par Oracle en PL/SQL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    BEGIN
       LOOP
          DELETE FROM  MA_TABLE
          WHERE (mon_champ<=10)
          AND ROWNUM <= 1000;
          COMMIT; 
       EXIT WHEN SQL%ROWCOUNT=0;
       END LOOP;
    END;
    /
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  3. #3
    Membre du Club Avatar de magic charly
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 67
    Points
    67
    Par défaut
    merci pour ton aide !

    Une question cependant en procédant ainsi ne va t on pas commiter chaque enregistrement ? Ne vaudrait il mieux pas faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    BEGIN
       LOOP
          DELETE FROM  MA_TABLE
          WHERE (mon_champ<=10)
          AND ROWNUM <= 1000;
       EXIT WHEN SQL%ROWCOUNT=0;
       COMMIT; 
       END LOOP;
    END;

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Non, En sqlplus chaque instruction est exécutée "séparément".
    Que tu fasses ensuite un COMMIT ou un EXIT l'instruction UPDATE est finie.

    PS :
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    Membre du Club Avatar de magic charly
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 67
    Points
    67
    Par défaut
    Merci à tous le code fonctionne je l'ai testé avec succès via PL/SQL
    et Désolé pour les balises, je ferai attention a l'avenir.

    Une dernière question :

    Si le code détaillé ci dessus est dans un fichier mon_fichier.sql et que je souhaite lancer le script via sqlplus. Comment faire ?

    en effet j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sqlplus / @mon_fichier.sql
    Or Il me rend la main avec en face un nombre de lignes. J'ai l'impression qu'il prend en compte ce qu'il y a entre le begin et le end mais ne l'éxécute pas.

    Pour parler simplement quel serait selon vous l'équivalent au F8 de PL/SQL sous sqlplus ?

  6. #6
    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
    Points : 3 597
    Points
    3 597
    Par défaut
    Il faut un "/":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    BEGIN
       LOOP
          DELETE FROM  MA_TABLE
          WHERE (mon_champ<=10)
          AND ROWNUM <= 1000;
       EXIT WHEN SQL%ROWCOUNT=0;
       END LOOP;
    COMMIT;
    END;
    /
    Moi je mettrais le COMMIT en dehors de la boucle: en général c'est plus rapide.

  7. #7
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par pifor
    Moi je mettrais le COMMIT en dehors de la boucle: en général c'est plus rapide.
    Dans ce cas autant supprimer toutes les lignes d'un seul coup.

    Là l'objectif (si j'ai bien compris) est de supprimer les lignes par paquet de 1000 (d'où le commit intermédiaire).
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  8. #8
    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
    mais alors là ça sert à rien de faire des paquets de 1000 le but étant de faire des commits intermédiaires

    Pour les perfs, c'est un FORALL qu'il faut faire

    Edit : over grillé

Discussions similaires

  1. Créer une Variable locale via une boucle
    Par OROZCO dans le forum Macro
    Réponses: 1
    Dernier message: 14/08/2009, 11h57
  2. [CR 10] Génerer des sous-rapports via une boucle
    Par Marco94 dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 11/08/2009, 15h30
  3. Récupérer données formulaire via une boucle
    Par magy91 dans le forum Langage
    Réponses: 1
    Dernier message: 10/11/2008, 20h06
  4. Insertion de champ via une boucle
    Par mat67000 dans le forum Access
    Réponses: 13
    Dernier message: 26/06/2007, 13h53
  5. Réponses: 4
    Dernier message: 26/08/2004, 08h01

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