如何将Oracle大表分块导出为CSV文件
Oracle 11g 结合SQL Developer 分批导出千万级大表为CSV的实现方法
方法1:基于ROWNUM分页查询分批导出(最易操作,无需额外权限)
- 首先确定单批次导出的行数,建议单批次控制在50万~100万行,避免导出过程中内存溢出,比如设定每批导出50万行
- 编写分页查询SQL,Oracle 11g不支持OFFSET语法,需使用嵌套ROWNUM实现分页,示例SQL如下,替换你自己的表名、字段名:
-- 第1批:1~500000行 SELECT 字段1,字段2,字段3 FROM ( SELECT t.*, ROWNUM rn FROM 你的表名 t WHERE ROWNUM <= 500000 ) WHERE rn >= 1;
-- 第2批:500001~1000000行 SELECT 字段1,字段2,字段3 FROM ( SELECT t.*, ROWNUM rn FROM 你的表名 t WHERE ROWNUM <= 1000000 ) WHERE rn >= 500001;
- 每次执行完单批次查询后,在SQL Developer的查询结果集右上角,点击导出按钮,格式选择CSV,指定对应批次的文件名即可完成单批次导出,重复执行直到所有数据导出完成
注意:如果表有连续、无空洞的数值主键/排序字段,可以替换ROWNUM分页为按主键范围筛选,查询性能更高,示例:
SELECT * FROM 你的表名 WHERE 主键ID BETWEEN 1 AND 500000;
方法2:使用SQL Developer导出向导的分批参数配置(无需手动写分页SQL)
- 打开SQL Developer,在左侧对象列表找到你的目标表,右键选择导出
- 格式选择CSV,指定导出路径,进入筛选步骤
- 在行限制和行偏移位置填写对应批次参数,比如第1批行偏移填0,行限制填500000;第2批行偏移填500000,行限制填500000,依次类推即可完成分批导出
注意:该方式底层也是调用Oracle分页查询实现,千万级表建议单批行数不要超过100万,否则行偏移过大时查询耗时会显著上升。
方法3:PL/SQL脚本自动生成多份CSV(适合无人值守导出场景)
如果你不想手动逐批操作,可以在SQL Developer中执行PL/SQL脚本自动生成分批CSV,需确保你有UTL_FILE的读写权限,示例脚本如下,替换对应参数即可:
DECLARE v_batch_size NUMBER := 500000; -- 自定义单批导出行数 v_total_rows NUMBER; v_file UTL_FILE.FILE_TYPE; v_dir VARCHAR2(100) := '你的Oracle目录对象名'; -- 需提前在Oracle中创建指向服务端路径的DIRECTORY对象 BEGIN -- 获取目标表总记录数 SELECT COUNT(*) INTO v_total_rows FROM 你的表名; -- 循环执行分批导出 FOR i IN 0..CEIL(v_total_rows/v_batch_size)-1 LOOP v_file := UTL_FILE.FOPEN(v_dir, '表名_批次'||(i+1)||'.csv', 'w'); -- 写入CSV表头 UTL_FILE.PUT_LINE(v_file, '字段1,字段2,字段3'); -- 写入当前批次数据 FOR rec IN ( SELECT 字段1,字段2,字段3 FROM ( SELECT t.*, ROWNUM rn FROM 你的表名 t WHERE ROWNUM <= (i+1)*v_batch_size ) WHERE rn > i*v_batch_size ) LOOP UTL_FILE.PUT_LINE(v_file, rec.字段1||','||rec.字段2||','||rec.字段3); END LOOP; UTL_FILE.FCLOSE(v_file); END LOOP; END; /
该方法生成的CSV文件存储在Oracle服务器对应的目录下,需提前申请数据库服务端的目录读写权限
内容的提问来源于stack exchange,提问作者Thilina
相关产品推荐
相关产品推荐

