PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Restituire una query da una funzione?

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;

Chiama così:

SELECT * FROM get_names('name')

Punti principali:

  • Usa RETURNS TABLE , quindi non devi fornire un elenco di nomi di colonne con ogni chiamata.

  • Usa RETURN QUERY , molto più semplice.

  • Qualifica i nomi delle colonne per la tabella per evitare conflitti di denominazione con OUT dal nome identico parametri (comprese le colonne dichiarate con RETURNS TABLE ).

  • Usa una variabile denominata invece di ALIAS . Più semplice, fare lo stesso ed è il modo preferito.

  • Una semplice funzione come questa potrebbe anche essere scritta in 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;