• 快速导入导出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秒。

    邀月工作室

  • 相关阅读:
    题目:写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷。
    冒泡排序、插入排序、快速排序
    去掉字符串中重复的字符
    建立一个带附加头结点的单链表.实现测长/打印/删除结点/插入结点/逆置/查找中间节点/查找倒数第k个节点/判断是否有环
    day_1 练习2
    python-day 练习1
    python课程第一天笔记-la
    初学react,为什么页面不显示
    跟我一起学写插件开发
    网上下载的带特效的jquery插件怎么用
  • 原文地址:https://www.cnblogs.com/downmoon/p/7993566.html
Copyright © 2020-2023  润新知