Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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 19/11/2010, 19h22   #1
Invité de passage
 
Olivier
Inscription : novembre 2009
Messages : 3
Détails du profil
Informations personnelles :
Nom : Olivier

Informations forums :
Inscription : novembre 2009
Messages : 3
Points : 0
Points : 0
Par défaut Supprimer une ligne via un curseur explicite

Yop yop.

J'ai un soucis. J'ai écrit une procédure qui doit supprimer certaines lignes d'une table. Pour cela j'utilise un curseur avec FOR UPDATE toussa toussa, dans le corps de ma procédure j'ai une boucle avec un fetch toussa toussa, et vient le DELETE <le_nom_de_ma_table>
WHERE CURRENT OF.

Pour que ça fonctionne je suppose qu'il faut mettre le commit avant la fin de la boucle, et du coup bah ça ne marche pas.
Y a-t-il une autre solution que de recopier la table et de supprimer dans la copie puis de remplacer la première par la copie ?

(si vous voulez du code, n'hésitez pas )
Gippouet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2010, 20h52   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 307
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 307
Points : 5 796
Points : 5 796
C'est un approche peu performant. La bonne solution consiste à faire un simple delete avec les conditions qui vont bien.
La clause current off fonctionne si vous ne fait pas de commit dans la boucle (et faire commit dans la boucle n'est qu'une autre erreur dans la plupart des casses)
Si vous insistez de faire commit dans la boucle vous pouvez vous en sortir en utilisant le RowID de la table (en fait current off est traduit derrière la scène par rowid).
Mais tout ça ne sert à rien quand un simple delete suffit.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2010, 21h04   #3
Invité de passage
 
Olivier
Inscription : novembre 2009
Messages : 3
Détails du profil
Informations personnelles :
Nom : Olivier

Informations forums :
Inscription : novembre 2009
Messages : 3
Points : 0
Points : 0
C'était mon idée première, mais à priori ça ne m'efface pas grand chose. A moins que je n'ai oublié quelque chose quelque part.

Un simple
Code :
1
2
DELETE FROM <ma_table>
WHERE  CURRENT OF <mon_curseur>;
suffirait ?
Gippouet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2010, 21h10   #4
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 307
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 307
Points : 5 796
Points : 5 796
Non. Vous devez écrire tout simplement
Code :
1
2
3
4
 
DELETE ma_table
WHERE condition
...
pas de curseur, pas de current of.

Exemple: je veux supprimer les emploies du département 10
Code :
1
2
3
 
DELETE emp
  WHERE depno = 10
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2010, 14h18   #5
Invité de passage
 
Olivier
Inscription : novembre 2009
Messages : 3
Détails du profil
Informations personnelles :
Nom : Olivier

Informations forums :
Inscription : novembre 2009
Messages : 3
Points : 0
Points : 0
Ah bah tout simplement

Merci
Gippouet 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 19h05.


 
 
 
 
Partenaires

Hébergement Web