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 :

résulatat requette SQL en paramètre d'un procstock


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 192
    Par défaut résulatat requette SQL en paramètre d'un procstock
    Bonjour,

    j'ai une petite question :
    Est-ce qu'il possible de passer le résultat d'une requête SQL en paramètre d'une procédure ?
    Petit exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CALL myProcedure(SELECT id, name FROM myTable)
    avec bien évidemment ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE PROCEDURE `myProcedure`(IN id BIGINT(20), IN name varchar(255))
    J'ai pas l'impression que ca fonctionne...

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 67
    Par défaut
    Pour ma part, je pense que non, mais je n'en ai aucune certitude.

    Finalement, le meilleur moyen, c'est peut-être de tester.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 12
    Par défaut
    Bonjour Yupa,

    Je débute dans la profession ( 2 mois d'exp ce jour au sein d'une equipe de dev. )

    Pour ma part, je te propose ceci. Il est clair que cela ne représente qu'une piste. J'attends moi aussi de voir les réponses des "Anciens" à ta question.



    Si tu as souhaite garder ta procédure portable :

    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
     
    DELIMITER $$
     
    CREATE PROCEDURE taProcedure (IN nomTable VARCHAR(30),IN nomColonne VARCHAR(30))
    BEGIN
        SET @resultat1 =(SELECT nomColonne FROM nomTable LIMIT 1) ;
        SET @resultat2 =(SELECT nomColonne FROM nomTable LIMIT 1) ;
        SET @resultat=CONCAT(@resultat1,'-',@resultat2);
        CALL taProcedureAvecResultat(@resultat);
    END$$
     
    CREATE PROCEDURE taProcedureAvecResultat(IN resultat VARCHAR(30))
    BEGIN
       -- Ton code ou il faudra extraire le résultat.
       -- Ton traitement...
    END

    Si tu trouve une solution, copie ton code... Cela me formera aussi.

    Par avance, Merci.

    Jérôme.




  4. #4
    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
    Billets dans le blog
    1
    Par défaut
    Oui c'est l'idée... les variable ne peuvent contenir que des types scalaires (nombres, booléens, chaines de caractères)...

    Pour passer un set de valeurs on va les concaténer en une chaine de caractère généralement de type text ou varchar si tu es sur que ça dépassera pas 255 caractères.

    Tu automatiseras la lecture de table par un curseur pour pouvoir interagir avec un nombre quelconque de résultats...

    voici un exemple :

    Code sql : 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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    -- uniquement pour le test
    drop database if exists hotels;
    create database hotels default character set utf8 collate utf8_general_ci;
    -- on sélectionne la bd quoi qu'il arrive pour bien travailler avec elle par défaut
    use hotels; -- à toi d'adapter
     
    -- on définit les table et on les remplit uniquement pour le test
    create table hotel(
    	id		int(4) not null auto_increment,
    	nom	varchar(255) not null,
    	constraint pk_hotel primary key(id)
    )engine=myisam auto_increment=1;
    create table personne(
    	id		int(4) not null auto_increment,
    	nom	varchar(255) not null,
    	constraint pk_personne primary key(id)
    )engine=myisam auto_increment=1;
    -- la table de liaison, je ne mets pas de contrainte dessus car je la crée avec le moteur myisam qui ne s'en occupe pas
    create table personne_a_dormi(
    	id				int(4) not null auto_increment,
    	idPersonne 	int(4) not null,
    	idHotel		int(4) not null,
    	constraint pk_personne_a_dormi primary key(id)
    )engine=myisam auto_increment=1;
     
    insert into hotel(nom)values("hotel1"),("hotel2"),("hotel3");
    insert into personne(nom)values("personne1"),("personne2"),("personne3"),("personne4");
    insert into personne_a_dormi(idPersonne,idHotel)values(1,1),(1,2),(2,2),(3,1),(3,3),(4,1),(4,2),(4,3);
     
    -- on définit la procédure stockée
    drop procedure if exists recapitulatif;
    delimiter |
    create procedure recapitulatif()
    begin
    	declare ligne text default "personne";
    	declare tmp varchar(255);
    	declare done,test bool;
    	declare cpers,chotel int(4);
    	declare colonnes cursor for select nom from hotel;
    	declare lignes cursor for select id,nom from personne;
    	declare lithotel cursor for select id from hotel;
    	declare CONTINUE HANDLER for SQLSTATE '02000' set done = 1;
    	-- on crée l'entête
    	open colonnes;
    	set done=false;
    	repeat
    		fetch colonnes into tmp;
    		if not done then
    			set ligne=concat(ligne,",",tmp);
    		end if;
    	until done end repeat;
    	close colonnes;
    	select ligne as entete;
    	set done=false;
    	open lignes;
    	repeat
    		fetch lignes into cpers,tmp;
    		if not done then
    			set test=done;
    			set ligne=tmp;
    			open lithotel;
    			repeat
    				fetch lithotel into chotel;
    				if not done then
    					select if(count(id)>0,"Oui","Non") into tmp from personne_a_dormi where idPersonne=cpers and idHotel=chotel;
    					set ligne=concat(ligne,",",tmp);
    				end if;
    			until done end repeat;
    			close lithotel;
    			select ligne;
    			set done=test;
    		end if;
    	until done end repeat;
    	close lignes;
    end|
    delimiter ;
    -- fin de la procédure stockée
     
    -- on teste en appelant la procédure
    call recapitulatif();

Discussions similaires

  1. Requette SQL paramétré (DATE)
    Par stfanny31 dans le forum Bases de données
    Réponses: 4
    Dernier message: 25/04/2012, 05h54
  2. requette sql un peu tordue
    Par maxidoove dans le forum Langage SQL
    Réponses: 3
    Dernier message: 26/08/2005, 14h52
  3. requête SQL avec paramètre en vb avec base de donnée SQL srv
    Par dialydany dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 01/02/2005, 10h33
  4. rave et requette sql
    Par developpeur_mehdi dans le forum Bases de données
    Réponses: 2
    Dernier message: 10/04/2004, 16h34
  5. requette sql compliqué sous delphi
    Par developpeur_mehdi dans le forum Bases de données
    Réponses: 3
    Dernier message: 10/03/2004, 16h33

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