Suponho que o problema seja, quão complexa é a sua "estrutura complexa"?
IDEs de programação como Oracle SQL Developer ou Quest TOAD possuem assistentes para exportar tabelas de dados para arquivos CSV.
Se você quiser juntar dados de várias tabelas, você pode usar uma visão ou até mesmo escrever uma instrução SQL
select e.ename||','||d.dname
from emp e
join dept d on ( e.deptno = d.deptno )
/
(lembrando que as colunas geralmente podem conter dados que incluem vírgulas, então você pode querer usar um caractere mais incomum - ou conjunto de caracteres - como seu separador.)
Outra maneira rápida de fazer algo é usar a função de relatório HTML do SQL*Plus. Muitas ferramentas de planilha podem importar HTML e XML bem estruturados sem problemas. Descubra mais.
Se você quiser achatar uma estrutura hierárquica ou algo ainda mais complicado, provavelmente precisará mudar para PL/SQL. Uma abordagem feita à mão usaria uma variante da instrução acima ajustada para usar UTL_FILE:
declare
csv_fh utl_file.filetype;
begin
csv_fh := utl_file.fopen('C:\temp', 'data_export.csv', 'W');
for r in ( select e.ename, d.dname
from emp e
join dept d on ( e.deptno = d.deptno )
) loop
utl_file.put_line(csv_fh, r.ename||'|'||r.dname;
end loop;
utl_file.fclose(csv_fh);
end;
Se você deseja exportar especificamente para o Excel (ou seja, um arquivo .XLS), precisará ir além dos integrados do Oracle. A solução usual para exportar diretamente do PL/SQL para o Excel é o wrapper OWA_SYLK de Tom Kyte para a API SYLK. Descubra mais.
Isso funciona com planilhas individuais. Se você deseja exportar para várias planilhas, existem algumas soluções alternativas.
Sanjeev Sapre tem seu pacote get_xl_xml. Como o nome sugere, ele usa XML para realizar a transformação. Descubra mais.
Jason Bennett escreveu um objeto PL/SQL que gera um documento XML do Excel. Descubra mais.