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

Requêtes PostgreSQL Discussion :

Utilisation fonction personnalisée


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre régulier Avatar de thecanea
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 131
    Points : 107
    Points
    107
    Par défaut Utilisation fonction personnalisée
    Bonjour à tous,

    Là je tourne en rond et je ne sais plus quoi faire, c'est pourquoi je me tourne vers vous pour vos idées et remarques pertinentes.

    J'ai récupéré un DUMP comportant tables, données et fonctions.
    Je souhaiterai pouvoir utiliser ces fonctions, mais je n'ai pas réussi après moult essais (sous phppgadmin, pgadmin, psql en ligne de commandes...).

    Voici un exemple de l'une de ces fonctions :
    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
    CREATE OR REPLACE FUNCTION mybdd.get_the_info(character varying)
      RETURNS refcursor AS
    $BODY$
    DECLARE
      MYPARAM ALIAS FOR $1;
      curRet REFCURSOR;
    BEGIN
        OPEN curRet FOR select CHAMP1, CHAMP2, CHAMP3 from TABLE where upper(CHAMP2) like upper(MYPARAM) order by CHAMP2 asc;
      RETURN curRet;
    END;
     
    $BODY$
      LANGUAGE 'plpgsql' VOLATILE
      COST 100;
    ALTER FUNCTION mybdd.get_the_info(character varying) OWNER TO mybdd;
    Comment puis-je tester cette fonction ? Commande BEGIN ? LOOP ? FETCH ?

    Je ne suis pas du tout habitué à PostgreSQL et à ces curseurs.

    Merci par avance pour toutes les pistes que vous pourrez me donner.
    Une fois le processus compris j'aimerai accéder à ces fonctions depuis du code PHP, si possible après une connexion via PDO.

    Cordialement,
    Thec

  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
    Voir ici pour un exemple d'exploitation de refcursor en php:
    http://www.developpez.net/forums/d88...ray-refcursor/

  3. #3
    Membre régulier Avatar de thecanea
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 131
    Points : 107
    Points
    107
    Par défaut
    Bonjour,

    Merci pour ces précisions, j'ai réussi à accéder à la fonction de l'API depuis PHP, grâce aux informations contenues dans ce post : http://www.developpez.net/forums/d88...r/#post5033039

    Cependant, j'aimerai beaucoup pouvoir exécuter la requête en ligne de commande directement depuis psql ; à priori il faut forcément être en transaction (begin; commit ; mais je n'arrive pas à récupérer le curseur dans cette situation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    begin;
    select * from get_the_info('info%');
    commit;
    A quel moment et comment effectuer un fetch all ou quelque chose se rapprochant me permettant de visualiser les résultats ?

    En vous remerciant par avance,
    Thec

  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
    Il faut être dans une transaction effectivement pour que le curseur reste ouvert.
    Ensuite le refcursor est identifié par un nom qui est généré par sa création.
    Exemple
    test=> select * from fcurs();
           fcurs        
    --------------------
     <unnamed portal 1>
    (1 row)
    
    Le nom du curseur est donc "<unnamed portal 1>". Ensuite la commande FETCH se réfère à ce nom.
    Exemple :
    test=> fetch 5 in "<unnamed portal 1>";
            table_name        
    --------------------------
     user_mappings
     tables
     triggered_update_columns
     triggers
     usage_privileges
    (5 rows)
    
    test=> close "<unnamed portal 1>";
    CLOSE CURSOR
    
    

  5. #5
    Membre régulier Avatar de thecanea
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 131
    Points : 107
    Points
    107
    Par défaut
    Merci beaucoup, ça fonctionne parfaitement !

    J'aimerai juste encore aller un peu plus loin.
    Comment depuis ma ligne de commande je peux exécuter du plpgsql (j'ai le langage de chargé, je le vois depuis un select * from pg_catalog.pg_language) ?

    A priori, de ce que j'ai compris, via plpgsql, je pourrai déclarer mon curseur avant, puis l'ouvrir ce qui me permettrait de le nommer comme je le souhaite, c'est bien cela ? Source postgresql 8.3

    En vous remerciant,

    Cordialement,
    Thec

  6. #6
    Membre régulier Avatar de thecanea
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 131
    Points : 107
    Points
    107
    Par défaut
    Serait-il possible d'avoir l'équivalent du code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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");
    }
    avec l'utilisation de PDO ?

    En vous remerciant par avance,
    Cordialement,
    Thec


    Edit : je continue ce post ci dans une nouvelle discussion, dans la partie PHP > PostgreSQL du forum ; lien : http://www.developpez.net/forums/d11...resql-curseur/

  7. #7
    Membre régulier Avatar de thecanea
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 131
    Points : 107
    Points
    107
    Par défaut
    Je cherche juste encore la réponse à cette question avant d'indiquer comme résolue cette discussion :

    Comment depuis ma ligne de commande je peux exécuter du plpgsql (j'ai le langage de chargé, je le vois depuis un select * from pg_catalog.pg_language) ?

    A priori, de ce que j'ai compris, via plpgsql, je pourrai déclarer mon curseur avant, puis l'ouvrir ce qui me permettrait de le nommer comme je le souhaite, c'est bien cela ? Source postgresql 8.3

    Merci par avance,

  8. #8
    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
    On ne peut pas exécuter du plgpsql en dehors d'une fonction et on ne peut pas appeler une fonction autrement que via une requête SQL.

  9. #9
    Membre régulier Avatar de thecanea
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 131
    Points : 107
    Points
    107
    Par défaut
    Ok, merci pour ces précisions, c'est résolu pour moi.
    Désolé du temps de réponse,

    Cdt,
    Thecanea

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/01/2014, 15h03
  2. Réponses: 8
    Dernier message: 12/08/2011, 09h25
  3. [XL-2007] #NOM?, apparaît lors de l'utilisation d'une fonction personnalisée.
    Par BomberSheep dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/02/2010, 11h57
  4. Utilisation de fonctions personnalisées
    Par San Soussy dans le forum Formules
    Réponses: 1
    Dernier message: 07/11/2008, 09h49
  5. Utiliser ma fonction personnalisée dans Word
    Par juvamine dans le forum Word
    Réponses: 5
    Dernier message: 11/12/2007, 21h58

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