从oracle导出成csv文件

从oracle导出csv文件主要有两种方法

方法1、使用oracle server developer自带的功能

在数据库中找到想要导出的表,右键选择导出。去掉勾选的导出DDL,把格式改成csv,选择相应的编码方式

从oracle导出成csv文件_第1张图片

下一步之后,还可以添加where子句。

从oracle导出成csv文件_第2张图片

按提示操作即可。

方法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 ','OUT_PATH',''); 

效率比较

第一个方法比较简单,但是导出速度上较慢,导出2亿多条的70GB数据大约需要2天半。

第二个方法相对需要一些设置,速度较快,导出2亿多条的70GB数据大约为20小时。(效率值都是我尝试下来的情况,不同环境可能会有所不同)

你可能感兴趣的:(oracle)