Na funkci plpgsql není nic špatného pro něco trochu složitějšího. Jedinou situací, kdy může dojít ke zhoršení výkonu, je situace, kdy je vnořena funkce plpgsql, protože plánovač dotazů nemůže dále optimalizovat obsažený kód v kontextu vnějšího dotazu, což jej může nebo nemusí zpomalit.
Další podrobnosti později odpověď:
- Rozdíl mezi jazykem sql a jazykem plpgsql ve funkcích PostgreSQL
V tomto případě je to mnohem jednodušší než spousta CASE
klauzule v dotazu:
CREATE OR REPLACE FUNCTION get_stuff(_param text, _orderby text, _limit int)
RETURNS SETOF stuff AS
$func$
BEGIN
RETURN QUERY EXECUTE '
SELECT *
FROM stuff
WHERE col = $1
ORDER BY ' || quote_ident(_orderby) || ' ASC
LIMIT $2'
USING _param, _limit;
END
$func$ LANGUAGE plpgsql;
Volejte:
SELECT * FROM get_stuff('hello', 'col2', 100);
Poznámky
Použijte RETURN QUERY EXECUTE
vrátit výsledky dotazu najednou.
Použijte quote_ident()
pro identifikátory na ochranu před SQLi.
Nebo format()
na cokoliv složitějšího. Viz:
- Název tabulky jako parametr funkce PostgreSQL
Předejte hodnoty parametrů pomocí USING
klauzule, aby se zabránilo přetypování, citacím a SQLi ještě jednou.
Dejte pozor, abyste nevytvářeli konflikty názvů mezi parametry a názvy sloupců. Před názvy parametrů jsem přidal podtržítko (_
) v příkladu. Jen moje osobní preference.
Vaše druhá funkce po úpravě nemůže fungovat, protože vracíte pouze parent
zatímco návratový typ je deklarován SETOF stuff
. Můžete deklarovat jakékoli návratový typ se vám líbí, ale skutečné návratové hodnoty musí odpovídat deklaraci. Možná budete chtít použít RETURNS TABLE
za to.