Lists: | Postg스포츠 토토 결과SQL |
---|
From: | Sébastien Dinot <sdinot(at)april(dot)org> |
---|---|
To: | pgsql-fr-generale(at)postgresql(dot)org |
Subject: | Pb de type composite |
Date: | 2007-04-11 20:37:57 |
Message-ID: | 20070411203757.GB6225@achille.maison |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | Postg스포츠 토토 결과SQL |
Bonjour à tous,
J'ai écrit quelques procédures stockées en SQL que j'ai testées sous
PostgreSQL 8.1. Elles fonctionnent à merveille. Les mêmes procédures
sous PosgreSQL 7.4 génèrent une erreur et je ne comprends pas
pourquoi.
Voici les éléments :
- La requête porte sur une vue nommée « adherent ».
- La procédure stockée est la suivante :
====================================================================
CREATE FUNCTION cotisation_en_retard (VARCHAR) RETURNS SETOF adherent_a_contacter AS
'
SELECT identite,
email,
echeance,
ecart
FROM adherent
WHERE categorie = $1
AND ecart < 0
AND anciennete > 30
ORDER BY echeance ASC;
' LANGUAGE 'sql';
====================================================================
- Le type de données composite renvoyé par la procédure est défini ainsi :
====================================================================
CREATE TYPE adherent_a_contacter AS
(
identite VARCHAR(100),
email VARCHAR(100),
echeance DATE,
ecart INTEGER
);
====================================================================
Sous PostgreSQL 8.1, les requêtes suivantes fonctionnent :
======================================================================
adherents=> SELECT * FROM cotisation_en_retard('individu');
identite | email | echeance | ecart
-----------------+------------------+------------+-------
Sébastien DINOT | sdinot(at)april(dot)org | 2007-03-10 | -32
(1 ligne)
adherents=> SELECT cotisation_en_retard('individu');
cotisation_en_retard
---------------------------------------------------------
("Sébastien DINOT",sdinot(at)april(dot)org,2007-03-10,-32)
(1 ligne)
======================================================================
Sous PostgreSQL 7.4, la même requête donne :
======================================================================
adherents=> SELECT * FROM cotisation_en_retard('individu');
ERROR: query-specified return row and actual function return row do not match
adherents=> SELECT cotisation_en_retard('individu');
ERROR: cannot display a value of type record
======================================================================
Bien évidemment, lorsque j'injecte mon schéma et mes procédure dans la
base fraîchement créée, PostgreSQL ne me retourne ni avertissement ni
erreur.
Avez-vous une idée de ce qui cloche et de la manière d'y remédier ?
Je vous remercie par avance,
A++, Sébastien
--
Sébastien Dinot, sdinot(at)april(dot)org
Secrétaire de l'APRIL (http://www.april.org)
Association pour la Promotion et la Recherche en Informatique Libre
From: | Sébastien Dinot <sdinot(at)april(dot)org> |
---|---|
To: | pgsql-fr-generale(at)postgresql(dot)org |
Subject: | [RESOLU] Re: Pb de type composite |
Date: | 2007-04-11 21:12:47 |
Message-ID: | 20070411211247.GA6522@achille.maison |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-fr-generale |
Bon, finalement, j'ai trouvé. Il faut faire coïncider parfaitement le
type de chaque valeur retournée par la procédure avec le membre
équivalent du type composite. En ce qui me concerne, cela passe par
deux conversions explicites :
====================================================================
CREATE TYPE adherent_a_contacter AS
(
identite VARCHAR(100),
email VARCHAR(100),
echeance DATE,
ecart INTEGER
);
CREATE FUNCTION cotisation_en_retard (VARCHAR) RETURNS SETOF adherent_a_contacter AS
'
SELECT identite::VARCHAR(100),
email::VARCHAR(100),
echeance,
ecart
FROM adherent
WHERE categorie = $1
AND ecart < 0
AND anciennete > 30
ORDER BY echeance ASC;
' LANGUAGE 'sql';
====================================================================
Cette modification résout le problème de la requête :
SELECT * FROM cotisation_en_retard('individu');
Mais pas celui de la requête :
SELECT cotisation_en_retard('individu');
Ceci étant, seule la première requête m'importe vraiment.
Désolé pour le dérangement,
Sébastien
--
Sébastien Dinot, sdinot(at)april(dot)org
Secrétaire de l'APRIL (http://www.april.org)
Association pour la Promotion et la Recherche en Informatique Libre