Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
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 08/08/2007, 09h20   #1
Membre chevronné
 
Avatar de pop_up
 
Inscription : avril 2006
Messages : 833
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2006
Messages : 833
Points : 690
Points : 690
Par défaut procédures stockées et recursivité

Bonjour,

A mon grand regret, en cherchant à savoir si les procédures stockées géraient la récursivité, je suis tombé sur ce Post :

Apparemment, il n'est donc pas possible d'utiliser la recursivité.

Du coup il faut que j'arrive à contourner le probleme.

Ce que je cherche à faire c'est supprimer des données liées entre elles dans une table. A cause des contraintes d'integrité et des dependances, je suis donc obligé de respecter un certain ordre pour supprimer ces enregistrements.

un petit exemple pour comprendre. voici le principe :

J'ai une table INFIRMITE avec un id_infi en clé primaire. dans cette table, j'ai un autre id_infi_next qui sert à lier une infirmite à une autre.
Le probleme c'est qu'il peut avoir plusieurs infirmités liées entre elles et qu'il faut donc que je supprime la derniere pour supprimmer la premiere.

Code :
1
2
3
4
5
6
7
 
id_infi       id_infi_next       .........
    1              2             ......
    2              3             ......
    3              7
    4              NULL         ......
    7              NULL         ......
Vous l'aurez compris, pour supprimer l'id_infi=1, il me faut donc supprimer la 7 (en mettant à null tous les id_infi_next=7)puis la 3, la 2 et enfin la 1.

Quelqu'un aurait t'il des suggestions pour faire ceci sachat que je ne veux pas tout supprimer dans ma table?

merci de votre aide
pop_up est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2007, 11h52   #2
Membre Expert
 
Inscription : août 2002
Messages : 1 036
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 1 036
Points : 1 166
Points : 1 166
Bonjour,

Connais-tu ça :
http://sqlpro.developpez.com/cours/arborescence/
jeca est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2007, 12h14   #3
Membre chevronné
 
Avatar de pop_up
 
Inscription : avril 2006
Messages : 833
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2006
Messages : 833
Points : 690
Points : 690
j'ai regardé maintenant que tu m'as donné le lien mais je vois mal ou tu veux en venir

je ne peux pas revoir le modele de donnee puisque le projet est deja bien abouti.

Peut tu m'expliquer ta suggestion ?

merci
pop_up est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2007, 12h26   #4
Membre éclairé
 
Avatar de jota5450
 
Jota Alves
Inscription : janvier 2006
Messages : 263
Détails du profil
Informations personnelles :
Nom : Jota Alves
Âge : 36

Informations forums :
Inscription : janvier 2006
Messages : 263
Points : 303
Points : 303
slt...


pour les perfs

essaye ca, pour voir...
Code :
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
DELIMITER $$
DROP PROCEDURE IF EXISTS `test` $$
CREATE PROCEDURE `test`(_i int)
BEGIN
DECLARE Ca varchar(500);
SET @ID_N=_i;
SET @ID_I =1;
SET @ST_M=0;
SET @ST_R=0;
 
while (@ID_N)
do
  SET @ID_I :=@ID_N;
  SELECT @ID_N:=id_infi_next FROM infirmite WHERE id_infi=@ID_I ;
  SET  Ca = concat_ws(";",Ca,@ID_I);
end while;
 
while(Ca<>cast(_i AS char))
do
  SELECT @ST_M:= substring_index(Ca,";",-1);
  UPDATE infirmite SET id_infi_next=NULL WHERE id_infi= @ST_M;
  SELECT @ST_R:=TRIM(TRAILING Concat(";",@ST_M) FROM Ca);
  SET Ca= @ST_R;
end while;
UPDATE infirmite SET id_infi_next=NULL WHERE id_infi= _i;
 
END $$
DELIMITER ;

quand tu fais ton call test(XXX), tu mais la valeur que tu veus...
jota5450 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2007, 13h08   #5
Membre chevronné
 
Avatar de pop_up
 
