Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
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 26/12/2011, 01h16   #1
Invité de passage
 
Inscription : décembre 2011
Messages : 2
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 2
Points : 1
Points : 1
Par défaut Afficher une requête avec une fonction

Bonsoir,
j'aimerais savoir comment faire pour afficher le résultat d'une requête en utilisant une fonction pgsql.

Par exemple, j'ai une table :
Code :
1
2
3
4
5
6
7
 
CREATE TABLE personne(
    id_personne integer,
    prenom text,
    nom text,
    PRIMARY KEY(id_personne)
);
j'exécute la requête :
Code :
1
2
 
SELECT prenom,nom FROM personne WHERE id_personne = 1;
Ca affiche la ligne contenant prenom et nom de cette personne.

Mais, j'aimerais faire la même chose avec une fonction.
C'est-à-dire quelque chose du genre :

Code :
1
2
3
4
5
6
7
8
 
CREATE OR REPLACE FUNCTION getIdentite(id_p integer)
	returns void AS $$
begin
	SELECT prenom, nom FROM personne
        WHERE id_personne = id_p;
end;
$$ LANGUAGE 'plpgsql';
Mais j'obtiens l'erreur :
Code :
1
2
 
-- ERREUR:  la requête n'a pas de destination pour les données résultantes
Avez-vous une idée ?
Merci.
fireworkz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2011, 09h02   #2
Expert Confirmé
 
Homme
Inscription : septembre 2006
Messages : 2 291
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : septembre 2006
Messages : 2 291
Points : 2 738
Points : 2 738
Dans n'importe quel langage informatique, si vous voulez afficher le résultat d'une fonction, il faut d'abord écrire une fonction et non une procédure :

il faut retourner un "objet" d'un type reconnu par le langage et non "rien" : "void" en l'occurrence.

En PL/pgSQL, pour retourner des objets structurés ("records") il faut donc déclarer la fonction comme retournant un type structuré (retournant un seul enregistrement) ou un ensemble de record (SET OF …).

Le type structuré est soit le rowtype d'une table ou d'une vue soit un type créé pour la circonstance.
JeitEmgie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 18h51   #3
Membre Expert
 
Avatar de kain_tn
 
Homme
Inscription : mars 2005
Messages : 577
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations forums :
Inscription : mars 2005
Messages : 577
Points : 1 209
Points : 1 209
Tu peux également utiliser le mot clé "OUT" pour déclarer des paramètres de sortie et éviter ainsi de définir une nouvelle vue ou d'être lié à une table:

http://www.postgresql.org/docs/9.1/s...ION-PARAMETERS
__________________
Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


Code C :
1
2
3
4
5
6
7
#include <stdio.h>
 
int main(int argc, char **argv) {
 
    printf("So long, and thanks for the fish, Dennis...\n");
    return 0;
}
kain_tn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2012, 10h46   #4
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 426
Points : 6 426
Bonjour,

Depuis PostgreSQL 8.4, il est également possible de retourner un type TABLE.
Voici un exemple tiré de la documentation :
Code :
1
2
3
4
5
CREATE FUNCTION extended_sales(p_itemno int) RETURNS TABLE(quantity int, total numeric) AS $$
BEGIN
    RETURN QUERY SELECT quantity, quantity * price FROM sales WHERE itemno = p_itemno;
END;
$$ LANGUAGE plpgsql;
A adapter à ton propre cas...
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2012, 10h15   #5
Invité de passage
 
Inscription : décembre 2011
Messages : 2
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 2
Points : 1
Points : 1
Merci à tous pour vos réponses, j'ai plutôt cherché dans la voie de RECORD et SETOF RECORD, j'ai pu trouver une solution qui est celle-ci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
CREATE OR REPLACE FUNCTION getIdentite(id_p integer)
	returns setof record AS $$
declare
	rec record;
begin
	FOR rec IN		
		SELECT prenom, nom 
                FROM personne
                WHERE id_personne = id_p;
        loop
		RETURN next rec;
        end loop;
 
	RETURN;
end;
$$ LANGUAGE 'plpgsql';
avec l'appel suivant :

Code :
1
2
 
SELECT * FROM getIdentite(1) AS (prenom text, nom text);
ce qui devrait afficher quelque chose du genre :

Code :
1
2
3
4
 
   prenom   |     nom      
------------+--------------
     Alex   |    Térieur
fireworkz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2012, 10h31   #6
Membre habitué
 
Avatar de mapmip
 
Inscription : juillet 2006
Messages : 544
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 544
Points : 108
Points : 108
ces reponses sont precieuses je les indexe
mapmip 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 06h06.


 
 
 
 
Partenaires

Hébergement Web