最近有个需求,从Oracle导出数据到Excel。
针对这个需求,有多种实现方式,例如spool、utl_file、PLSQL Developer导出、Java等语言直连数据库操作,没有最佳方案,只有最合适的。
(1)spool
spool是Oracle提供的命令行数据导出工具。它可以将select数据库的内容写到文件中,同时可以设置一些格式,控制输出的结构,只需要select前执行"spool 文件路径和名称",即可将select的内容,输出到这个文件。
基本格式如下,
SPO[OL] [file_name[.ext] [CRE[ATE] | REP[LACE] | APP[END]] | OFF | OUT]
例如,
spool test.txt(test.csv)
select ...
spool off
可以控制输出文件的格式,通常在脚本中调用这个指令,和业务逻辑结合。如果说它的弊端,调整输出格式,算是其中之一,例如输出文件中是否删除表头,是否删除SQL语句,每个字段的宽度,这些可能都需要提前设置。
可参考《spool导出格式的问题》。
sqlplus中常用的一些设置格式的指令,
set echo off --关闭脚本中正在执行的SQL语句的显示
set feedback off --关闭本次sql命令处理的记录条数,默认为on即去掉最后的已经选择的行数
set verify off --可以关闭和打开提示确认信息
set heading off --关闭标题的输出设置为off就去掉了select结果的字段名,只显示数据
set term off --不在屏幕上输出执行结果
SET newpage none --页与页之间没有分隔
set trimspool on --将每行后面多余的空格去掉【linesize-实际字符数=多余空格】
set trimout on --去除标准输出每行后面多余的空格
set linesize 200 --设置每行最多显示200个字符
set pagesize 0 --设置每页最多显示999行记录
set termout off --屏幕不显示查询数据
(2)utl_file
Oracle还提供了utl_file,用于读写操作系统文件,具体操作可参考《Oracle数据导出新选择》,最大的优势,就是它的效率高,毕竟是内部执行,测过200万数据导出,大约用时16秒,还支持文件切分,算是一种高级的数据导出工具。可以在存储过程中调用utl_file,还可以通过程序进行调用,功能很强大,但是得了解它的用法,具体可参考《PL/SQL Packages and Types Reference》这个官方文档。
(3)PLSQL Developer
PLSQL Developer导出,可能是最简单的,因为都是图形化的操作,即使不是很熟悉数据库,都可以快速掌握。
但是凡事都是两面的,简单易懂,自然有它的弊端,单就软件来说,封装了很多操作,例如常用的F5,查看执行计划,它执行的是explain,了解Oracle的朋友可能知道这种方式得到的执行计划可能不是真实的(具体可参考《一个执行计划异常变更的案例 - 外传之查询执行计划的几种方法》),因此,可能会对问题的判断产生影响。
和PLSQL Developer一些问题相关的历史文章,
《能不能算是PLSQL Developer的锅?》
《PLSQL Developer中控制结果集表格自动提交》
《PLSQL Developer几个可能的隐患》
《PLSQL Developer中文乱码问题》
《PLSQL Developer免密登录》
《PLSQL Developer日期格式如何定制化》
通过PLSQL Developer是可以直接导出Excel格式的文件,但是适合于数据量较小的场景,数据量太大,容易卡顿,而且自定义的可控性不强,毕竟都是软件提供现成的功能。
(4)Java等语言
通过Java、C、Python这些编程语言可以直连数据库,进行数据的导出,最大的优势,就是自主性很强,任何格式、任何逻辑,都可以通过程序来实现。但相对来说,对使用者就会提出更高的要求,尽管像连接数据库的操作、检索数据的操作、导出Excel的操作,相对比较通用,但是还得需要一些学习成本,如果是和业务逻辑绑定的,通过程序实现Excel的导出,还是比较方便的。
因此,采用何种数据导出的操作,还是取决于具体的需求,结合导出数据量,选择最合适方案。选择的过程, 其实就是设计的过程,和写程序一样,设计好了,事半功倍,"磨刀不误砍柴工"。
参考资料,
http://blog.itpub.net/28602568/viewspace-2120711/
https://www.cnblogs.com/xzjf/p/8550449.html
https://www.cnblogs.com/maowenjie/p/12851535.html
https://blog.csdn.net/lixiaomei0623/article/details/121274473
https://blog.csdn.net/baoqiangwang/article/details/121134329