如何将Oracle数据库表导出为CSV文件?

我需要从一个Oracle 11g release 1数据库中检索特定的数据,并将其提供为一个或多个CSV文件。这些数据存储在多个表和/或视图中。所有这些操作都应该通过命令行完成。 对此,最好的方法是什么?
4个回答

Arun, 现在可以从Oracle SQL Developer 4.1 EA2 (4.1.0.18.37)下载sqlcl了,你可以像以前那样频繁使用它,就像著名的sqlplus一样。sqlcl还有一个用于设置csv输出格式的选项。
set sqlformat csv
spool x.csv
select * from yourtable[s];
spool off

想要了解有关sqlcl的更多信息,请查看Kris的博客

在sqlcl出现之前,最简单的方法是使用APEX并将报表导出为csv格式。 在普通的sqlplus中,您可以通过以下方式实现:

set lines 9999 -- the appropriate size
set head off  -- no header lines
set colsep ';' --column separator to ;
set pages 0 -- no pages
set feed off
select your data;
spool to_tofile
/
spool off
如果结果需要写入应用服务器或客户端,这种方法效果最好。如果必须写入数据库服务器,则utl_file可能是更好的选择。 罗纳德。

你应该查看内置的UTL_FILE包。有几种方法可以使用它。
  1. 你可以编写任意数量的在包中使用UTL_FILE包来写入任意数量文件的过程。然后可以从几乎任何应用程序包括SQL*Plus调用这些过程。

  2. 你可以编写一个PL/SQL脚本来执行相同的工作,并通过在命令行上指定@脚本名来从SQL*Plus命令行调用脚本。

  3. 你可以直接将使用UTL_FILE的代码块粘贴到SQL*Plus中,但是这只适用于一次性导出,即使如此,也可能不是最佳选择。

在最简单的情况下,使用UTL_FILE的文件导出将由调用FOPEN,一个或多个调用PUT_LINE和一个调用FCLOSE组成。

如果性能是一个问题,您可能需要考虑来自供应商的工具。 我已经评估了来自BMC、Wisdomforce、CoSort和DBCrane的工具。它们都比spool、utl_file或外部表快得多。我们正在使用DBCrane,因为我的老板不想在许可证上花太多钱。

你可以使用Python和cx_Oracle模块将数据以CSV格式提取到磁盘上。 以下是使用cx_Oracle连接到Oracle数据库的方法:
constr='scott/tiger@localhost:1521/ORCL12'
con = cx_Oracle.connect(constr)
cur = con.cursor()
数据获取后,您可以遍历Python列表并以CSV格式保存数据。
for i, chunk in enumerate(chunks(cur)):
    f_out.write('\n'.join([column_delimiter.join(row[0]) for row in chunk]))
    f_out.write('\n')
我在编写TableHunter-For-Oracle时使用了这种方法。