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 30/08/2006, 11h26   #1
Invité régulier
 
Inscription : août 2006
Messages : 24
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 24
Points : 5
Points : 5
Par défaut Procédure stockée, passage de paramètres

Bonjour à tous, je me permet de vous poser une question suite à un pbme que je ne parviens à résoudre.

Voici l'exemple sur lequel je travaille.
Citation:
CREATE PROCEDURE ligue1.INIT_EQUIPE (nom_eq varchar(50), ville_eq varchar(30))
BEGIN
INSERT INTO equipe (nom, ville) VALUES (nom_eq, ville_eq);
END//
Cela marche parfaitement. Le pbme, c'est que je souhaite passer la table "equipe" en parametre, notamment pour réutiliser cette procédure sur différentes tables, de cette facon :

Citation:
CREATE PROCEDURE ligue1.INIT_EQUIPE (equipe_var varchar(50), nom_eq varchar(50), ville_eq varchar(30))
BEGIN
INSERT INTO equipe_var (nom, ville) VALUES (nom_eq, ville_eq);
END//
mais lors de l'execution, MYSQL5 prend equipe_var directement, il ne l'interprête pas comme la variable de parametre qu'il doit remplacer (je ne sais pas si je me suis bien fait comprendre)
du coup il me dit que la table equipe_var n'existe pas, ce qui est fort logique.

N'ayant pas trouvé d'exemples me permettant de mettre en place cela, je m'en remet à vous afin de m'aiguiller.

En vous remerciant par avance.
Loïc.
kanon90 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 11h43   #2
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
Salut,

Il faut utiliser du SQL dynamique. C'est-à-dire créer la requête sous forme de chaîne de caractères, avant de l'exécuter.

Un exemple :

Code :
1
2
3
4
5
6
7
8
 
CREATE PROCEDURE ligue1.INIT_EQUIPE (equipe_var varchar(50), nom_eq varchar(50), ville_eq varchar(30))
BEGIN
SET @requete = CONCAT('INSERT INTO ', equipe_var, '(nom, ville) VALUES (nom_eq, ville_eq)');
PREPARE requete_insert FROM @requete;
EXECUTE requete_insert;
DEALLOCATE PREPARE requete_insert;
END //
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 11h53   #3
Invité régulier
 
Inscription : août 2006
Messages : 24
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 24
Points : 5
Points : 5
okay ca a l'air de marcher, je te remercie bcp !!!

je vais l'adapter ds le vrai code now ^^
kanon90 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 13h52   #4
Invité régulier
 
Inscription : août 2006
Messages : 24
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 24
Points : 5
Points : 5
hum je vais passer pour un boulet... mais ca ne marche pas avec le vrai code... le truc c'est que je dois faire executer la requete dans un curseur, comme suit :

Je suis dsl de redemander de l'aide, à la base je suis administrateur système, et cela fait depuis l'IUT que je n'ai pas fait de procédure stockée
du coup je plane ^^" (en + le code est pas de moi...)

Citation:
CREATE PROCEDURE MAJ_copier_identifiant1(IN inVar VARCHAR(25))
BEGIN
DECLARE nom_id VARCHAR(128);
DECLARE max_id VARCHAR(128);
DECLARE max_id_obj VARCHAR(128);
DECLARE done INT DEFAULT 0;
SET @requete = CONCAT('SELECT champ3 FROM ',inVar,' WHERE champ3 NOT IN (SELECT Identifiant_beaune FROM import_tc_hotels.ass_idcdt_idbeaune)');
DECLARE cura CURSOR FOR @requete;

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
SELECT "toto" as inVar;
UPDATE import_tc_hotels.inVar SET `champ3` = champ1;
OPEN cura;
REPEAT
FETCH cura INTO nom_id;
IF NOT done THEN
SELECT concat('HOTBOU02',right(max(id),8)+1) INTO max_id FROM bdr_cdt_data.hot;
INSERT INTO bdr_cdt_data.hot (id) VALUES(max_id);
INSERT INTO import_tc_hotels.ass_idcdt_idbeaune (Identifiant_cdt,Identifiant_beaune) VALUES (max_id, nom_id);
SELECT concat('obj',right(max(id),5)+1) INTO max_id_obj FROM bdr_cdt_data.obj;
INSERT INTO bdr_cdt_data.obj (id) VALUES(max_id_obj);
INSERT INTO bdr_cdt_data.ass_idobj_idssobj (idObj,idssObj) VALUES (max_id_obj,max_id);
END IF;
UNTIL done END REPEAT;
CLOSE cura;
UPDATE ass_idcdt_idbeaune INNER JOIN import_tc_hotels.inVar ON ass_idcdt_idbeaune.Identifiant_beaune = import_tc_hotels.inVar.champ3 SET import_tc_hotels.inVar.champ1 = Identifiant_cdt;
END
|
kanon90 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 14h20   #5
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
Malheureusement, il me semble que MySQL ne permette pas d'utiliser un curseur avec une requête dynamique. Je me trompe peut-être...

Si tu ne trouves pas de solution. Voici une bidouille qui me vient à l'esprit : avec un prepared statement, tu crées une table temporaire que tu remplis (INSERT ... SELECT) avec les enregistrements que tu as besoin pour ton curseur. Et ton curseur sera défini pour parcourir cette table temporaire.
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 14h40   #6
Invité régulier
 
Inscription : août 2006
Messages : 24
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 24
Points : 5
Points : 5
hum oki, je commencais a m'en douter pour le coup des curseurs...

Beh je vais tenter de me débrouiller, je te remercie bcp pour le temps que tu m'as accordé, c'était très sympa de ta part.

@++
kanon90 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 10h17.


 
 
 
 
Partenaires

Hébergement Web