PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Eine Abfrage von einer Funktion zurückgeben?

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;

Rufen Sie so auf:

SELECT * FROM get_names('name')

Hauptpunkte:

  • Verwenden Sie RETURNS TABLE , sodass Sie nicht bei jedem Aufruf eine Liste mit Spaltennamen angeben müssen.

  • Verwenden Sie RETURN QUERY , viel einfacher.

  • Tabellenqualifizieren Sie Spaltennamen, um Namenskonflikte mit identisch benannten OUT zu vermeiden Parameter (einschließlich Spalten, die mit RETURNS TABLE deklariert wurden ).

  • Verwenden Sie eine benannte Variable anstelle von ALIAS . Einfacher, dasselbe tun, und es ist der bevorzugte Weg.

  • Eine einfache Funktion wie diese könnte auch in LANGUAGE sql geschrieben werden :

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;