2010-01-10 4 views
6

J'ai simplement une table qui contient une liste de pays et leurs codes pays ISO. J'enroulant la requête dans une procédure stockée (fonction alias) tels que:Quel est le moyen le plus simple de renvoyer un jeu d'enregistrements à partir d'une procédure stockée PostgreSQL?

CREATE OR REPLACE FUNCTION get_countries(
        ) RETURNS setof record AS $$ 
     SELECT country_code, country_name FROM country_codes 
$$ LANGUAGE sql; 

L'erreur que je reçois est:

ERROR: a column definition list is required for functions returning "record" 

Je sais que je peux définir un type et une boucle à travers le jeu d'enregistrements ressemble à un curseur, mais IIRC il y a une meilleure façon de le faire avec les versions plus récentes de PostgreSQL (j'utilise 8.4.3) mais je m'arrache les cheveux en essayant de m'en souvenir.


Edit:

Cela fonctionne:

CREATE OR REPLACE FUNCTION get_countries(
        ) RETURNS setof country_codes AS $$ 
     SELECT country_code, country_name FROM country_codes 
$$ LANGUAGE sql; 

Notez le "RETOURS SETOF [nom de la table]". Mais cela ne semble pas être le plus flexible. Il tombe en morceaux si je tente de retourner une jointure de plusieurs tables.

+0

duplication possible de [Déclaration de la structure de ligne d'un enregistrement dans PL/pgSQL] (http://stackoverflow.com/questions/11907563/declaring-the-tuple-structure-of-a-record-in-pl- pgsql) –

Répondre

8

Vous devriez être en mesure d'utiliser les paramètres de sortie, comme ceci:

CREATE OR REPLACE FUNCTION get_countries(country_code OUT text, country_name OUT text) 
RETURNS setof record 
AS $$ SELECT country_code, country_name FROM country_codes $$ 
LANGUAGE sql; 
10

Il y a aussi la possibilité d'utiliser RETURNS TABLE(...) (comme décrit in the PostgreSQL Manual), que je préfère personnellement:

CREATE OR REPLACE FUNCTION get_countries() 
RETURNS TABLE(
    country_code text, 
    country_name text 
) 
AS $$ 
    SELECT country_code, country_name FROM country_codes 
$$ LANGUAGE sql; 

Cette est effectivement identique à l'utilisation de SETOF tablename, mais déclare la structure de la table inline au lieu de référencer un objet existant, ainsi les jointures et autres fonctionneront toujours.

Questions connexes