Toutes les réponses existantes sont dépassées ou étaient inefficaces au départ.
En supposant que vous voulez retourner trois integer
colonnes.
Fonction PL/pgSQL
Voici comment procéder avec les PL/pgSQL modernes (PostgreSQL 8.4 ou plus) :
CREATE OR REPLACE FUNCTION f_foo() -- (open_id numeric) -- parameter not used
RETURNS TABLE (a int, b int, c int) AS
$func$
BEGIN
RETURN QUERY VALUES
(1,2,3)
, (3,4,5)
, (3,4,5)
;
END
$func$ LANGUAGE plpgsql IMMUTABLE ROWS 3;
Dans Postgres 9.6 ou plus, vous pouvez également ajouter l'option PARALLEL SAFE
.
Appelez :
SELECT * FROM f_foo();
Principaux points
-
Utilisez RETURNS TABLE
pour définir un type de ligne ad-hoc à retourner.
Ou RETURNS SETOF mytbl
pour utiliser un type de ligne prédéfini.
-
Utilisez RETURN QUERY
pour renvoyer plusieurs lignes avec une seule commande.
-
Utilisez un VALUES
expression pour saisir manuellement plusieurs lignes. Il s'agit d'un langage SQL standard qui existe déjà pour toujours .
-
Si vous avez réellement besoin d'un paramètre, utilisez un nom de paramètre (open_id numeric)
au lieu de ALIAS
ce qui est découragé . Dans l'exemple, le paramètre n'a pas été utilisé et juste du bruit ...
-
Il n'est pas nécessaire de mettre entre guillemets des identifiants parfaitement légaux. Les guillemets ne sont nécessaires que pour forcer des noms autrement illégaux (majuscules mixtes, caractères illégaux ou mots réservés).
-
La volatilité de la fonction peut être IMMUTABLE
puisque le résultat ne change jamais.
-
ROWS 3
est facultatif, mais puisque nous connaître combien de lignes sont retournées, nous pourrions aussi bien le déclarer à Postgres. Cela peut aider le planificateur de requêtes à choisir le meilleur plan.
SQL simple
Pour un cas simple comme celui-ci, vous pouvez utiliser une instruction SQL simple à la place :
VALUES (1,2,3), (3,4,5), (3,4,5)
Ou, si vous voulez (ou devez) définir des noms et des types de colonnes spécifiques :
SELECT *
FROM (
VALUES (1::int, 2::int, 3::int)
, (3, 4, 5)
, (3, 4, 5)
) AS t(a, b, c);
Fonction SQL
Vous pouvez l'intégrer dans un simple Fonction SQL à la place :
CREATE OR REPLACE FUNCTION f_foo()
RETURNS TABLE (a int, b int, c int) AS
$func$
VALUES (1, 2, 3)
, (3, 4, 5)
, (3, 4, 5);
$func$ LANGUAGE sql IMMUTABLE ROWS 3;