Vous pouvez utiliser un curseur , mais cela très peu pratique pour calculer un minimum.
J'utiliserais une table temporaire à cet effet, et transmettez le nom de la table à utiliser en SQL dynamique :
CREATE OR REPLACE FUNCTION f_min_id(_tbl regclass, OUT min_id int) AS
$func$
BEGIN
EXECUTE 'SELECT min(id) FROM ' || _tbl
INTO min_id;
END
$func$ LANGUAGE plpgsql;
Appel :
CREATE TEMP TABLE foo ON COMMIT DROP AS
SELECT id, name
FROM users
LIMIT 50;
SELECT f_min_id('foo');
Points majeurs
-
Le premier paramètre est de type
regclass
pour empêcher l'injection SQL. Plus d'informations dans cette réponse connexe sur dba. SE . -
J'ai créé la table temporaire
ON COMMIT DROP
pour limiter sa durée de vie à la transaction en cours. Peut être ou ne pas être ce que vous voulez. -
Vous pouvez étendre cet exemple pour prendre plus de paramètres. Rechercher des exemples de code pour SQL dynamique avec
EXECUTE
.