PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Renvoyer une requête à partir d'une fonction ?

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;

Appelez comme ceci :

SELECT * FROM get_names('name')

Points principaux :

  • Utilisez RETURNS TABLE , vous n'avez donc pas à fournir une liste de noms de colonnes à chaque appel.

  • Utilisez RETURN QUERY , beaucoup plus simple.

  • Noms de colonne qualifiés de table pour éviter les conflits de nom avec OUT de même nom paramètres (y compris les colonnes déclarées avec RETURNS TABLE ).

  • Utiliser une variable nommée au lieu de ALIAS . Plus simple, faire la même chose, et c'est la méthode préférée.

  • Une fonction simple comme celle-ci pourrait également être écrite 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;