Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL > Requêtes
Requêtes Forum d'entraide sur les requêtes SQL spécifiques à PostgreSQL, les triggers, les vues, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/10/2011, 15h43   #1
Membre régulier
 
Avatar de thecanea
 
Inscription : octobre 2008
Messages : 124
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Côte d'Or (Bourgogne)

Informations forums :
Inscription : octobre 2008
Messages : 124
Points : 71
Points : 71
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 :
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
thecanea est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 16h20   #2
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
Voir ici pour un exemple d'exploitation de refcursor en php:
http://www.developpez.net/forums/d88...ray-refcursor/
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/10/2011, 16h48   #3
Membre régulier
 
Avatar de thecanea
 
Inscription : octobre 2008
Messages : 124
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Côte d'Or (Bourgogne)

Informations forums :
Inscription : octobre 2008
Messages : 124
Points : 71
Points : 71
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 :
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
thecanea est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 17h04   #4
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
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

estofilo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/10/2011, 10h35   #5
Membre régulier
 
Avatar de thecanea
 
Inscription : octobre 2008
Messages : 124
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Côte d'Or (Bourgogne)

Informations forums :
Inscription : octobre 2008
Messages : 124
Points : 71
Points : 71
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
thecanea est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 11h02   #6
Membre régulier
 
Avatar de thecanea
 
Inscription : octobre 2008
Messages : 124
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Côte d'Or (Bourgogne)

Informations forums :
Inscription : octobre 2008
Messages : 124
Points : 71
Points : 71
Serait-il possible d'avoir l'équivalent du code suivant
Code :
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/
thecanea est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/10/2011, 11h14   #7
Membre régulier
 
Avatar de thecanea
 
Inscription : octobre 2008
Messages : 124
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Côte d'Or (Bourgogne)

Informations forums :
Inscription : octobre 2008
Messages : 124
Points : 71
Points : 71
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,
thecanea est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/10/2011, 23h14   #8
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
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.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 13h33   #9
Membre régulier
 
Avatar de thecanea
 
Inscription : octobre 2008
Messages : 124
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Côte d'Or (Bourgogne)

Informations forums :
Inscription : octobre 2008
Messages : 124
Points : 71
Points : 71
Ok, merci pour ces précisions, c'est résolu pour moi.
Désolé du temps de réponse,

Cdt,
Thecanea
thecanea est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h13.


 
 
 
 
Partenaires

Hébergement Web