【摘要】
在生产系统使用过程中,常常会有从数据库中导出数据的需求。支持多种导出方式,例如使用spool、utl_file等内置方法导出,利用plsql developer、等第三方工具等。
【正文】
Oracle支持多种导出方式,包括自带的工具包和第三方工具。不同工具有各自的适用场景,这里对常见的四种方案进行简要分析:
一利用utl_file将执行结果导出为.csv文件
1.1方法描述
使用流程:
1、定义字段列表(根据实际情况增减字段);
2、定义目录对象(如果没有,需要先通过create directory创建);
3、定义输出文件名称(不用写文件后缀名);
4、定义输出表格标题(可自定义显示的字段名);
5、设置执行的
6、映射字段列表(依次给字段赋值);
7、输出每一行数据。
1.2操作演示
这里演示如何通过sqlplus工具将指定SQL语句的执行结果导出到.csv文件。
指定SQL:
select
OWNER, OBJECT_NAME, OBJECT_TYPE, CREATED, LAST_DDL_TIME, STATUS from
dba_objects;
说明:
dba_objects包含18万行数据。
脚本内容:
--脚本内容开始---
--会话设置
SET
SERVEROUT ON;--打开输出提示
SET
TIMING ON;--打开计时器
--定义变量
DECLARE
DIRPATHVARCHAR2(4000);--目录对象
OUTFILEVARCHAR2(4000);--输出文件名称
VSFILEUTL_FILE.FILE_TYPE; --定义用于接收文件句柄的类型
V_CNTNUMBER;--统计每个文件加载行数
--定义字段列表
--根据实际情况增减字段,为了方便,可以采用Cn的定义方式,n为查询结果的列数
C1VARCHAR2(4000);
C2VARCHAR2(4000);
C3VARCHAR2(4000);
C4VARCHAR2(4000);
C5VARCHAR2(4000);
C6VARCHAR2(4000);
BEGIN
--设置dbms_output输出的缓冲大小
--DBMS_OUTPUT.ENABLE(1000000); -->避免报错ORA-20000:
ORU-10027: BUFFER OVERFLOW, LIMIT OF 10000 BYTES
--定义目录对象
DIRPATH:= 'EXPDATA'; --这里对应OS上的目录“D:\expdata”
--定义输出文件名称
OUTFILE:= 'dba_objects';
--开始打开文件,这里使用DIRECTORY参数指定输出文件的存放位置
VSFILE := UTL_FILE.FOPEN(DIRPATH, OUTFILE ||
'.CSV', 'W');
/*参数介绍:
UTL_FILE.FOPEN(LOCATION IN VARCHAR2, FILENAME
IN VARCHAR2, OPEN_MODE IN VARCHAR2) RETURN FILE_TYPE;
LOCATION是文件存放的DB目录名称,-------执行用户要有对DIR目录的读写权限
FILENAME是文件名,
OPEN_MODE是打开模式('R'是读文本,'W'是写文本,'A'是附加文本,参数不分大小写,如果指定'A'但是文件不存在,它会用'W'先创建出来,'W'有覆盖的功能)*/
--定义输出表格标题
UTL_FILE.PUT_LINE(VSFILE,
'OWNER, OBJECT_NAME,
OBJECT_TYPE, CREATED, LAST_DDL_TIME, STATUS');
--每个文件加载行数[每次进入循环都赋值为0].排除标头部分
V_CNT := 0;
--设置执行的SQL语句
--将FOR循环查询的内容
FOR SQL_ IN (select OWNER, OBJECT_NAME,
OBJECT_TYPE, CREATED, LAST_DDL_TIME, STATUS from dba_objects) LOOP
--映射字段列表
C1:= SQL_.OWNER;
C2:= SQL_.OBJECT_NAME;
C3:= SQL_.OBJECT_TYPE;
C4:= SQL_.CREATED;
C5:= SQL_.LAST_DDL_TIME;
C6:= SQL_.STATUS;
--输出每一行数据
/*UTL_FILE.PUT_LINE若需要EXCEL格式,需要每字段用逗号隔开,,WINDOWS EXCEL工具打开默认就是EXCEL格式*/
UTL_FILE.PUT_LINE(VSFILE,
C1 || ',' || C2 || ',' ||
C3 || ',' || C4 || ',' ||
C5 || ',' ||
C6);
--计数器,每一条数据都循环+1
V_CNT := V_CNT + 1;
END LOOP;
--打印每个文件LOAD ROWS
DBMS_OUTPUT.PUT_LINE( OUTFILE || '.CSV文件LOAD ROWS:' || V_CNT);
--放在LOOP后,否则报错ORA-29282:文件ID无效/ORA-06512:在"SYS.UTL_FILE", LINE 878
--若不写如下 强制输出缓冲/关闭句柄,可能存在导出数据少于查询条目
UTL_FILE.FFLUSH(VSFILE);
UTL_FILE.FCLOSE(VSFILE);
END;
--脚本内容结束---
上述脚本已经通过多次测试成功,且每一步都有详细说明,用户可根据实际的SQL语句进行设当调整即可实现数据导出到excel。
下面是执行成功截图:
此时可在D:\expdata目录下找到导出的.csv文件,如:
二利用plsql
developer将执行结果导出为.csv文件
2.1方法描述
先执行要查询的SQL语句(执行完能看到有结果即可,无需显示所有数据),然后点击“export query result...”按钮,选择“CSV file”(或需要的文件类型),在弹出的对话框输入文件名后点击“保存”按钮即可。
2.2操作演示
这里演示如何通过plsql
developer工具将指定SQL语句的执行结果导出到.csv文件。
指定SQL:
select
OWNER, OBJECT_NAME, OBJECT_TYPE, CREATED, LAST_DDL_TIME, STATUS from
dba_objects;
说明:
dba_objects包含18万行数据。
导出完成后可在指定的目录下找到导出的.csv文件。
三利用excel连接数据库进行导出
3.1方法描述
Excel可通过ODBC驱动直接写SQL语句查询Oracle中数据。
3.2操作演示
这里演示如何通过excel连接数据库进行数据导出。
3.2.1配置ODBC数据源
开始->控制面板->系统和安全->管理工具->ODBC数据源(可根据自己的情况选择32位还是64位)。
因安装的是Oracle
11.2.0.4 64位,故选择ODBC数据源(64位),显示如下:
进入Oracle ODBC配置项,需要填写的有四项:
Data Source Name:其实就是给该数据源取一个名字,在本例中我取的是“test”。
Description:对该数据源的描述,可写可不写。
TNS Service Name:即网络服务名,这个是在Oracle客户端tnsnames.ora中定义,这里的是“excel_to_oracle”。
tnsnames.ora中对应的内容可能如下:
excel_to_oracle
=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 182.17.6.5)(PORT
= 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
User ID:用户名,该用户必须对所查询的表有可读权限。
3.2.2在Excel中进行查询操作
注:这里的Excel版本是2016。
2.1、数据->获取外部数据->自其他来源->来自Microsof Query,如图所示:
2.2、选择数据源“test”,点击“确认”。
2.3、输入scott用户的密码,点击“OK”。
这里可能会卡一会儿
2.4、选择需要操作的表:
2.5、可根据实际情况筛选数据,这里直接下一步:
2.6、可根据实际情况进行排序,这里直接下一步:
2.7、将数据返回microsoft excel,完成设置:
2.8、在最后弹出的对话框设置好显示方式和放置位置,点击确定即可下:
可以看到数据已显示到excel表格中:
如果在microsoft
query中进行操作,可以点击如下图的按钮将数据返回到excel:
最后,可通过excel保存查询数据。
四利用spool打印数据到指定文件
4.1方法描述
在sqlplus工具中通过spool命令可保存sql执行结果到指定文件。
4.2操作演示
这里演示如何通过spool格式化输出scott用户下的tab表数据并保存到指定文件。
conn scott
--输入口令:
--已连接。
--格式化输出结果
set
linesize 200
set term
off verify off feedback off pagesize 6000
set markup
html on entmap ON spool on preformat off
--利用spool命令说明生成的xls表的名称
spool
D:\expdata\tables.xls
--执行查询语句
select *
from tab;
--保存文件
spool off
exit
导出完成后可在指定的目录下找到导出的.xls文件,如: