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 :

[proc sto][prepared statement]passer un nom de base en parametre


Sujet :

SQL Procédural MySQL

  1. #1
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    949
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 949
    Points : 730
    Points
    730
    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 : 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
     
     
    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?

  2. #2
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    949
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 949
    Points : 730
    Points
    730
    Par défaut
    j'ai essayé avec du :
    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
    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 : 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
    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 :'(

  3. #3
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 739
    Points
    11 739
    Par défaut
    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) ?

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 24/05/2013, 16h25
  2. passer un nom de table en parametre
    Par fred19732 dans le forum Développement
    Réponses: 2
    Dernier message: 14/01/2011, 23h32
  3. Réponses: 9
    Dernier message: 11/01/2010, 10h30
  4. passer un nom de ficher en parametre
    Par lcoder dans le forum Langage
    Réponses: 2
    Dernier message: 20/09/2008, 12h25
  5. [VB6] Possibilité de passer un nom de sub en parametre
    Par Vesta dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 31/05/2006, 10h17

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