从oracle导出成csv文件
从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小时。(效率值都是我尝试下来的情况,不同环境可能会有所不同)