Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Outils > Sql*Plus
Sql*Plus Forum d'entraide sur Oracle Sql*Plus
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/12/2006, 16h56   #1
Nouveau Membre du Club
 
Avatar de magic charly
 
Inscription : février 2006
Messages : 167
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 167
Points : 35
Points : 35
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 :
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
magic charly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2006, 17h27   #2
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
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 866
Points : 3 448
Points : 3 448
Si, la notion de loop est reconnue par Oracle en PL/SQL.

Code :
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.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2006, 17h38   #3
Nouveau Membre du Club
 
Avatar de magic charly
 
Inscription : février 2006
Messages : 167
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 167
Points : 35
Points : 35
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 :
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;
magic charly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2006, 18h40   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 207
Points : 4 207
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 :
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2006, 14h07   #5
Nouveau Membre du Club
 
Avatar de magic charly
 
Inscription : février 2006
Messages : 167
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 167
Points : 35
Points : 35
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 :
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 ?
magic charly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2006, 14h22   #6
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Il faut un "/":

Code :
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.
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2006, 14h53   #7
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
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 866
Points : 3 448
Points : 3 448
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.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2006, 15h01   #8
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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é
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h39.


 
 
 
 
Partenaires

Hébergement Web