2010-01-10 5 views
6

Simplemente tengo una tabla que contiene una lista de países y sus códigos de país ISO. Estoy envolver la consulta en un (función aka) procedimiento almacenado como:¿Cuál es la forma más fácil de devolver un conjunto de registros de un procedimiento almacenado de PostgreSQL?

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

El error que estoy consiguiendo es:

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

Sé que puedo definir un tipo y luego a través del bucle el conjunto de registros es como un cursor, pero IIRC hay una forma mejor de hacerlo en las versiones más nuevas de PostgreSQL (estoy usando 8.4.3) pero estoy tirando de mi cabello tratando de recordar.


Editar:

Esto funciona:

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

Nota del "devuelve SETOF [nombre de la tabla]". Pero no parece ser el más flexible. Se derrumba si intento devolver una combinación de varias tablas.

+0

posible duplicado de [Declaración de la estructura tuple de un registro en PL/pgSQL] (http://stackoverflow.com/questions/11907563/declaring-the-tuple-structure-of-a-record-in-pl- pgsql) –

Respuesta

8

Usted debe ser capaz de utilizar los parámetros de salida, así:

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

También existe la opción de usar RETURNS TABLE(...) (como se describe in the PostgreSQL Manual), que yo personalmente prefiero:

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; 

Este es efectivamente lo mismo que usar SETOF tablename, pero declara la estructura de la tabla en línea en lugar de hacer referencia a un objeto existente, por lo que se une y eso seguirá funcionando.

Cuestiones relacionadas