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 22/09/2006, 16h43   #1
Membre régulier
 
Inscription : avril 2004
Messages : 284
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 284
Points : 75
Points : 75
Par défaut RETURN résultat d'une requête (multicolonne) dans fonction PLPGSQL ?

Bonjour j'ai un nouveau petit problème (il y avait longtemps... ) :

Je voudrais renvoyer via une fonction le résultat d'une requête :

Code :
1
2
3
4
5
6
7
8
9
CREATE FUNCTION select_all(INTEGER) RETURNS RECORD AS '
        DECLARE
         uni ALIAS FOR $1;
         rec RECORD;
        BEGIN
        SELECT INTO rec (SELECT g.gid_id AS GID, g.hugo AS HUGO, g.descr AS GID_DESCR, g.fam AS FAM, g.chrs AS GID_CHRS, h.hs_id AS UNIGENE, s.symb AS SYMB, d.descr AS DESCR, sd.chrs AS NCBI_CHRS FROM gids AS g LEFT OUTER JOIN gids_hs AS ghs USING(gid_id) LEFT OUTER JOIN hs AS h USING(hs_id) LEFT OUTER JOIN symbole_description AS sd USING(gid_id) LEFT OUTER JOIN symbole AS s USING(symb_id) LEFT OUTER JOIN description AS d USING(descr_id) WHERE h.hs_id = uni);
        RETURN rec;
        END;
        ' LANGUAGE 'PLPGSQL';
Mais j'ai une erreur :
ERREUR: La sous-requête doit renvoyer une seule colonne [...]

Je n'arrive pas à manipuler des requêtes au sein d'une fonction, soit afin de renvoyer la requête entière, soit pour extraire les différents élements de ces requêtes.

Merci si vous pouvez m'aider.

Bonne soirée,

C. Tobini
ctobini est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/09/2006, 11h04   #2
Membre chevronné
 
Avatar de Spoutnik
 
Homme
Inscription : octobre 2003
Messages : 668
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : Etats-Unis

Informations forums :
Inscription : octobre 2003
Messages : 668
Points : 746
Points : 746
Citation:
CREATE FUNCTION select_all(INTEGER) RETURNS SETOF RECORD AS '
DECLARE
uni ALIAS FOR $1;
rec RECORD;
BEGIN
SELECT INTO rec
g.gid_id AS GID,
g.hugo AS HUGO,
g.descr AS GID_DESCR,
g.fam AS FAM,
g.chrs AS GID_CHRS,
h.hs_id AS UNIGENE,
s.symb AS SYMB,
d.descr AS DESCR,
sd.chrs AS NCBI_CHRS
FROM gids AS g
LEFT OUTER JOIN gids_hs ghs USING(gid_id)
LEFT OUTER JOIN hs h USING(hs_id)
LEFT OUTER JOIN symbole_description sd USING(gid_id)
LEFT OUTER JOIN symbole s USING(symb_id)
LEFT OUTER JOIN description d USING(descr_id)
WHERE h.hs_id = uni;

RETURN rec;
END;
' LANGUAGE 'PLPGSQL';
Dejà, pas de 'AS' pour les alias de tables.
Ensuite, la syntaxe de SELECT INTO est :

Citation:
SELECT INTO variable
*
FROM
....
et non pas :
Citation:
SELECT INTO variable
(select *
FROM
...)
Ensuite le 'RETUNRS SETOF ' devrait te permettre de renvoyer plusieurs lignes.

En espérant que ca te débloque!
++
__________________
Two beer or not two beer. (Shakesbeer)
Question technique par MP => poubelle!
Spoutnik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/09/2006, 11h39   #3
Membre régulier
 
Inscription : avril 2004
Messages : 284
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 284
Points : 75
Points : 75
Bonjour et merci beaucoup de la réponse, elle a pu m'aiguiller vers une solution, j'ai néanmoins un petit problème, j'ai réécris ma fonction :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
CREATE FUNCTION select_all(INTEGER) RETURNS SETOF RECORD AS '
        DECLARE
         uni ALIAS FOR $1;
         rec RECORD;
        BEGIN
        FOR rec IN SELECT g.gid_id AS GID, g.hugo AS HUGO, g.descr AS GID_DESCR, g.fam AS FAM, g.chrs AS GID_CHRS, h.hs_id AS UNIGENE, s.symb AS SYMB, d.descr AS DESCR, sd.chrs AS NCBI_CHRS FROM gids AS g LEFT OUTER JOIN gids_hs AS ghs USING(gid_id) LEFT OUTER JOIN hs AS h USING(hs_id) LEFT OUTER JOIN symbole_description AS sd USING(gid_id) LEFT OUTER JOIN symbole AS s USING(symb_id) LEFT OUTER JOIN description AS d USING(descr_id) WHERE h.hs_id = uni
        LOOP
         RETURN NEXT rec;
        END LOOP;
         RETURN;
        END;
        ' LANGUAGE 'PLPGSQL';
Puis :

Code :
SELECT * FROM select_all('523463')
Mais j'ai une erreur :

ERREUR: Une colonne liste est requise pour les fonctions renvoyant "record"

J'ai jeté un oeil sur le net, mais je ne vois pas quel peut être le problème, il y a plusieurs exemple mais rien n'est abordé concernant ceci.

Verrais-tu d'où peut provenir cette erreur ?
ctobini est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/09/2006, 12h18   #4
Membre chevronné
 
Avatar de Spoutnik
 
Homme
Inscription : octobre 2003
Messages : 668
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : Etats-Unis

Informations forums :
Inscription : octobre 2003
Messages : 668
Points : 746
Points : 746
essaye en remplacant les noms de colonnes par *
juste pour vérifier ...
__________________
Two beer or not two beer. (Shakesbeer)
Question technique par MP => poubelle!
Spoutnik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/09/2006, 13h53   #5
Membre régulier
 
Inscription : avril 2004
Messages : 284
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 284
Points : 75
Points : 75
Le remplacement de noms de colonnes par * n'a pas fonctionné, en revanche j'ai déclaré la sortie :

Code :
SELECT * FROM select_all('523463') AS (gid_id int, hugo text, descr text, fam text, chrs text, hs_id int, symb text, descr2 text, chrs2 text);
Et la ça fonctionne.

Apparement on peut aussi déclarer le type et créer un enregistrement en tant que ce type, de cette manière la requête s'effectue comme sur une table classique.

Merci beaucoup pour ton aide et bonne journée.

C. Tobini
ctobini 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 09h02.


 
 
 
 
Partenaires

Hébergement Web