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 :

problème syntaxe procédure stockée


Sujet :

SQL Procédural MySQL

  1. #1
    Membre régulier
    Femme Profil pro
    Analyste-developpeur java
    Inscrit en
    Mai 2010
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste-developpeur java
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2010
    Messages : 135
    Points : 76
    Points
    76
    Par défaut problème syntaxe procédure stockée
    Bonjour!

    Le problème à changé donc je pense qu'il mérite son post!
    Le problème:
    Une table T_RESEAU qui liste des réseaux. Ces réseaux ont 3 champs: ID(pk), intitule, indice.

    Un réseau peut être monté de version, auquel cas, un réseau de même intitule et d'indice supérieur sera créé:
    Ex: FH-Paris d'indice 0 sera le père du FH-Paris d'indice 1

    Il y a dans la base de donnée une contrainte d'unicité sur le couple (nom, indice).

    Pour une raison d'évolution (intitule du fils changé par l'utilisateur = lien de paternité perdu) j'ai créé une relation père-fils entre les réseau: foreign key parent_id dans la table T_RESEAU par défaut nulle.

    J'aimerais maintenant mettre à jour cette colonne en insérant aux réseaux fils l'id de leur réseau père.

    Procédure stockée:

    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
    DELIMITER |
    CREATE PROCEDURE proc()
    BEGIN
      DECLARE done INT DEFAULT FALSE;
      DECLARE id INT;
      DECLARE intitule CHAR(50);
      DECLARE id_pere INT;
      DECLARE cur CURSOR FOR SELECT RES_ID_N, RES_INTITULE_C FROM T_RESEAU WHERE RES_INDICE_N=1;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
     
      OPEN cur;
     
      read_loop: LOOP
        FETCH cur INTO id, intitule;
        IF done THEN
          LEAVE read_loop;
        END IF;
     
        id_pere = SELECT RES_ID_N FROM T_RESEAU WHERE RES_INDICE_N=0 AND RES_INTITULE_C LIKE intitule;
        UPDATE T_RESEAU SET RES_PARENT = id_pere WHERE RES_ID_N=id;
     
      END LOOP;
     
      CLOSE cur;
    END|
    A l'exécution, cette procédure donne l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= SELECT RES_ID_N FROM T_RESEAU WHERE RES_INDICE_N=0 AND RES_INTITULE_C like int' at line 18
    Qu'en pensez vous?
    Auriez vous svp une idée des raisons de l'erreur? Merci!

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 55
    Points : 95
    Points
    95
    Par défaut
    hello

    Tu ne peux pas faire un
    XX = Select ...
    mais un
    Select .... into XXX

    soit
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT RES_ID_N into id_pere FROM T_RESEAU WHERE RES_INDICE_N=0 AND RES_INTITULE_C LIKE intitule

    bonne soirée

    Francis

  3. #3
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    il a raison, de plus, tu ne peux pas faire une affectation de variable comme ça, la meilleur syntaxe est avec set qui te permet de faire une ou plusieurs opérations:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    set a=3,b=5,c=concat(a,',',b);
    ce qui donne c="3,5"...

    mais quand tu utilises into tu ne dois avoir qu'un seul résultat retourné à la fois... sous peine d'avoir une erreur ou un résultat incohérent...
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  4. #4
    Membre régulier
    Femme Profil pro
    Analyste-developpeur java
    Inscrit en
    Mai 2010
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste-developpeur java
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2010
    Messages : 135
    Points : 76
    Points
    76
    Par défaut
    Merci de vos réponses!
    Effectivement Eric je viens de comprendre ce que vous vouliez dire une seule valeur (et non pas un tableau) est retournée...

    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
     
    DELIMITER |
    CREATE PROCEDURE proced()
    BEGIN
      DECLARE done INT DEFAULT FALSE;
      DECLARE id INT;
      DECLARE intitule CHAR(50);
      DECLARE id_pere INT;
      DECLARE cur CURSOR FOR SELECT RES_ID_N, RES_INTITULE_C FROM T_RESEAU WHERE RES_INDICE_N=1;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
     
      OPEN cur;
     
      read_loop: LOOP
        FETCH cur INTO id, intitule;
        IF done THEN
          LEAVE read_loop;
        END IF;
     
        SELECT RES_ID_N INTO id_pere FROM T_RESEAU WHERE RES_INDICE_N=0 AND RES_INTITULE_C LIKE intitule;
        UPDATE T_RESEAU SET RES_PARENT = id_pere WHERE RES_ID_N = id;
        SELECT id_pere;
     
      END LOOP;
     
      CLOSE cur;
    END|

  5. #5
    Membre régulier
    Femme Profil pro
    Analyste-developpeur java
    Inscrit en
    Mai 2010
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste-developpeur java
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2010
    Messages : 135
    Points : 76
    Points
    76
    Par défaut
    Sauriez-vous, svp, pourquoi cette requête n'affiche qu'une seule ligne au lieu d'un tableau de pères?

  6. #6
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    à chaque passage dans ta boucle tu vas générer un jeu de résultat d'une seule ligne vu comment tu fais l'affichage avec ton 2ème select

    donc si tu utilises la console tu verras chaque jeu s'afficher...

    sous php, il faudra que tu les lisent les uns derrière les autres tant qu'il y en a...

    une solution est de créer une table temporaire dans laquelle tu inserts les différents id_pere...
    et après ta boucle tu lis la table temporaire par un simple select...
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

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

Discussions similaires

  1. Problème de procédure stockée fausse
    Par le-maraudeur dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/07/2007, 13h21
  2. [SQLSERVER]Problème de procédure stockée
    Par mikedavem dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 05/12/2006, 00h17
  3. Réponses: 1
    Dernier message: 17/07/2006, 17h08
  4. Problème de procédure stockée
    Par Sorcier157 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 17/03/2005, 17h57
  5. syntaxe procédure stockée
    Par KRis dans le forum SQL
    Réponses: 4
    Dernier message: 06/05/2004, 18h04

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