2009-04-16 21 views

Respuesta

-1

Sí.

Ejemplo:

test=# create function x() returns setof integer language plpgsql as $$ begin return next 1; return next 2; end $$; 
CREATE FUNCTION 
test=# select * from x(); 
x 
--- 
1 
2 
(2 rows) 

Por supuesto, puede utilizar una tabla/vista existente o un tipo personalizado para el tipo devuelto.

Ejemplo utilizando el lenguaje SQL:

test=# create table customer (name varchar, birth_date date); 
CREATE TABLE 
test=# create function y() returns setof customer language sql as $$ 
select * from customer 
union all 
select * from customer 
$$; 
CREATE FUNCTION 
test=# insert into customer values ('joe', now()::date); 
INSERT 0 1 
test=# insert into customer values ('jill', now()::date); 
INSERT 0 1 
test=# select * from y(); 
name | birth_date 
------+------------ 
joe | 2009-04-16 
jill | 2009-04-16 
joe | 2009-04-16 
jill | 2009-04-16 
(4 rows) 

See here for doc

+2

Solo usa 1 tabla, la tabla "cliente". ¡La pregunta es sobre conjuntos de resultados múltiples! – llouk

7
CREATE OR REPLACE FUNCTION "pr_GetCustomersAndOrders"() 
RETURNS SETOF refcursor AS 
$BODY$DECLARE 
customerRC refcursor; 
orderRC refcursor; 
BEGIN 
open customerRC FOR 
SELECT * FROM customers; 
RETURN NEXT customerRC; 

open orderRC FOR 
SELECT * FROM orders; 
RETURN NEXT orderRC; 
RETURN; 
END;$BODY$ 
LANGUAGE 'plpgsql' VOLATILE; 
ALTER FUNCTION "pr_GetCustomersAndOrders"() OWNER TO postgres; 

I.o.w. utilizando refcursors :)

+2

Ajustándolo a mis tablas obtengo: 'SELECCIONE [* FROM]" pr_GetCustomersAndOrders "(); pr_GetCustomersAndOrders -------------------------- ' Uso de psql 9.1. – valid

+2

Igual aquí también – llouk

3

Si first_table y second_table tienen el mismo diseño, también puede simplemente usar

SELECT * FROM first_table WHERE ... 
UNION ALL 
SELECT * FROM second_table WHERE ... 

[EDIT: Gracias a un comentarista (cuyo nombre probablemente no es "nula" :)) para señalando que es más rápido que UNION ALLUNION.]

+3

Nitpicking, pero UNION ALL sería más rápido (no hay "| sort | uniq"), pero devolverá duplicados si los hubiera. – tommym

+1

@null: Buen punto; actualizado. (Me doy cuenta de que su nombre probablemente no es "nulo", parece que un error reciente de SO lo causa. Pude solucionarlo editando el campo superior en mi página de perfil). –

+3

Sí, pero ¿qué pasa con las consultas que no regresan? los mismos diseños? Es bastante limitado si necesitamos obtener muchos conjuntos. Yo solía tener el procedimiento almacenado en SQL Server que devuelve más de 10 conjuntos de resultados. ¿Algo así en PostgreSQL? – MaxiWheat

13

Un simple manera ha existido desde PostgreSQL 8.3 (mucho antes de t Se le pidió a su pregunta):

CREATE FUNCTION test() 
    RETURNS SETOF first_table AS 
$func$ 
BEGIN 

RETURN QUERY 
SELECT * FROM first_table; 

RETURN QUERY 
SELECT * FROM second_table; -- has to return same rowtype as first_table! 

END 
$func$ LANGUAGE plpgsql; 

Llamar:

SELECT * FROM test(); 

Véase el manual on RETURN QUERY.

+1

¿para qué tipos de filas diferentes? ¿Hay alguna solución? que no sea cursor Estoy buscando obtener dos conjuntos de registros en una sola llamada. –

+1

@UdeetSolanki: No es posible como resultado directo de una función. Hay varias formas de hacerlo: con cursores, tablas temporales, tipos de documentos como 'json'. Te sugiero que hagas una nueva pregunta, los comentarios no son el lugar. –

Cuestiones relacionadas