Inscription : avril 2006
Messages : 833
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2006
Messages : 833
Points : 690
Points : 690
Tout d'abord merci pour ta réponse jota5450.

J'ai essayé d'executer ta proc en creant 3 infirmites et en les liant mais ça m'a fait planté toad

enfin c'est pas grave.

Par contre en essayant de comprendre ta proc stockées, je crois comprendre que tu essaye de concatener les infirmités en rajoutant l'infirmité fille à chaque fois au début c'est ça ?

Si c'est bien ça alors il faut pas que je rajoute un DELETE dans la seconde boucle ?

encore merci
pop_up est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2007, 13h21   #6
Membre éclairé
 
Avatar de jota5450
 
Jota Alves
Inscription : janvier 2006
Messages : 263
Détails du profil
Informations personnelles :
Nom : Jota Alves
Âge : 36

Informations forums :
Inscription : janvier 2006
Messages : 263
Points : 303
Points : 303
slt...


Code :
1
2
3
4
5
6
7
 
while (@ID_N)
do
  SET @ID_I :=@ID_N;
  SELECT @ID_N:=id_infi_next FROM infirmite WHERE id_infi=@ID_I ; 
  SET  Ca = concat_ws(";",Ca,@ID_I);
end while;
boucle, ou a la fin, on va avoir, Ca=(1;2;3;7)

Code :
1
2
3
4
 
while(Ca<>cast(_i AS char))
do
  SELECT @ST_M:= substring_index(Ca,";",-1);
@ST_M va prende la valeur de id_infi,que on veut updater, depuis Ca,
mais commencant par la fin:
@ST_M =7 @ST_M =3 @ST_M =2
Code :
1
2
3
 
  UPDATE infirmite SET id_infi_next=NULL WHERE id_infi= @ST_M;
 //va mettre a NULL
Code :
1
2
3
4
 
  SELECT @ST_R:=TRIM(TRAILING Concat(";",@ST_M) FROM Ca);
  SET Ca= @ST_R;
end while;
@ST_R va prendre la valeur de Ca, en enlevant ";@ST_M" ce qui donne:
@ST_R="1;2;3" @ST_R="1;2" @ST_R="1"


PS: tu peus donner un jeux de donnee? parce que avec le mien, il marche
jota5450 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2007, 13h50   #7
Membre chevronné
 
Avatar de pop_up
 
Inscription : avril 2006
Messages : 833
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2006
Messages : 833
Points : 690
Points : 690
Ok merci

Par contre tu me confirmes bien qu'il faut que je mette un DELETE aprés le SET Ca= @ST_R; non ?

Pour le jeu de données je peux pas t'en donner desolé

en tout cas merci pour ton aide
pop_up est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2007, 13h56   #8
Membre éclairé
 
Avatar de jota5450
 
Jota Alves
Inscription : janvier 2006
Messages : 263
Détails du profil
Informations personnelles :
Nom : Jota Alves
Âge : 36

Informations forums :
Inscription : janvier 2006
Messages : 263
Points : 303
Points : 303
slt...
Citation:
Par contre tu me confirmes bien qu'il faut que je mette un DELETE aprés le SET Ca= @ST_R; non ?
la ca depand de ce que tu veus faire...

si tu veus juste que tes "id_infi_next", prennent comme valeur "null", non, y a pas de delete a mettre...

Code :
1
2
 
SELECT @ST_R:=TRIM(TRAILING Concat(";",@ST_M) FROM Ca);
@ST_R va prende la valeur de Ca, mais deja sans sans la valeur de id_infi ou id_infi_next vient de prendre la valeur de null...
jota5450 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2007, 14h09   #9
Membre chevronné
 
Avatar de pop_up
 
Inscription : avril 2006
Messages : 833
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2006
Messages : 833
Points : 690
Points : 690
Justement je veux siupprimer les infirmité. Donc c'est bon.

Encore merci de m'avoir aidé.

et hop résolu
pop_up est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h31.


 
 
 
 
Partenaires

Hébergement Web