Se você estiver usando 10g ou posterior, poderá tornar a função CONCAT() um pouco mais eficiente usando o operador MULTISET UNION:
FUNCTION concat (
iList1 IN ID_ARRAY,
iList2 IN ID_ARRAY
)
RETURN ID_ARRAY IS
lConcat ID_ARRAY;
BEGIN
lConcat := iList1
MULTISET UNION
iList2 A
;
RETURN lConcat;
END concat;
Você pode tornar as coisas mais eficientes preenchendo vários arrays diferentes e, em seguida, chamando MULTISET UNION uma vez para todos eles:
lConcat := iList1
MULTISET UNION
iList2
MULTISET UNION
iList3
MULTISET UNION
iList4;
Usando SQL dinâmico - presumivelmente para substituir os vários
get_idsN()
funções - pode ser uma abordagem que vale a pena investigar, mas provavelmente não lhe dará muito, se alguma coisa, em termos de desempenho aprimorado. Tabelas temporárias não são uma boa ideia, porque têm um desempenho muito ruim em comparação com fazer coisas na memória.