sql >> Databasteknik >  >> RDS >> PostgreSQL

Returnera en fråga från en funktion?

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;

Ring så här:

SELECT * FROM get_names('name')

Huvudpunkter:

  • Använd RETURNS TABLE , så du behöver inte ange en lista med kolumnnamn vid varje samtal.

  • Använd RETURN QUERY , mycket enklare.

  • Tabellkvalificera kolumnnamn för att undvika namnkonflikter med identiskt namngivna OUT parametrar (inklusive kolumner deklarerade med RETURNS TABLE ).

  • Använd en namngiven variabel istället för ALIAS . Enklare, gör detsamma, och det är det bästa sättet.

  • En enkel funktion som denna kan också skrivas i 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;



  1. Hur man kombinerar datum från ett fält med tid från ett annat fält - MS SQL Server

  2. Hur avbryter man en långvarig databasoperation?

  3. Hur skriver du ut resultatet av en PostgreSQL-fråga i CSV- eller TSV-format från kommandoraden?

  4. Hur lagrar man flera alternativ i en enda tabell?