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 :

PREPARE dans une proc stock


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3
    Par défaut PREPARE dans une proc stock
    Bonjour à tous.
    Je me permets de faire un peu de nécromancie de topic dans la mesure où ce sujet correspond tout à fait à ce que j'essaie de faire.

    Petite présentation du contexte tout d'abord :
    J'ai besoin de faire des requêtes avec un nom de table variable dans une procédure stockée en mysql. Après quelques recherches sur le web, il apparait que pour ce faire, je dois utiliser un PREPARE statement.

    Courageux et optimiste, je me lance. Oui mais voilà, je récupère une erreur :
    "#1312 - PROCEDURE 3620t01.maProcedure can't return a result set in the given context"
    Damn..

    Après pas mal de recherches cette fois-ci, je retiens que :
    -Il n'est pas possible de faire d'utiliser un PREPARE statement dans une fonction ou une procédure stockée SAUF pour les procédures stockées justement DEPUIS la version 5.0.13 de mysql.
    Or, je travaille sur la version 5.0.51.

    Du coup je ne vois vraiment pas d'où peut venir le soucis.
    Si une bonne âme avait une idée..

    Pour info, je mets ici la procédure de test que j'ai faite, basée sur celle utilisée plus haut dans ce topic :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    delimiter |
    CREATE PROCEDURE maProcedure()
    BEGIN
    SET @sqlCMD =  CONCAT('select * from ', 'tickets_J');
    PREPARE stmt FROM @sqlCMD;
    EXECUTE stmt ;
    END
    et l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1312 - PROCEDURE 3620t01.maProcedure can't return a result set in the given context
    Ps : Je précise; si besoin est, que j'ai l'erreur sur le CALL de ma procédure stockée, et pas à la création

    Merci d'avance.

    Thomas

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    Les procédures stockées de MySQL ne sont pas faites pour envoyer un jeu de résultat... sur des cas simples, ça marche quand même, mais comme elles ne sont pas faites pour ça, ça plante à la moindre petite complexité...

    Le contournement habituel est de faire un CREATE SELECT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    delimiter |
    CREATE PROCEDURE maProcedure()
    BEGIN
    SET @sqlCMD =  CONCAT('create table tmp_resu select * from ', 'tickets_J');
    PREPARE stmt FROM @sqlCMD;
    EXECUTE stmt ;
    END |
     
    delimiter ;
     
    select * from tmp_resu ;

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3
    Par défaut
    Ok, merci beaucoup, c'est bon à savoir.

    Mais du coup mon problème réel persiste. Je m'explique :
    Le code avec la requete SELECT n'était qu'un test pour tester les PEPARE statement, ce que je cherche en réalité à faire est un INSERT, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    delimiter |
    CREATE PROCEDURE maProcedure(maTable)
    BEGIN
    SET @sqlCMD =  CONCAT("INSERT INTO ",maTable," VALUES('valeur1','valeur2')");
    PREPARE stmt FROM @sqlCMD;
    EXECUTE stmt ;
    END |
    Du coup à priori il n'y a pas de jeu de résultat renvoyé.
    Mais j'ai tout de même l'erreur.
    Qu'est-ce que j'ai manqué ?

    Merci d'avance,
    Thomas

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    ça marche chez moi, à condition de corriger ta syntaxe pour avoir un CREATE qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    delimiter |
    CREATE PROCEDURE maProcedure(IN maTable VARCHAR(30))
    BEGIN
    SET @sqlCMD =  CONCAT('INSERT INTO ', maTable, ' VALUES(''valeur1'', ''valeur2'')');
    PREPARE stmt FROM @sqlCMD;
    EXECUTE stmt ;
    END |
    
    delimiter ;
    Vérification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    create table test(a varchar(50), b varchar(50)) ;
    call maprocedure 'test' ;
    select * from test ;
     
    +---------+---------+
    | a       | b       |
    +---------+---------+
    | valeur1 | valeur2 |
    +---------+---------+
    1 row in set (0.04 sec)

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3
    Par défaut
    Damn, ça ne fonctionne pas chez moi, même une fois le code corrigé..
    Aurais-tu une idée de la cause du problème ?
    Y a-t-il une solution de contournement ?

    Merci d'avance,
    Thomas

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    Peux-tu dire exactement ce qui ne marche pas (compilation, exécution) et nous donner le
    message d'erreur ?

Discussions similaires

  1. Appels de procedures stockées dans une proc stockée ?
    Par Nadaa dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 17/07/2008, 10h32
  2. Faire un simple SELECT dans une Proc. Stock
    Par MaelstroeM dans le forum Oracle
    Réponses: 2
    Dernier message: 29/08/2007, 09h27
  3. Réponses: 3
    Dernier message: 28/08/2007, 15h21
  4. Réponses: 5
    Dernier message: 27/07/2007, 16h21
  5. Réponses: 2
    Dernier message: 12/06/2006, 12h35

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