zoukankan      html  css  js  c++  java
  • 快速导入导出Oracle数据demo(sqlldr、UTL_FILE)

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

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

     1 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秒。

    邀月工作室

  • 相关阅读:
    HDU 2639 Bone Collector II (01背包,第k解)
    POJ 2184 Cow Exhibition 奶牛展(01背包,变形)
    hihoCoder #1165 : 益智游戏 (挑战赛11 B题)
    UVA 562 Dividing coins 分硬币(01背包,简单变形)
    POJ Charm Bracelet 挑饰品 (常规01背包)
    hiho一下 第四十四周 博弈游戏·Nim游戏(直接公式解)
    UVA 624 CD(01背包,要记录路径)
    118 Pascal's Triangle 帕斯卡三角形 杨辉三角形
    117 Populating Next Right Pointers in Each Node II 每个节点的右向指针 II
    116 Populating Next Right Pointers in Each Node 每个节点的右向指针
  • 原文地址:https://www.cnblogs.com/downmoon/p/7993566.html
Copyright © 2011-2022 走看看