快速导入导出Oracle数据demo(sqlldr、UTL_FILE)

本文演示快速sqlldr导入、UTL_FILE导出Oracle表数据实例

表结构如下,演示数据约112万,可自行准备。

create table MemberPointDemo
(
MEMBERID NUMBER(20) not null ,--会员ID
  PointType   VARCHAR2(20) not null,--积分类型
  Points   VARCHAR2(20),--积分
  SDate   VARCHAR2(20) not null,--积分记账日期
  Notes   VARCHAR2(60)--备注
  
);
-- Create/Recreate indexes 
create index IDX_MEMBERID on MemberPointDemo (MEMBERID);
alter table MemberPointDemo
  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文件内容:

load data
infile '/home/oracle/2017_12_06_162045.CSV'
into table dbusrdms.MemberPointDemo append
fields terminated by ','
(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秒内完成。

快速导入导出Oracle数据demo(sqlldr、UTL_FILE)_第1张图片

 

 

2、快速导出UTL_FILE.FOPEN

/* ******************************* 导出为csv文件最快******************/
DECLARE
  VSFILE UTL_FILE.FILE_TYPE; --定义用于接收文件句柄的类型
  V_CNT  NUMBER; --统计每个文件加载行数
  V_Date Varchar(20);
  --字段列表
  MEMBERID NUMBER(20);
  PointType   VARCHAR2(20);
  Points   VARCHAR2(20);
  SDate   VARCHAR2(20);
  Notes   VARCHAR2(60);
  

BEGIN
  --DBMS_OUTPUT.ENABLE(1000000); -->避免报错ORA-20000: ORU-10027: BUFFER OVERFLOW, LIMIT OF 10000 BYTES

  --文件命名规则..把表数据时间当做文件命名...
  V_Date := TO_CHAR(sysdate, 'YYYY_MM_dd_hh24MiSS');
  --开始打开文件,EXP_DIR为对应的目录
  VSFILE := UTL_FILE.FOPEN('EXP_DIR', V_Date || '.CSV', 'W');

  --文件字段标头打印
  UTL_FILE.PUT_LINE(VSFILE,'MEMBERID,PointType,Points,SDate,Notes');
  --UTL_FILE.PUT_LINE(VSFILE, '会员ID,积分类型,积分,记账日期,备注');

  --每个文件加载行数[每次进入循环都赋值为0].排除标头部分
  V_CNT := 0;
  --将FOR循环查询的内容
  FOR SQL_ IN (SELECT MEMBERID, PointType, Points, SDate, Notes FROM MemberPointDemo) LOOP
    --字段列表
    MEMBERID := SQL_.MEMBERID;
    PointType   := SQL_.PointType;
    Points   := SQL_.Points;
    SDate   := SQL_.SDate;
    Notes   := SQL_.Notes;
    
  
    ----UTL_FILE.PUT_LINE 若需要EXCEL格式,需要每字段用逗号隔开,,WINDOWS EXCEL工具打开默认就是EXCEL格式
    UTL_FILE.PUT_LINE(VSFILE, MEMBERID || ',' || PointType || ',' || Points || ',' || SDate || ',' || Notes );
    --下面语句可以输出带引号的格式                  
    --UTL_FILE.PUT_LINE(VSFILE, '"'||MEMBERID || '","' || PointType || '","' || Points || '","' || SDate || '","' || Notes || '"');
  
    --计数器,每一条数据都循环+1
    V_CNT := V_CNT + 1;
  END LOOP;

  --打印每个文件 LOAD ROWS
  DBMS_OUTPUT.PUT_LINE(V_Date || '.CSV文件LOAD ROWS:' || V_CNT);

  --放在LOOP 后,否则报错 ORA-29282: 文件 ID 无效/ORA-06512: 在 "SYS.UTL_FILE", LINE 878
  --若不写如下 强制输出缓冲/关闭句柄,可能存在导出数据少于查询条目
  UTL_FILE.FFLUSH(VSFILE);
  UTL_FILE.FCLOSE(VSFILE);

END;

以上,导出为指定目录下的CSV文件,112万记录,大约14秒。

快速导入导出Oracle数据demo(sqlldr、UTL_FILE)_第2张图片

邀月注:本文版权由邀月和CSDN共同所有,转载请注明出处。
助人等于自助!   [email protected]

 

你可能感兴趣的:(Oracle,Utility,推荐)