PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Renvoie setof record (table virtuelle) de la fonction

(Tout cela est testé avec postgresql 8.3.7-- avez-vous une version antérieure ? En regardant simplement votre utilisation de "ALIAS POUR $1")

CREATE OR REPLACE FUNCTION storeopeninghours_tostring(numeric)
 RETURNS SETOF RECORD AS $$
DECLARE
 open_id ALIAS FOR $1;
 result RECORD;
BEGIN
 RETURN QUERY SELECT '1', '2', '3';
 RETURN QUERY SELECT '3', '4', '5';
 RETURN QUERY SELECT '3', '4', '5';
END
$$;

Si vous avez une variable d'enregistrement ou de ligne à renvoyer (au lieu d'un résultat de requête), utilisez "RETURN NEXT" plutôt que "RETURN QUERY".

Pour invoquer la fonction, vous devez faire quelque chose comme :

select * from storeopeninghours_tostring(1) f(a text, b text, c text);

Vous devez donc définir ce que vous attendez du schéma de ligne de sortie de la fonction dans la requête. Pour éviter cela, vous pouvez spécifier des variables de sortie dans la définition de la fonction :

CREATE OR REPLACE FUNCTION storeopeninghours_tostring(open_id numeric, a OUT text, b OUT text, c OUT text)
 RETURNS SETOF RECORD LANGUAGE 'plpgsql' STABLE STRICT AS $$
BEGIN
 RETURN QUERY SELECT '1'::text, '2'::text, '3'::text;
 RETURN QUERY SELECT '3'::text, '4'::text, '5'::text;
 RETURN QUERY SELECT '3'::text, '4'::text, '5'::text;
END
$$;

(vous ne savez pas vraiment pourquoi les ::text casts supplémentaires sont nécessaires... '1' est peut-être un varchar par défaut ?)