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 15/01/2008, 15h17   #1
Membre expérimenté
 
Avatar de hansaplast
 
Inscription : septembre 2005
Messages : 925
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : septembre 2005
Messages : 925
Points : 562
Points : 562
Par défaut [proc sto][prepared statement]passer un nom de base en parametre

Bonjour,

Ca fait un petit moment que j'essaie de créer une procedure stockée qui peut prendre un nom de base en parametre.

Ce qeu j'ai trouvé dans mes recherches :
On ne peut changer de base dans une procedure stockée qu'en utilisant les prepared statement.
Mon pb etant le suivant : il me faut un curseur sur la requete.

en gros, voici ce que ca devrait donner :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
 
CREATE  PROCEDURE `maProcedure`(pBase varchar(50))
BEGIN
 
	declare vbar int(6);
	declare v_fin_curseur BOOLEAN DEFAULT false;
	declare curs CURSOR FOR SELECT
					bar
				FROM 
					foo
				WHERE 
					foobar IN (SELECT foobar FROM pBase.fooD);
 
	declare continue handler FOR NOT found SET v_fin_curseur = True;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
	OPEN curs;   
	FETCH curs INTO vbar;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
	WHILE (v_fin_curseur = false) DO  
		#code ici
		FETCH curs INTO vbar;   
	end while;
    END$$
DELIMITER ;
A priori, on ne peut pas faire de prepared statement sur un resultat mis en curseur. Me trompe-je?
__________________
Vous un sur Grenoble? on est fait pour tout du moins si vous mon CV
hansaplast est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2008, 16h51   #2
Membre expérimenté
 
Avatar de hansaplast
 
Inscription : septembre 2005
Messages : 925
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : septembre 2005
Messages : 925
Points : 562
Points : 562
j'ai essayé avec du :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE  PROCEDURE `maProcedure`(pBase varchar(50))
BEGIN
 
	declare vbar int(6);
	declare v_fin_curseur BOOLEAN DEFAULT false;
	prepare statement FROM "declare curs CURSOR FOR  SELECT
					bar
				FROM 
					foo
				WHERE 
					foobar IN (SELECT foobar FROM ?.fooD)";
	EXECUTE statement USING pBase;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
	declare continue handler FOR NOT found SET v_fin_curseur = True;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
	OPEN curs;   
	FETCH curs INTO vbar;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
	WHILE (v_fin_curseur = false) DO  
		#code ici
		FETCH curs INTO vbar;   
	end while;
    END$$
DELIMITER ;
voir du :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE  PROCEDURE `maProcedure`(pBase varchar(50))
BEGIN
 
	declare vbar int(6);
	declare v_fin_curseur BOOLEAN DEFAULT false;
	prepare statement FROM "SELECT
					bar
				FROM 
					foo
				WHERE 
					foobar IN (SELECT foobar FROM ?.fooD)";
	declare curs CURSOR FOR EXECUTE statement USING pBase;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
	declare continue handler FOR NOT found SET v_fin_curseur = True;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
	OPEN curs;   
	FETCH curs INTO vbar;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
	WHILE (v_fin_curseur = false) DO  
		#code ici
		FETCH curs INTO vbar;   
	end while;
    END$$
DELIMITER ;
mais, rien n'y fait, ca ne marche pas.
en outre ce que je comprend de ca :
SQL syntax for prepared statements cannot be used within stored routines (procedures or functions), or triggers. This restriction is lifted as of MySQL 5.0.13 for stored procedures, but not for stored functions or triggers. However, a cursor cannot be used for a dynamic statement that is prepared and executed with PREPARE and EXECUTE. The statement for a cursor is checked at cursor creation time, so the statement cannot be dynamic.


donc, au final : on peut pas :'(
__________________
Vous un sur Grenoble? on est fait pour tout du moins si vous mon CV
hansaplast est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 01h09   #3
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
et si tu faisais un USE en prepared statement, afin d'exécuter ensuite ton curseur sur la base courante (modifiée par le USE) ?
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun 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 08h01.


 
 
 
 
Partenaires

Hébergement Web