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 Procédural MySQL Discussion :

procédures stockées et recursivité


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060

  3. #3
    Membre émérite Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Par défaut
    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

  4. #4
    Membre chevronné Avatar de jota5450
    Inscrit en
    Janvier 2006
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Janvier 2006
    Messages : 263
    Par défaut
    slt...


    pour les perfs

    essaye ca, pour voir...
    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
    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...

  5. #5
    Membre émérite Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Par défaut
    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

  6. #6
    Membre chevronné Avatar de jota5450
    Inscrit en
    Janvier 2006
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Janvier 2006
    Messages : 263
    Par défaut
    slt...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      UPDATE infirmite SET id_infi_next=NULL WHERE id_infi= @ST_M;
     //va mettre a null
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  2. Procédure stocké:Insert et renvoie de la clé primair
    Par caramel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/04/2003, 09h34
  3. [Pervasive SQL ] procédure stockée
    Par magellan dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 25/10/2002, 13h17
  4. Explication procédure stockée
    Par underworld dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/09/2002, 10h51
  5. [Comparatif] Procédures stockées, triggers, etc.
    Par MCZz dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/08/2002, 12h27

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