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 :

Pg_fetch_array et Refcursor [PostgreSQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    171
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Juin 2008
    Messages : 171
    Points : 65
    Points
    65
    Par défaut Pg_fetch_array et Refcursor
    Bonjour,

    Je souhaite écrire un morceau de code PHP qui :
    - exécute une Fonction PostgreSQL,
    - récupére les valeurs dans un tableau,
    - exploite le tableau.

    La Fonction PostgreSQL est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select User.historique('00001','20100222','20100224');
    Elle renvoie un REFCURSOR (un ensemble de lignes).

    J'ai écrit ce morceau de 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
    17
     
            public function db_ref_cursor($_query)
            {
                    $aRetTab = array();
     
     
                    $result = pg_query($_query);
     
                    while ($arr = pg_fetch_array($result,NULL,PGSQL_ASSOC))
                            {
                                    echo $arr["cjour"].' <br/> <br/>';
                            }
     
                    pg_free_result($result);
     
                    return $aRetTab;
            }
    J'ai utilisé pg_query pour exécuter la Fonction PostgreSQL.
    Ensuite, je fais une boucle avec pg_fetch_array pour récupérer les lignes.
    Enfin, j'essaye d'afficher le contenu des champs mais il semble que tout soit vide.

    Bien sûr, j'ai testé la Fonction sous Psql, elle me retourne bien un refcursor avec des lignes.

    J'espére être clair.

    Merci pour les réponses.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Il faut utiliser la commande SQL FETCH pour récupérer le contenu du curseur, et appliquer pg_fetch_array au résultat de cette commande. Il faut aussi faire ça dans une transaction, sinon le curseur va être implicitement fermé aussitôt qu'il a été ouvert.

  3. #3
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    171
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Juin 2008
    Messages : 171
    Points : 65
    Points
    65
    Par défaut Pg_fetch_array et Refcursor
    Bonjour Estofilo,

    Je suis dans la catégorie "grand débutant" en PHP.

    Aurais-tu un exemple à me proposer sur le code car je n'en ai pas trouvé sur le net ?

    D'avance merci.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Voici un exemple.
    Une fonction plpgsql qui renvoie un refcursor:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE OR REPLACE FUNCTION fcurs() RETURNS refcursor AS
    $$
    DECLARE
      c refcursor;
    BEGIN
      OPEN c FOR select table_name from information_schema.tables;
      RETURN c;
    END;
    $$ LANGUAGE plpgsql;
    Une fonction php qui exploite le refcursor:
    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
     
     
    function test_refcursor()
    {
      pg_query("begin");
      $res1 = pg_query("SELECT fcurs()");
      if ($res1!==false) {
        list($cname) = pg_fetch_array($res1);
        $res2 = pg_query("FETCH ALL IN \"" . $cname . "\"");
        if ($res2!==false) {
          $all = pg_fetch_all($res2);
          print_r($all);
        }
      }
      pg_query("commit");
    }

  5. #5
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    171
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Juin 2008
    Messages : 171
    Points : 65
    Points
    65
    Par défaut Pg_fetch_array et Refcursor
    Bravo Estofilo,

    C'est toi le plus fort .

    Enfin une source exploitable sur le net.

    Merci beaucoup.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    PGSQL_DIAG_MESSAGE_PRIMARY: cannot open multi-query plan as cursor
    Je ne connais pas ce message. Peux-tu montrer ce qu'il y a dans la variable use_sql?

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Ce message indique une erreur lors de l'execution de la procedure stockée.

    Le problème est reglé : 2 erreurs de ma part à ne pas commettre pour les futurs post :
    1. L'ordre des paramètres de votre fonction est important : respectez-le, lors de l'appel.
    2. Lors d'un test sur une variable TEXT verifier la casse..


    Bon continuation à tous !

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

Discussions similaires

  1. [Oracle] Récupérer le RefCursor d'une function Oracle
    Par Hades_L dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 03/12/2010, 17h29
  2. Exécuter fonction retourant REFCURSOR depuis éditeur
    Par mercure07 dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 27/02/2009, 10h03
  3. Se déplacer dans un REFCURSOR
    Par tchoimars dans le forum SQL
    Réponses: 5
    Dernier message: 22/02/2008, 11h48
  4. pg_fetch_array insensible
    Par melmel dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 27/07/2005, 12h34
  5. Pb :SQl dynamique et refcursor
    Par anthony8 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 21/10/2004, 09h39

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