重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛
标题:
Oracle数据库导出csv格式
[打印本页]
作者:
mahan
时间:
2025-9-14 17:34
标题:
Oracle数据库导出csv格式
1.创建导出存储过程
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 '/home/oracle/';
3.查看导出表的数据量
这一步是可以先确定要导出数据的数量,另外在导出过程中可以查看导出进度。
比如导出hr.employ这个表
select count(*) from hr.employ
4.导出命令
EXEC sql_to_csv('select * from <tablename>','OUT_PATH','<filename>');
例如你要导出hr.t这个表,你请在sqlplus上执行
EXEC sql_to_csv('select * from hr.employ','OUT_PATH','employ.csv');
数据量大最好后台执行
5.查看导出进度
到导出目录查看导出进度
cd /home/oracle/
wc -l employ.csv
6.使用系统 split 命令分割大文件
根据CSV文件的大小进行分割
split -l 1000000 employ.csv "employ.csv-" -a 2
欢迎光临 重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛 (http://bbs.cqsztech.com/)
Powered by Discuz! X3.2