从oracle导出csv文件主要有两种方法
方法1、使用oracle server developer自带的功能
在数据库中找到想要导出的表,右键选择导出。去掉勾选的导出DDL,把格式改成csv,选择相应的编码方式
下一步之后,还可以添加where子句。
按提示操作即可。
方法2、使用oracle的内建包UTL_FILE
utl_file读写文件包 ,每分钟大约处理百万行。适用于大量导出时。
1)新建一个sql_to_csv的存储过程。
CREATE
OR REPLACE PROCEDURE SQL_TO_CSV (
P_QUERY IN VARCHAR2,-- PLSQL文
P_DIR IN VARCHAR2,-- 导出的文件放置目录
P_FILENAME IN VARCHAR2 -- CSV名
) IS L_OUTPUT UTL_FILE.FILE_TYPE;
L_THECURSOR INTEGER DEFAULT DBMS_SQL.OPEN_CURSOR;
L_COLUMNVALUE VARCHAR2 (4000);
L_STATUS INTEGER;
L_COLCNT NUMBER := 0;
L_SEPARATOR VARCHAR2 (1);
L_DESCTBL DBMS_SQL.DESC_TAB;
P_MAX_LINESIZE NUMBER := 32000;
BEGIN
--OPEN FILE
L_OUTPUT := UTL_FILE.FOPEN (
P_DIR,
P_FILENAME,
'W',
P_MAX_LINESIZE
);
--DEFINE DATE FORMAT
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT=''YYYY-MM-DD HH24:MI:SS''';
--OPEN CURSOR
DBMS_SQL.PARSE (
L_THECURSOR,
P_QUERY,
DBMS_SQL.NATIVE
);
DBMS_SQL.DESCRIBE_COLUMNS (
L_THECURSOR,
L_COLCNT,
L_DESCTBL
);
--DUMP TABLE COLUMN NAME
FOR I IN 1 ..L_COLCNT
LOOP
UTL_FILE.PUT (
L_OUTPUT,
L_SEPARATOR || '"' || L_DESCTBL (I ).COL_NAME || '"'
);
--输出表字段
DBMS_SQL.DEFINE_COLUMN (
L_THECURSOR,
I,
L_COLUMNVALUE,
4000
);
L_SEPARATOR := ',';
END
LOOP
;
UTL_FILE.NEW_LINE (L_OUTPUT);--输出表字段
--EXECUTE THE QUERY STATEMENT
L_STATUS := DBMS_SQL. EXECUTE (L_THECURSOR);
--DUMP TABLE COLUMN VALUE
WHILE (
DBMS_SQL.FETCH_ROWS (L_THECURSOR) > 0
)
LOOP
L_SEPARATOR := '';
FOR I IN 1 ..L_COLCNT
LOOP
DBMS_SQL.COLUMN_VALUE (
L_THECURSOR,
I,
L_COLUMNVALUE
);
UTL_FILE.PUT (
L_OUTPUT,
L_SEPARATOR || '"' || TRIM (
BOTH ' '
FROM
REPLACE (L_COLUMNVALUE, '"', '""')
) || '"'
);
L_SEPARATOR := ',';
END
LOOP
;
UTL_FILE.NEW_LINE (L_OUTPUT);
END
LOOP
;
--CLOSE CURSOR
DBMS_SQL.CLOSE_CURSOR (L_THECURSOR);
--CLOSE FILE
UTL_FILE.FCLOSE (L_OUTPUT);
EXCEPTION
WHEN OTHERS THEN
RAISE;
END;
/
2)创建导出路径
create or replace directory OUT_PATH as 'D:\out_path';
注意:这步只是在oracle sql developer中定义了导出路径,如果路径不存在,并不会自动生成,需要手动去新建!
3) 执行导出命令
EXEC sql_to_csv('select * from <tablename>','OUT_PATH','<filename>');
效率比较
第一个方法比较简单,但是导出速度上较慢,导出2亿多条的70GB数据大约需要2天半。
第二个方法相对需要一些设置,速度较快,导出2亿多条的70GB数据大约为20小时。(效率值都是我尝试下来的情况,不同环境可能会有所不同)