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 25/11/2010, 18h08   #1
Candidat au titre de Membre du Club
 
Inscription : août 2007
Messages : 22
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 22
Points : 11
Points : 11
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 :
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
ckermorgant est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 17h52   #2
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 826
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 : 826
Points : 1 288
Points : 1 288
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
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 23h41   #3
Candidat au titre de Membre du Club
 
Inscription : août 2007
Messages : 22
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 22
Points : 11
Points : 11
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
ckermorgant 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 19h34.


 
 
 
 
Partenaires

Hébergement Web