PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 10/12/2018 10:28:34

amine_oxa
Membre

Récupéré résultat d'un SELECT dans une procédure stockée

Bonjour à tous

je suis nouveau sur PGSQL et je veux savoir comment recuperer le resultat d'un simple select qui existe dans une procédure stockée , j'etais sur SQL SERVER et c'etai simple . Est ce que c'est possible de le faire avec postgresql sans declarer (RETURN TABLE)

Merci de m'aider

Hors ligne

#2 10/12/2018 10:44:24

gleu
Administrateur

Re : Récupéré résultat d'un SELECT dans une procédure stockée

Il faut bien lui déclarer qu'on renvoie plusieurs lignes, et ça passera donc soit par un RETURNS TABLE, soit par un RETURNS SETOF.

Hors ligne

#3 10/12/2018 11:31:24

amine_oxa
Membre

Re : Récupéré résultat d'un SELECT dans une procédure stockée

Merci pour votre réponse , j'ai plusieurs tables avec des jointures (peu complexe ) et je veux récupéré tous les colonnes de tous les tables , est ce que à chaque fois je dois déclarer une table avec toutes les colonnes ?? peut être en créant une vue mais personnellement je veux utilisé une procédure stockée à cause des contraintes avec mon application web

merci encore

Hors ligne

#4 10/12/2018 11:56:38

gleu
Administrateur

Re : Récupéré résultat d'un SELECT dans une procédure stockée

Si vous voulez utiliser une fonction stockées, le mieux est de créer un type composite, composé des différentes colonnes en sortie. Cela donnerait quelque chose comme ceci (exemple complet) :

postgres=# select * from employes;
┌───────────┬─────────┐
│    nom    │ service │
├───────────┼─────────┤
│ Sharon    │       1 │
│ Jennifer  │       2 │
│ Guillaume │       4 │
│ a         │         │
│ b         │         │
│ c         │         │
└───────────┴─────────┘
(6 rows)

postgres=# select * from services;
┌─────────────┬──────────────┬──────────────┬─────────────┬───────────────┐
│ num_service │ nom_service  │ localisation │ departement │ date_creation │
├─────────────┼──────────────┼──────────────┼─────────────┼───────────────┤
│           1 │ Comptabilité │ Paris        │          75 │ 2006-09-03    │
│           2 │ R&D          │ Rennes       │          40 │ 2009-08-03    │
│           3 │ Commerciaux  │ Limoges      │          52 │ 2006-09-03    │
│           4 │ Consultants  │ Nantes       │          44 │ 2009-08-03    │
└─────────────┴──────────────┴──────────────┴─────────────┴───────────────┘
(4 rows)

postgres=# select e.*, s.* from employes e join services s on e.service=s.num_service;
┌───────────┬─────────┬─────────────┬──────────────┬──────────────┬─────────────┬───────────────┐
│    nom    │ service │ num_service │ nom_service  │ localisation │ departement │ date_creation │
├───────────┼─────────┼─────────────┼──────────────┼──────────────┼─────────────┼───────────────┤
│ Sharon    │       1 │           1 │ Comptabilité │ Paris        │          75 │ 2006-09-03    │
│ Jennifer  │       2 │           2 │ R&D          │ Rennes       │          40 │ 2009-08-03    │
│ Guillaume │       4 │           4 │ Consultants  │ Nantes       │          44 │ 2009-08-03    │
└───────────┴─────────┴─────────────┴──────────────┴──────────────┴─────────────┴───────────────┘
(3 rows)

postgres=# \gdesc
┌───────────────┬───────────────────────┐
│    Column     │         Type          │
├───────────────┼───────────────────────┤
│ nom           │ text                  │
│ service       │ integer               │
│ num_service   │ integer               │
│ nom_service   │ character varying(20) │
│ localisation  │ character varying(20) │
│ departement   │ integer               │
│ date_creation │ date                  │
└───────────────┴───────────────────────┘
(7 rows)

postgres=# create type es as (nom text, service integer, num_service integer, nom_service varchar(20), localisation varchar(20), departement integer, date_creation date);
CREATE TYPE
postgres=# create or replace function get_es() returns setof es language plpgsql
as
$$
begin
return query select e.*, s.* from employes e join services s on e.service=s.num_service;
end
$$;
CREATE FUNCTION
postgres=# select * from get_es();
┌───────────┬─────────┬─────────────┬──────────────┬──────────────┬─────────────┬───────────────┐
│    nom    │ service │ num_service │ nom_service  │ localisation │ departement │ date_creation │
├───────────┼─────────┼─────────────┼──────────────┼──────────────┼─────────────┼───────────────┤
│ Sharon    │       1 │           1 │ Comptabilité │ Paris        │          75 │ 2006-09-03    │
│ Jennifer  │       2 │           2 │ R&D          │ Rennes       │          40 │ 2009-08-03    │
│ Guillaume │       4 │           4 │ Consultants  │ Nantes       │          44 │ 2009-08-03    │
└───────────┴─────────┴─────────────┴──────────────┴──────────────┴─────────────┴───────────────┘
(3 rows)

