使用存储过程将Oracle数据批量导出为多个csv文件
数据库有如下表结构:
user_info (
user_id NUMBER primary key,
user_name VARCHAR2(200) NOT NULL,
user_age VARCHAR2(80),
create_date DATE,
create_order NUMBER
)
现在有100万条记录,要求每1000条记录导出为一个csv文件,内容用逗号分隔,共计1000个文件,
文件名称格式为output1.csv,output1.csv......output1000.csv。
/*
====================
第一步:创建一张表
====================
*/
CREATE TABLE USER_INFO (
USER_ID NUMBER PRIMARY KEY,
USER_NAME VARCHAR2(200) not null,
USER_AGE VARCHAR2(80),
CREATE_DATE DATE,
CREATE_ORDER NUMBER
)
/*
====================
第二步:初始化数据、粘贴在命令行执行
====================
*/
declare i number;
v_age number;
begin
i:=0;
for i in 1..1000000 loop
--随机生成1~100的数字
select round(mod(dbms_random.value*100,100)) into v_age from dual;
insert into user_info(user_id,user_name,user_age,create_date,create_order)
values(SEQ_ALL_TABLE.NEXTVAL ,'翁林'||i,v_age,sysdate,i);
--每1000行提交一次
if mod(i,1000) = 0 then
commit;
end if;
end loop;
end;
/*
====================
第三步:具体过程实现
一次性将100万条记录全部查询出来放到游标中,每1000条写一个文件,
经测试,使用游标方式,使用该表初始化的数据,整个过程执行时长大致40s左右。
====================
*/
create or replace procedure export_to_csv(
--1、入口参数部分
p_dir varchar2
)is
--2、内部变量部分
v_errorcode varchar2(30);
v_errormsg varchar2(100);
--显示游标、一次性将数据全部读完
cursor mycur is select * from user_info order by user_id; --如果不排序,你将发现写入结果顺序将达不到你的期望,该懂得的。
--行记录
myrecord user_info%rowtype;
csv_output utl_file.file_type;
out_file_name varchar2(20);
begin_time number;
end_time number;
count_num number;
begin
--3、主体部分
begin_time :=dbms_utility.get_time;
open mycur;
for i in 1..1000 loop
out_file_name := 'output'||i||'.csv';
csv_output := utl_file.fopen(p_dir,out_file_name,'W');
count_num := 0;
while count_num < 1000 loop --每1000行写入一个文件
fetch mycur into myrecord;
utl_file.put_line(csv_output
,myrecord.user_id|| ',' ||
myrecord.user_name||','||
myrecord.user_age||','||
to_char(myrecord.create_date,'YYYY-MM-DD HH24:MI:SS')||','||
myrecord.create_order);
count_num := count_num + 1;
end loop;
utl_file.fclose(csv_output);
end loop;
close mycur;
end_time := dbms_utility.get_time;
dbms_output.put_line('total time=' || (end_time-begin_time)*10 || 'ms.');
--4、异常处理
exception
when others then
v_errorcode:=sqlcode;
v_errormsg :=sqlerrm;
rollback;
--输出异常信息
dbms_output.put_line(v_errorcode||v_errormsg);
end export_to_csv;
/*
====================
第四步:创建输出目录,并授权给相关用户
====================
*/
CREATE or replace DIRECTORY MYDIR AS 'd:\tmp\';
GRANT READ,WRITE ON DIRECTORY MYDIR TO wenglin;
/*
====================
第五步:命令行执行,查看输出文件
若想看到命令行打印结果,请执行:set serveroutput on
====================
*/
exec export_to_csv('MYDIR');
其他说明:该示例参考:http://blog.csdn.net/chjttony/article/details/7466159
使用存储过程将Oracle数据批量导出为多个csv文件的更多相关文章
- oracle数据导入/导出
Oracle数据导入导出imp/exp 功能:Oracle数据导入导出imp/exp就相当与oracle数据还原与备份. 大多情况都可以用Oracle数据导入导出完成数据的备份和还原(不会造成数据 ...
- Oracle数据导入导出
Oracle数据导入导出imp/exp 在oracle安装目录下有EXP.EXE与IMP.EXE这2个文件,他们分别被用来执行数据库的导入导出.所以Oracle数据导入导出imp/exp就相当与ora ...
- Oracle数据导入导出imp/exp
功能:Oracle数据导入导出imp/exp就相当与oracle数据还原与备份. 大多情况都可以用Oracle数据导入导出完成数据的备份和还原(不会造成数据的丢失). Oracle有个好处,虽然你的电 ...
- Oracle数据导入导出imp/exp sp2-0734:未知的命令开头'imp...解决方法
Oracle数据导入导出imp/exp sp2-0734:未知的命令开头'imp...解决方法 sp2-0734:未知的命令开头'imp 忽略了剩余行默认分类 www.2cto.com 应该 ...
- Oracle数据导入导出imp/exp(转)
在oracle安装目录下有EXP.EXE与IMP.EXE这2个文件,他们分别被用来执行数据库的导入导出.所以Oracle数据导入导出imp/exp就相当与oracle数据还原与备份. 一.Oracle ...
- Oracle 数据导入导出操作 (转)
Oracle数据导入导出imp/exp 功能:Oracle数据导入导出imp/exp就相当与oracle数据还原与备份. 大多情况都可以用Oracle数据导入导出完成数据的备份和还原(不会造成数据的丢 ...
- Oracle数据导入导出imp/exp命令 10g以上expdp/impdp命令
Oracle数据导入导出imp/exp就相当于oracle数据还原与备份.exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中. 利 ...
- Oracle数据导入导出命令
IMP 和EXP命令 Oracle数据导入导出imp/exp就相当于oracle数据还原与备份.exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处 ...
- oracle数据导入/导出(2)
Oracle数据导入导出imp/exp 功能:Oracle数据导入导出imp/exp就相当与oracle数据还原与备份. 大多情况都可以用Oracle数据导入导出完成数据的备份和还原(不会造成数据的丢 ...
随机推荐
- vim:inoremap命令
inoremap命令用于映射按键. i代表是在插入模式(insert)下有效 nore表示不递归no recursion,例如:inoremap Y y和inoremap y Y并不会出现无限循环. ...
- XILINX XST综合的选项的含义
所谓综合,就是将HDL语言.原理图等设计输入翻译成由与.或.非门和RAM.触发器等基本逻辑单元的逻辑连接(网表),并根据目标和要求(约束条件)优化所生成的逻辑连接,生成EDF文件.完成了输入.仿真以及 ...
- [svc][op]vim常用命令汇总
vim常用命令汇总: 定位 本行第一个字符 ctrl+$ 本行最后一个字符 0gg 文章首行 ctrl+G 文章行尾 u 撤销(Undo) 删除 D 从当前位置删除到行尾 ("d$" ...
- Set 集合论
https://en.m.wikipedia.org/wiki/De_Morgan%27s_laws https://plato.stanford.edu/entries/set-theory/ ht ...
- C do {...} while (0) 在宏定义中的作用
如果你是一名C程序员,你肯定很熟悉宏,它们非常强大,如果正确使用可以让你的工作事半功倍.然而,如果你在定义宏时很随意没有认真检查,那么它们可能使你发狂,浪费N多时间.在很多的C程序中,你可能会看到许多 ...
- 【NOI】9272 偶数个三
题目 链接:bajdcc/ACM 描述 在所有的N位数中,有多少个数中有偶数个数字3?结果模12345.(1<=N<=10000) 样例输入 2 样例输出 73 方法一:穷举 评价:最简单 ...
- 六、从length和length()方法开始
首先你可以快速回答下面问题吗.当没有任何IDE的情况下,如何得到一个数组的长度,如何得到一个String的长度.我问这个了很对不同水平的开发者:初级的中级的.他们不能快速正确的回答这个问题.当IDE提 ...
- mproxy: c 语言实现的一个最小的http代理,支持FQ
https://github.com/examplecode/mproxy mproxy 使用说明 这是一个微型的http代理服务器实现,使用c语言实现,核心代码量不足500行,不依赖任何第三方的库( ...
- 用C#写一个多进程监控自动关机工具
因为据说某server开着就很贵,所以我们跑完测试的job后就要赶紧关机才行,但是测试的job要跑很久,过程中又不需要干什么,所以就得有个守家的,有时候会走很晚.如果有一个自动化关机的工具就好了,当指 ...
- 翻转数字最后n位
#include<stdio.h> int turn_n(int ,int); int main(void) { ,b=; printf("%x\n%d\n%x\n", ...