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

¿Devolver una consulta desde una función?

CREATE OR REPLACE FUNCTION get_names(_tname varchar)
  RETURNS TABLE (col_a integer, col_b text) AS
$func$
BEGIN
   RETURN QUERY
   SELECT t.col_a, t.col_b  -- must match RETURNS TABLE
   FROM   mytable t
   WHERE  t.name = _tname;    
END
$func$  LANGUAGE plpgsql;

Llame así:

SELECT * FROM get_names('name')

Puntos principales:

  • Usar RETURNS TABLE , por lo que no tiene que proporcionar una lista de nombres de columna con cada llamada.

  • Utilice RETURN QUERY , mucho más sencillo.

  • Nombres de columna de calificación de tabla para evitar conflictos de nombres con OUT con nombres idénticos parámetros (incluidas las columnas declaradas con RETURNS TABLE ).

  • Use una variable con nombre en lugar de ALIAS . Más simple, haciendo lo mismo, y es la forma preferida.

  • Una función simple como esta también podría escribirse en LANGUAGE sql :

CREATE OR REPLACE FUNCTION get_names(_tname varchar)
  RETURNS TABLE (col_a integer, col_b text) AS
$func$
SELECT t.col_a, t.col_b  --, more columns - must match RETURNS above
FROM   mytable t
WHERE  t.name = $1;
$func$ LANGUAGE sql;