Tom Kyte fornisce un modo molto conveniente per farlo e funziona da Oracle 9i, con una funzione di aggregazione personalizzata. Aggrega con virgole, ma puoi modificare il corpo della funzione per le pipe.
A partire da Oracle 11g, puoi fare:
SELECT LISTAGG(column, separator) WITHIN GROUP (ORDER BY field)
FROM dataSource
GROUP BY grouping columns
Questa pagina web fornisce metodi aggiuntivi tra cui quello che hai elencato e che in effetti non è molto efficiente.