本文演示快速sqlldr导入、UTL_FILE导出Oracle表数据实例
表结构如下,演示数据约112万,可自行准备。
create table MemberPointDemo 2 ( 3 MEMBERID NUMBER(20) not null ,--会员ID 4 PointType VARCHAR2(20) not null,--积分类型 5 Points VARCHAR2(20),--积分 6 SDate VARCHAR2(20) not null,--积分记账日期 7 Notes VARCHAR2(60)--备注 8 9 ); 10 -- Create/Recreate indexes 11 create index IDX_MEMBERID on MemberPointDemo (MEMBERID); 12 alter table MemberPointDemo 13 add constraint PK_MEMBER_OUT primary key (MEMBERID, PointType, SDate );
1、快速导入sqlldr
#### *******************最快导入***********************************************/ su - oracle export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK" --装载源表数据 sqlldr dbusrdms/******@DBDMS control=/home/oracle/memberpoint.ctl log=/home/oracle/2017_12_06_162045.log
memberpoint.ctl文件内容:
1 load data 2 infile '/home/oracle/2017_12_06_162045.CSV' 3 into table dbusrdms.MemberPointDemo append 4 fields terminated by ',' 5 (MEMBERID, PointType, Points, SDate, Notes)
csv文件格式:
MEMBERID,PointType,Points,SDate,Notes 9281776,1,219,2015-01-01,2015增加 8758055,1,356.00,2015-01-01,2015增加
以上导入112万记录大约在50秒内完成。
2、快速导入UTL_FILE.FOPEN
1 /* ******************************* 导出为csv文件最快******************/ 2 DECLARE 3 VSFILE UTL_FILE.FILE_TYPE; --定义用于接收文件句柄的类型 4 V_CNT NUMBER; --统计每个文件加载行数 5 V_Date Varchar(20); 6 --字段列表 7 MEMBERID NUMBER(20); 8 PointType VARCHAR2(20); 9 Points VARCHAR2(20); 10 SDate VARCHAR2(20); 11 Notes VARCHAR2(60); 12 13 14 BEGIN 15 --DBMS_OUTPUT.ENABLE(1000000); -->避免报错ORA-20000: ORU-10027: BUFFER OVERFLOW, LIMIT OF 10000 BYTES 16 17 --文件命名规则..把表数据时间当做文件命名... 18 V_Date := TO_CHAR(sysdate, 'YYYY_MM_dd_hh24MiSS'); 19 --开始打开文件,EXP_DIR为对应的目录 20 VSFILE := UTL_FILE.FOPEN('EXP_DIR', V_Date || '.CSV', 'W'); 21 22 --文件字段标头打印 23 UTL_FILE.PUT_LINE(VSFILE,'MEMBERID,PointType,Points,SDate,Notes'); 24 --UTL_FILE.PUT_LINE(VSFILE, '会员ID,积分类型,积分,记账日期,备注'); 25 26 --每个文件加载行数[每次进入循环都赋值为0].排除标头部分 27 V_CNT := 0; 28 --将FOR循环查询的内容 29 FOR SQL_ IN (SELECT MEMBERID, PointType, Points, SDate, Notes FROM MemberPointDemo) LOOP 30 --字段列表 31 MEMBERID := SQL_.MEMBERID; 32 PointType := SQL_.PointType; 33 Points := SQL_.Points; 34 SDate := SQL_.SDate; 35 Notes := SQL_.Notes; 36 37 38 ----UTL_FILE.PUT_LINE 若需要EXCEL格式,需要每字段用逗号隔开,,WINDOWS EXCEL工具打开默认就是EXCEL格式 39 UTL_FILE.PUT_LINE(VSFILE, MEMBERID || ',' || PointType || ',' || Points || ',' || SDate || ',' || Notes ); 40 --下面语句可以输出带引号的格式 41 --UTL_FILE.PUT_LINE(VSFILE, '"'||MEMBERID || '","' || PointType || '","' || Points || '","' || SDate || '","' || Notes || '"'); 42 43 --计数器,每一条数据都循环+1 44 V_CNT := V_CNT + 1; 45 END LOOP; 46 47 --打印每个文件 LOAD ROWS 48 DBMS_OUTPUT.PUT_LINE(V_Date || '.CSV文件LOAD ROWS:' || V_CNT); 49 50 --放在LOOP 后,否则报错 ORA-29282: 文件 ID 无效/ORA-06512: 在 "SYS.UTL_FILE", LINE 878 51 --若不写如下 强制输出缓冲/关闭句柄,可能存在导出数据少于查询条目 52 UTL_FILE.FFLUSH(VSFILE); 53 UTL_FILE.FCLOSE(VSFILE); 54 55 END;
以上,导出为指定目录下的CSV文件,112万记录,大约14秒。