Hors ligne

#5 10/12/2018 13:54:48

amine_oxa
Membre

Re : Récupéré résultat d'un SELECT dans une procédure stockée

Merci Beaucoup
tres gentil cette réponse détaillé , donc toujours il faut déclaré tel sortie une 'TABLE' sinon un 'TYPE' c'est ça ?

Hors ligne

#6 10/12/2018 15:18:12

gleu
Administrateur

Re : Récupéré résultat d'un SELECT dans une procédure stockée

Pour ce que vous voulez faire, oui.

Hors ligne

#7 10/12/2018 15:27:56

gleu
Administrateur

Re : Récupéré résultat d'un SELECT dans une procédure stockée

Ceci dit, vous pouvez aussi faire une fonction fourre-tout, mais c'est un peu galère à utliser (ceci est un commentaire totalement subjectif et qui ne concerne que moi smile ). En voici un exemple :

postgres=# create or replace function get_all(r text) returns setof record language plpgsql
as
$$
begin
return query execute r;
end
$$;
CREATE FUNCTION

postgres=# select * from get_all('select * from employes') as emp (nom text, service integer);
┌───────────┬─────────┐
│    nom    │ service │
├───────────┼─────────┤
│ Sharon    │       1 │
│ Jennifer  │       2 │
│ Guillaume │       4 │
│ a         │         │
│ b         │         │
│ c         │         │
└───────────┴─────────┘
(6 rows)

postgres=# \d services
                                            Table "public.services"
┌───────────────┬───────────────────────┬───────────┬──────────┬───────────────────────────────────────────────┐
│    Column     │         Type          │ Collation │ Nullable │                    Default                    │
├───────────────┼───────────────────────┼───────────┼──────────┼───────────────────────────────────────────────┤
│ num_service   │ integer               │           │ not null │ nextval('services_num_service_seq'::regclass) │
│ nom_service   │ character varying(20) │           │          │                                               │
│ localisation  │ character varying(20) │           │          │                                               │
│ departement   │ integer               │           │          │                                               │
│ date_creation │ date                  │           │          │                                               │
└───────────────┴───────────────────────┴───────────┴──────────┴───────────────────────────────────────────────┘
Indexes:
    "services_pkey" PRIMARY KEY, btree (num_service)
Referenced by:
    TABLE "employes_big" CONSTRAINT "employes_big_num_service_fkey" FOREIGN KEY (num_service) REFERENCES services(num_service)

postgres=# select * from get_all('select num_service, nom_service from services') as serv (a integer, b varchar(20));
┌───┬──────────────┐
│ a │      b       │
├───┼──────────────┤
│ 1 │ Comptabilité │
│ 2 │ R&D          │
│ 3 │ Commerciaux  │
│ 4 │ Consultants  │
└───┴──────────────┘
(4 rows)

postgres=# select * from get_all('select e.*, s.* from employes e join services s on e.service=s.num_service')  es (nom text, service integer, num_service integer, nom_service varchar(20), localisation varchar(20), departement integer, date_creation date);
┌───────────┬─────────┬─────────────┬──────────────┬──────────────┬─────────────┬───────────────┐
│    nom    │ service │ num_service │ nom_service  │ localisation │ departement │ date_creation │
├───────────┼─────────┼─────────────┼──────────────┼──────────────┼─────────────┼───────────────┤
│ Sharon    │       1 │           1 │ Comptabilité │ Paris        │          75 │ 2006-09-03    │
│ Jennifer  │       2 │           2 │ R&D          │ Rennes       │          40 │ 2009-08-03    │
│ Guillaume │       4 │           4 │ Consultants  │ Nantes       │          44 │ 2009-08-03    │
└───────────┴─────────┴─────────────┴──────────────┴──────────────┴─────────────┴───────────────┘
(3 rows)

Difficile de savoir si ça correspond mieux à ce que vous attendez vu que vous n'avez fourni pratiquement aucune information sur ce que vous vouliez obtenir (et notamment sur ce que fait SQLServer que ne ferait pas PostgreSQL). Cette méthode (ci-dessus) déplace juste le probème de la spécification des colonnes et des types de données à l'appel de la fonction, plutôt qu'à sa création. Mais du coup, il faut l'indiquer à chaque appel de fonction. Bref, encore une fois, ça dépend beaucoup de votre cas, de votre besoin et de vos pré-requis. Mais c'est une autre méthode tout à fait fonctionnel.

Hors ligne

Pied de page des forums