sql >> Base de Datos >  >> RDS >> PostgreSQL

Devolver setof record (tabla virtual) de la función

(Todo esto está probado con postgresql 8.3.7. ¿Tiene una versión anterior? Solo mire su uso de "ALIAS POR $ 1")

CREATE OR REPLACE FUNCTION storeopeninghours_tostring(numeric)
 RETURNS SETOF RECORD AS $$
DECLARE
 open_id ALIAS FOR $1;
 result RECORD;
BEGIN
 RETURN QUERY SELECT '1', '2', '3';
 RETURN QUERY SELECT '3', '4', '5';
 RETURN QUERY SELECT '3', '4', '5';
END
$$;

Si tiene una variable de registro o fila para devolver (en lugar de un resultado de consulta), use "RETURN NEXT" en lugar de "RETURN QUERY".

Para invocar la función, debe hacer algo como:

select * from storeopeninghours_tostring(1) f(a text, b text, c text);

Por lo tanto, debe definir lo que espera que sea el esquema de fila de salida de la función en la consulta. Para evitar eso, puede especificar variables de salida en la definición de la función:

CREATE OR REPLACE FUNCTION storeopeninghours_tostring(open_id numeric, a OUT text, b OUT text, c OUT text)
 RETURNS SETOF RECORD LANGUAGE 'plpgsql' STABLE STRICT AS $$
BEGIN
 RETURN QUERY SELECT '1'::text, '2'::text, '3'::text;
 RETURN QUERY SELECT '3'::text, '4'::text, '5'::text;
 RETURN QUERY SELECT '3'::text, '4'::text, '5'::text;
END
$$;

(No estoy muy seguro de por qué se requieren las conversiones de texto adicionales... ¿'1' es un varchar por defecto tal vez?)