VARIADIC
Comme @mu fourni, VARIADIC est votre ami. Un autre détail important :
Vous pouvez également appeler une fonction en utilisant un VARIADIC paramètre avec un type de tableau directement. Ajouter le mot clé VARIADIC dans l'appel de fonction :
SELECT * FROM f_test(VARIADIC '{1, 2, 3}'::int[]); est équivalent à :
SELECT * FROM f_test(1, 2, 3);
Autres conseils
Dans Postgres 9.1 ou version ultérieure right() avec un négatif longueur est plus rapide et plus simple pour supprimer les premiers caractères d'une chaîne :
right(j.status, -2)
est équivalent à :
substring(j.status, 3, char_length(jobs.status))
Vous avez j."DeleteFlag" ainsi que j.DeleteFlag (sans les guillemets doubles) dans votre requête. Ceci est probablement incorrect. Voir :
- Erreur PostgreSQL :la relation existe déjà
"DeleteFlag" = '0' indique un autre problème. Contrairement aux autres SGBDR, Postgres prend correctement en charge le boolean Type de données. Si le drapeau contient boolean données (true / false / NULL ) utilisez le boolean taper. Un type de caractère comme text serait inapproprié / inefficace.
Fonction correcte
Vous n'avez pas besoin de PL/pgSQL ici. Vous pouvez utilisez une fonction SQL plus simple :
CREATE OR REPLACE FUNCTION f_test(VARIADIC int[])
RETURNS TABLE (id int, reference int, job_title text, status text)
LANGUAGE sql AS
$func$
SELECT j.id, j.reference, j.job_title
, ltrim(right(j.status, -2)) AS status
FROM company c
JOIN job j USING (id)
WHERE c.active
AND NOT c.delete_flag
AND NOT j.delete_flag
AND (j.id = ANY($1) OR '{-1}'::int[] = $1)
ORDER BY j.job_title
$func$;
db<>jouez ici
Vieux sqlfiddle