問題は、あなたの「複雑な構造」がどれほど複雑かということだと思います。
Oracle SQLDeveloperやQuestTOADなどのプログラミングIDEには、データテーブルをCSVファイルにエクスポートするためのウィザードがあります。
複数のテーブルのデータを結合する場合は、ビューを使用するか、SQLステートメントを作成することもできます
select e.ename||','||d.dname
from emp e
join dept d on ( e.deptno = d.deptno )
/
(列にはコンマを含むデータが含まれることが多いため、区切り文字として、より一般的でない文字(または文字のセット)を使用することをお勧めします。)
soemthingを実行するもう1つの簡単な方法は、SQL*PlusのHTMLレポート機能を使用することです。多くのスプレッドシートツールは、適切に構造化されたHTMLとXMLをスナッチなしでインポートできます。詳細をご覧ください。
階層構造やさらに複雑なものをフラット化する場合は、おそらくPL/SQLに移行する必要があります。手作業によるアプローチでは、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;
特にExcel(つまり、.XLSファイル)にエクスポートする場合は、Oracleの組み込み機能を超える必要があります。 PL / SQLからExcelに直接エクスポートするための通常のソリューションは、SYLKAPI用のTomKyteのOWA_SYLKラッパーです。詳細をご覧ください。
これは単一のワークシートで機能します。複数のワークシートにエクスポートする場合は、いくつかの代替ソリューションがあります。
SanjeevSapreにはget_xl_xmlパッケージがあります。名前が示すように、XMLを使用して変換を実行します。詳細をご覧ください。
Jason Bennettは、ExcelXMLドキュメントを生成するPL/SQLオブジェクトを作成しました。詳細をご覧ください。