¿Es posible devolver varios conjuntos de resultados de una función de Postgres, como en MSSQL:función PostgreSQL devolver varios conjuntos de resultados
CREATE PROCEDURE test
AS
SELECT * FROM first_table
SELECT * FROM second_table
¿Es posible devolver varios conjuntos de resultados de una función de Postgres, como en MSSQL:función PostgreSQL devolver varios conjuntos de resultados
CREATE PROCEDURE test
AS
SELECT * FROM first_table
SELECT * FROM second_table
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)
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 :)
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 ALL
UNION
.]
Nitpicking, pero UNION ALL sería más rápido (no hay "| sort | uniq"), pero devolverá duplicados si los hubiera. – tommym
@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). –
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
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.
¿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. –
@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. –
Solo usa 1 tabla, la tabla "cliente". ¡La pregunta es sobre conjuntos de resultados múltiples! – llouk