Estou usando o Postgraphile, que permite criar funções que usam conjuntos de linhas como argumentos. Por exemplo, tenho uma função que usa um system_versions
conjunto de linhas como parâmetro:
CREATE OR REPLACE FUNCTION public.system_versions_edition_versions(
system_version system_versions,
system_title character varying DEFAULT NULL::character varying
)
RETURNS SETOF edition_versions
LANGUAGE sql
STABLE STRICT SECURITY DEFINER
AS $function$
SELECT ev.*
FROM public.edition_versions ev
INNER JOIN public.editions e ON ev.edition_id = e.id
INNER JOIN public.systems s ON e.system_id = s.id
INNER JOIN public.system_versions sv ON s.id = sv.system_id
WHERE sv.id = system_version.id
AND (
system_title IS NULL
OR
sv.title = system_title
)
;
$function$
;
Normalmente essas funções são chamadas pelo Postgraphile, mas preciso chamar essa manualmente para testar... e não consigo descobrir como fornecer o parâmetro.
Quando eu tento:
SELECT public.system_versions_edition_versions(public.system_versions);
Eu recebo:
ERROR: missing FROM-clause entry for table "public"
LINE 1: select public.system_versions_edition_versions(public.system...
Mas quando tento SELECT a tabela...
SELECT public.system_versions_edition_versions(SELECT * FROM public.
system_versions);
Eu recebo:
ERROR: syntax error at or near "select"
LINE 1: select public.system_versions_edition_versions(select * from...
Quando tenho uma função com um parâmetro "row set", alguém pode explicar como forneço esse parâmetro?
Parece que
system_version
o tipo de argumento é linha em vez de conjunto de linhas. Caso contrário,sv.id = system_version.id
causaria um erro. Comopublic.system_versions
é uma tabela, entãosystem_versions
é seu tipo de linha, comosystem_versions%rowtype
em PL/pgSQL.Você pode chamá-lo usando uma subconsulta escalar como esta:
ou
Você também pode considerar usar uma junção lateral .