Ceci est possible pour les fonctions de retour RECORD.
CREATE FUNCTION calculation(how_many integer) RETURNS SETOF RECORD
LANGUAGE plpgsql
AS $fff$
BEGIN
IF how_many = 1
THEN RETURN QUERY SELECT 'foo'::text;
ELSIF how_many = 2
THEN RETURN QUERY SELECT 'foo'::text, 'bar'::text;
END IF;
END;
$fff$
;
Et maintenant vous pouvez faire :
jbet=> SELECT * FROM calculation(1) AS f(first_col text);
first_col
-----------
foo
(1 row)
jbet=> SELECT * FROM calculation(2) AS f(first_col text, second_col text);
first_col | second_col
-----------+------------
foo | bar
(1 row)
Le très sérieux L'inconvénient est que chaque fois que vous appelez la fonction, vous devez définir un ensemble de colonnes renvoyées, donc je ne pense pas que vous trouverez cette réponse utile :)
Quoi qu'il en soit, Postgresql doit connaître le type renvoyé de chaque SELECT avant il exécute la requête, vous devez donc définir les colonnes d'une manière ou d'une autre.
La valeur de retour JSON peut être une réponse raisonnable si vous voulez simplement les données et que vous ne vous souciez pas s'il y a des colonnes séparées ou non.