重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 490|回复: 0
打印 上一主题 下一主题

[Oracle] Oracle数据库导出csv格式

[复制链接]
跳转到指定楼层
楼主
发表于 2025-9-14 17:34:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2026-4-18 03:01 , Processed in 0.392258 second(s), 21 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表