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;
====================
第三步:具体过程实现
一次性将100万条记录全部查询出来放到游标中,每1000条写一个文件,
经测试,使用游标方式,使用该表初始化的数据,整个过程执行时长大致40s左右。
====================
create or replace procedure export_to_csv(
--1、入口参数部分
p_dir varchar2
--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
数据库有如下表结构:user_info ( user_id NUMBER primary key, user_name VARCHAR2(200) NOT NULL, user_age VARCHAR2(80), create_date DATE, create_order NUMBER)现在有100
优点:高效;支持功能较多;用户只需有对应表查询权限;可以在从库执行
缺点:目前已没有再维护,只能找到基于
oracle
10.2的版本(高版本目前还可以用);密码必须要跟在用户名后面输,安全性不足
2. 下载安装
百度云链接:https://pan.baidu.com.
P_QUERY IN VARCHAR2, -- PLSQL文
P_DIR IN VARCHAR2, --
导出
的
文件
放置目录
P_
FILE
NAME IN VARCHAR2 --
CSV
名
L_
OUTPUT
UTL_
FILE
.
FILE
_TYPE;
L_THECURSO...
参考文章:
Bcp
使用
心得: http://www.cnblogs.com/puke/archive/2013/06/05/3119378.html
定时
导出
csv
文件
: http://www.dearda.com/index.php/archives/1283
导出
csv
文件
A 全局临时表
if OBJECT_ID('tempdb..##table') is not nul
我通过这个方法,按照字段筛选
数据
,并分别
导出
多个
csv
文件
:
(1)首先创建
存储
一个过程,如下,直接复制粘贴即可 。这个
存储过程
可以直接
使用
,因为它是通用的,只需要你传入SQL和生成
文件
的路径就可以。
如果你想多了解一下的话,可以搜一搜
oracle
内置utl_
file
读写
文件
包 ,每分钟大约处理百万行。适用于大量
导出
的情况
CREATE OR REPLAC...