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 :

Numéros d'ordre à incrémenter / décrémenter


Sujet :

SQL Procédural MySQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Par défaut Numéros d'ordre à incrémenter / décrémenter
    Bonjour,

    Suite à une précédente discussion, j'ai un autre problème: la procédure est enregistré, mais sa couille a l'exécution. Sur les requêtes de sélection, que j'utilise pour placé des valeurs de champ dans des variable utilisateur :

    Erreur

    requête SQL: Modifier

    SHOW TABLE STATUS LIKE 'equipe';

    MySQL a réponduocumentation
    #2014 - Commands out of sync; you can't run this command now
    Le résultat est le même sur un pauvre "select * from uneTable", ou même Select @sqlCMD;

    Et sur les requêtes d'insertion, pas d'érreur, mais rien ne se passe.

    Au final je serai allez plus vite si j'avais fait une procédure par table (10) >.< Mais comme sa j'aprend c'est pas plus mal.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Par défaut
    Bon non apparemment c'est normal, car j'avais mis mes variable de session dans la chaîne de la requêtes.

    J'ai lue ici http://dev.mysql.com/doc/refman/5.0/fr/sqlps.html , qu'il falait que je mette des ? à la place des variables, puis que j'utilise USING @var1, @var2, sur le execute SAUF QU'IL COMPREND RIEN:

    (au moment de l'appelle de la procedure: )

    #1064 - You have an error in your SQL syntax; check the manual ....blablabla.... near '?, ? FROM media WHERE IdCM=?' at line 1

    media et idCM sont les valeurs de paramètres de ma proc donc ça sa marche. Je voudrai des variable a la place de ces ?...mais on me dit de mettre des ?...mais sa lui plais pas...alors je fait quoi? mon dieu que c'est plus simple en pl/sql xD

  3. #3
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    Citation Envoyé par Splyf Voir le message
    Bon non apparemment c'est normal, car j'avais mis mes variable de session dans la chaîne de la requêtes.
    euh... concrètement, quel était ton code ?

    Citation Envoyé par Splyf Voir le message
    J'ai lue ici http://dev.mysql.com/doc/refman/5.0/fr/sqlps.html , qu'il falait que je mette des ? à la place des variables
    Pas du tout. Cette syntaxe ne peut s'utiliser que sur des valeurs, pas sur des noms d'objets SQL.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Par défaut
    euh... concrètement, quel était ton code ?
    Oups, pardon, parfois je suis tellement dans mon truck que j'ai l'impression d'être compréhensible.
    Je vais carrément mettre les pieds dans le plats:
    En faite, ma BDD contient tout le contenue d'un site flash(texte,emplacement des video, image, son, etc). Rien de bien méchant, mes tables contienne entre 30 et 300 occurrences. Pourtant, il doit être possible de les classes dans l'ordre que l'on veut.
    je veut donc une procédure qui me permet d'incrémenter le rang d'une occurrence, tout en décrémentant le rang de l'occurrence d'avant, et une autre procédure qui fait l'inverse. Comme c'est la même chose pour 6 table, et probablement sur d'autre projet par la suite, j'aimerai en faire une qui marche pour toute les tables

    et donc voici pour l'instant:
    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
    CREATE PROCEDURE rangUp(aId INT, nomTable varchar(50), ColPri varchar(50), ColFor varchar(50) )
    BEGIN
      set @id = aId;
      set @sqlCMD = CONCAT('select rang, ', ColFor, ' into ?, ? FROM ', nomTable, ' WHERE ', ColFor, '=?');
      PREPARE stmt FROM @sqlCMD;
      EXECUTE stmt USING @rg, @categ, @id;
     
      if(@rg > 0) then
     
        set @sqlCMD = CONCAT('UPDATE ', nomTable, ' SET rang = rang +1 WHERE rang = ?+1 and ',  ColFor, ' = ?');
        PREPARE stmt FROM @sqlCMD;
        EXECUTE stmt USING @rg, @categ;
     
         set @sqlCMD = CONCAT('UPDATE ',nomTable, ' SET rang = rang -1 WHERE ', ColPri, ' = ?');
         PREPARE stmt FROM @sqlCMD;
         EXECUTE stmt USING @id;
         DEALLOCATE PREPARE stmt ;
     
      END IF;
    END
    donc mon histoire avec les points d'interogation, c'est que je veut insérer vraiment la variable non le contenu dans la chaine litérale, comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select rang, IdCP into @rg, @categ;
    Mais apparemment j'ai mal compris la notice, avant je plaçais carrément les variable dans la chaine littérale( la place des ?) mais sa ne fonctionnait pas. Comment faire donc?

  5. #5
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    La bonne syntaxe pour :

    Code erroné : Sélectionner tout - Visualiser dans une fenêtre à part
    SET @sqlCMD = CONCAT('select rang, ', ColFor, ' into ?, ? FROM ', nomTable, ' WHERE ', ColFor, '=?');

    est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET @sqlCMD = CONCAT('select rang, ', ColFor, ' into @rg, @categ FROM ', nomTable, ' WHERE ', ColFor, '=?');
    Ce qui doit correspondre à ce que tu faisais avant ? Néanmoins, ça ne peut pas marcher, car les prepared statements sont exécutés dans un contexte différent de celui de la session qui les invoque. Autrement dit, les variables ne sont pas les mêmes et tu ne peux pas les récupérer. La seule solution pour récupérer les infos produites par un EXECUTE est de les mettre dans une table (temporaire ?) que tu lis ensuite...

    Dans tous les cas, ça ne me semble pas la meilleure manière (ni la plus simple) de gérer tes incrémentations-décrémentations. Je te suggèrerais plutôt de créer des triggers BEFORE UPDATE sur chacune des tables.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Par défaut
    Merci Antoun,

    je venais justement pour dire que je venais de trouver cette solution, crée une vue avec la requête préparer et la détruire une fois utilisé.
    J'avais aussi pensé aux triggers, qui serai bien plus optimisé (j'ai lue que les commandes préparées était assez lourdes à l'exécution), mais cela m'oblige a crée 2 trigger pour 4 table, (sois 8 trigger), s'achant que chacune en a déjà deux pour setter le rang a l'insertion, et décrémenter tout les rang des occurrences supérieur d'une supprimer (un nombre de trigger important sur une table nuit-elle au performance?)
    En faite, je fais tout ça pour une AP que je dois présenter à mon oral du BTS informatique, je me suis dit qu'une procédure qui factorise le code de 4 autres pouvaist être intéressant à présenter, mais je vais demander à mes profs si c'est mieux d'avoir un code optimisé ou un code intéressant ^^.

    Merci encore!!

  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    ça dépend essentiellement du fait que tes profs soient orientés bases de données ou programmation...

Discussions similaires

  1. [Forms 6] numéro d'ordre bloc multiligne
    Par Devlop++ dans le forum Forms
    Réponses: 21
    Dernier message: 03/12/2008, 17h35
  2. numéro qui s'incrémente sur un état
    Par marcuscircus dans le forum IHM
    Réponses: 24
    Dernier message: 22/07/2008, 13h26
  3. [debutant]récupérer le numéro d'ordre d'un champ de formulaire
    Par dimi2 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 01/07/2008, 19h28
  4. [Puces et numéros] Pas d'incrémentation des lettres
    Par Alqualonde dans le forum Word
    Réponses: 6
    Dernier message: 02/11/2007, 14h54
  5. Réponses: 8
    Dernier message: 08/06/2006, 11h20

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