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 :

Appel d'une procédure contenant un update dynamique


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai

    Profil pro
    Inscrit en
    Août 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 21
    Points : 24
    Points
    24
    Par défaut Appel d'une procédure contenant un update dynamique
    Bonjour à tous,
    j'ai créé une procédure qui exécute un update sur une colonne déterminée dynamiquement. Pour cela j'utilise un prepare/execute statement.
    Lorsque j'appelle la procédure, j'ai le message suivant
    "PROCEDURE maj_suivi_activite can't return a result set in the given context".
    Je ne comprends pas à quel moment le RS est retourné et comment faire pour que la procédure ne le retourne pas.
    Ma procédure :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    CREATE PROCEDURE `maj_suivi_activite` (idElement varchar(100) )
    BEGIN
     
    DECLARE idGestionnaire varchar(100);
    DECLARE moisAction varchar(4);
    DECLARE moisAnneeAction varchar(10);
    DECLARE nbActions varchar(100);
    DECLARE colonneToUpdate varchar(100);
     
     
    	/*recherche gestionnaire, ann?e et mois de l'action*/
    	select id_gestionnaire, date_format(datedebut,'%m'), date_format(datedebut,'%Y-%m') from actions 
    		where id_element=idElement
    		into idGestionnaire,moisAction,moisAnneeAction;
    	/*D?termination du nb d'actions*/
    	select count(act2.id_element) from actions act2, element elem
    	where act2.id_gestionnaire=idGestionnaire
    	and date_format(act2.datedebut,'%Y-%m')=moisAnneeAction
    	and act2.REALISE=1
    	and elem.id_element=act2.id_element
    	and elem.asupprimer=0
    	into nbActions;
    	/*D?termination de la colonne ? updater*/
    	case moisAction
    		when '01' then set colonneToUpdate:='C810JANVIER';
    		when '02' then set colonneToUpdate:='C811FVRIER';
    		when '03' then set colonneToUpdate:='C812MARS';
    		when '04' then set colonneToUpdate:='C814AVRIL';
    		when '05' then set colonneToUpdate:='C815MAI';
    		when '06' then set colonneToUpdate:='C816JUIN';
    		when '07' or '08' then set colonneToUpdate:='C818JUILLET';
    		when '09' then set colonneToUpdate:='C820SEPTEMBRE';
    		when '10' then set colonneToUpdate:='C822OCTOBRE';
    		when '11' then set colonneToUpdate:='C823NOVEMBRE';
    		when '12' then set colonneToUpdate:='C824DCEMBRE';
    	end case;
    	/*preparation de la requête d'update*/
    PREPARE stmt FROM "update c800suiviactivit activite , actions act, c705objectifs obj,lienelement lien, c458equipecommercial eqCo
    	set  ? =?
    	where 
    	act.id_element=?
    	and eqCo.C467IDENTIFIANTUTILI=act.id_gestionnaire
    	and activite.id_elementdefaut=eqCo.id_element and activite.C807LIBELL like '2-Consolidation%'
    	and lien.id_element1=activite.id_element and lien.numrelation='800.705'
    	and obj.id_element=lien.id_element2 and obj.C714ANNE=date_format(act.datedebut,'%Y');";
      SET @a=colonneToUpdate, @b=nbActions, @c=idElement;
      EXECUTE stmt USING @a, @b, @c; 
      DEALLOCATE PREPARE stmt;
    END;
    Si quelqu'un a une idée, je suis preneur, j'aimerais éviter de coder 12 requêtes !!!
    Merci

  2. #2
    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,

    Déjà je note un premier problème le délimiteur sur le end de ta procédure stocké est ";" et devrais être différent pour éviter les erreurs de compilation mais je suppose que c'est une erreur due au fait que tu as mal recopié ton code

    Le pb peut venir de la version ou de la configuration de mysql ou du connecteur mysql que tu utilises, ils doivent permettre l'exécution de requêtes avec un set de résultats multiples.

    Par contre, tu ne peux pas utiliser une variable pour définir un élément de la structure de données comme les bases, tables, etc... tu dois faire un concat pour cette partie, le reste est bon à première vue
    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...

  3. #3
    Membre à l'essai

    Profil pro
    Inscrit en
    Août 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 21
    Points : 24
    Points
    24
    Par défaut
    Merci ericd69,
    tu as raison, ll faut utiliser un concat, mais je bloquais toujours car j'utilisais un client sql ne permettant pas de faire des statements dans des procédures (paramètres de sécurité du client sequelPro pour Mac). En fait ça marche dans mon appli, mais pas dans mon client mysql qui me sert à tester !

    Un exemple simple qui fonctionne si on utilise un client compatible :
    http://dev.mysql.com/tech-resources/...toredproc.html

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

Discussions similaires

  1. [Débutant] Appel d'une procédure insert ou update avec paramètres
    Par Bakkach dans le forum VB.NET
    Réponses: 17
    Dernier message: 18/04/2013, 14h44
  2. Problème concernant l'appel d'une procédure contenant "If"
    Par Flo3301 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/03/2011, 11h39
  3. Appel d'une procédure dynamique
    Par bebert13 dans le forum SQL
    Réponses: 8
    Dernier message: 05/06/2008, 18h57
  4. Réponses: 2
    Dernier message: 10/12/2004, 15h43
  5. Appel d'une procédure stockée par un vbscript
    Par NicoNours dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/10/2004, 13h53

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