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

PHP & Base de données Discussion :

récupération de variable OUT d'une requête stockée


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    513
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 513
    Par défaut récupération de variable OUT d'une requête stockée
    Bonjour

    je tente d'avoir la variable OUT d'une requête stockée qui devrait renvoyé le carré de l'entrée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    DELIMITER $$
    CREATE DEFINER=`root`@`localhost` PROCEDURE `RR`(IN `p_envoi` INT(4), OUT `p_retour` INT(6))
        NO SQL
    BEGIN
     
    SELECT (p_envoi * p_envoi)INTO p_retour ;
     
    SELECT p_retour;
     
    END$$
    DELIMITER ;
    j'appel cette requête stockée avec ce code php

    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
     
    	$envoi = 2 ;
    	$retour = 0 ;
    	echo 'envoi = '.$envoi. '</br>';
    	echo 'retour = '.$retour. '</br>';
     
    	$sql="CALL RR(:p_envoi,:p_retour)";
    	$sqlpret = $connexion->prepare($sql);
     
    	$sqlpret->bindParam(':p_envoi', $envoi, PDO::PARAM_INT);
    	$sqlpret->bindParam(':p_retour', $retour, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT);
     
    	$sqlpret->execute();	
     
    	echo 'envoi = '.$envoi. '</br>';
    	echo 'retour = '.$retour. '</br>';
    mais j'ai toujours même message erreur

    Erreur fatale : Exception non interceptée 'PDOException' avec le message 'SQLSTATE [42000]: Erreur de syntaxe ou violation d'accès: 1414 OUT ou INOUT argument 2 pour la routine bridgez.RR n'est pas une variable ou une nouvelle pseudo-variable dans AVANT de déclencher '

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT (p_envoi * p_envoi)INTO p_retour ;
    C'est quoi cette requête ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    513
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 513
    Par défaut
    Bonjour

    c'est pour prendre une requête simpliste quelconque le but c'est comment on fait pour utiliser cette sortie OUT de la requête stockée.

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Je n'ai jamais encore fait ça mais, d'après ce que j'ai vu par ailleurs, il faudrait faire un truc de ce genre... (pas testé)

    Procédure SQL simple et bidon pour test :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DELIMITER $$
    CREATE PROCEDURE p_test (IN p_envoi INT(4), OUT p_retour CHAR(1))
    -- Retourne le caractère correspondant au code ASCII envoyé
    BEGIN
    	SELECT CHAR(p_envoi) INTO p_retour;
    END$$
    DELIMITER ;

    Programme bidon PHP pour tester l'appel à la procédure et la récupération de son paramètre de sortie :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // On suppose que la connexion PDO est définie par ailleurs et accessible à ce programme
     
    $sql = "CALL p_test(:ascii)";
     
    $prep = $connexionPDO->prepare($sql);
    $prep->bindValue(':ascii', 65, PDO::PARAM_INT);
    $prep->execute();
     
    $sql = "SELECT @p_retour AS retour";
    $prep = $connexionPDO->prepare($sql);
    $prep->execute();
    $retour = $prep->fetch(PDO::FETCH_ASSOC);
     
    echo 'Retour de la procédure SQL (caractère correspondant au code ASCII 65 : '.$retour['retour'];
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    513
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 513
    Par défaut
    ça je sais faire mais l'intéret était de faire appel à une requête stockée et récupérer la valeur de sortie sans être obligé de refaire une requête pour avoir la sortie.
    si non j'ai fait ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    dans la requête stockée
     
    Select var_OUT
     
    mais aucunement besoin d'une variable OUT dans la requête stockée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $result = $sql->fetch(PDO::FETCH_ASSOC);
    print_r ($result) ;//ici je récupère la var_OUT

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Par défaut, une procédure exécute du code SQL mais ne renvoie rien, contrairement à une fonction SQL.
    La possibilité de renvoyer un résultat par une procédure est donnée par OUT mais le résultat semble rester sur le serveur MySQL et il faut lire ensuite ce résultat qui est stocké dans le paramètre SQL de la procédure.
    C'est du moins ce que j'ai compris de mes explorations matinales suite à votre question.

    si non j'ai fait ceci
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    dans la requête stockée
     
    Select var_OUT
     
    mais aucunement besoin d'une variable OUT dans la requête stockée
    Là je vois une requête mais pas une procédure !

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $result = $sql->fetch(PDO::FETCH_ASSOC);
    print_r ($result) ;//ici je récupère la var_OUT
    C'est quoi l'objet $sql ? Comment est-il instancié ?

    Peut-être qu'on peut simplifier mon code comme ci-dessous mais je n'ai pas testé, ni ce matin ni maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $sql = "CALL p_test(:ascii)";
     
    $prep = $connexionPDO->prepare($sql);
    $prep->bindValue(':ascii', 65, PDO::PARAM_INT);
    $prep->execute();
    $result = $prep->fetch(PDO::FETCH_ASSOC);
     
    print_r ($result) ;
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. Time out sur une requête / procédure stockée
    Par erwik dans le forum Développement
    Réponses: 6
    Dernier message: 28/02/2012, 09h01
  2. Réponses: 2
    Dernier message: 26/01/2010, 10h05
  3. Appeler une variable VB dans une requête SQL
    Par Chopper dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 12/09/2006, 14h27
  4. Créer une variable varchar interne à une procédure stockée
    Par killysui dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 26/04/2006, 17h59
  5. [JDBC] ResultSet d'une Requête stockée
    Par YéTeeh dans le forum Oracle
    Réponses: 6
    Dernier message: 15/05/2004, 18h35

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