No PostgreSQL, existem Set-Returning-Functions (SRF). Mas eu estou querendo saber se existe também uma maneira de passar uma relação desconhecida em uma função? Em outras palavras, é possível escrever Set-Taking-Functions (por assim dizer), além de passar o nome do conjunto de tuplas?
Obviamente, existe um SQL dinâmico onde se pode passar um nome de tabela. Com pgRouting , pode-se até usar uma string inteira para passar o conjunto de tuplas para a função:
SELECT * FROM shortest_path('
SELECT gid AS id,
start_id::int4 AS source,
end_id::int4 AS target,
shape_leng::float8 AS cost
FROM network',
1,
5110,
false,
false);
Mas a string SQL no parâmetro não parece muito segura. A outra possibilidade é armazenar o resultado em uma tabela temporária primeiro e passar o nome da tabela temporária, o que parece ser contra a ideia de programação baseada em conjuntos em SQL.
Existem maneiras alternativas de passar um conjunto para uma função?
Você pode definir um tipo de registro que representa uma tupla do que deseja passar e, em seguida, passar uma matriz desse tipo:
Em seguida, passe um array para sua função:
O parâmetro da função precisa ser definido como
path_info[]
:Dependendo do que você está fazendo com esses valores, uma função que recebe um único registro usado com uma junção lateral pode ser mais eficiente:
Algo como: