java oracle导出csv_使用存储过程将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');

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值