Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1239337
  • 博文数量: 350
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5668
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-23 17:53
文章分类

全部博文(350)

文章存档

2013年(350)

分类: Oracle

2013-04-10 11:24:24

5.3 一千零一十一个怎么办

5.3.1 给我的是个E xcel 文件怎么办

  如果碰到的是这个问题,我首先想说的是,你运气不错!众所周知,.xls文件单个Sheet 最大行数不超过65536行,这起码说明你将要处理的数据量不大。

  一般处理E xcel 数据,最常用的方式是将其保存为CSV(Comma Separated  Values ,逗号分隔值)格式文件,单击“文件”→“另存为”命令,在“保存类型”下拉列表框中选择CSV,如图5-1所示。

  图5-1  “另存为”对话框

  然后,即可按照5.1节中演示的方式执行导入。

5.3.2 要加载的文件不是以逗号分隔怎么办

  有两种方式可以参考:

  1 )修改数据文件,将分隔符替换为逗号。

  2 )修改控制文件,将FIELDS TERMINATED BY的值修改为实际的分隔符。

5.3.3 要加载的数据中包含分隔符怎么办

  例如,要向scott.bonus表插入数据(另注:在本章示例中如无特别说明,均以操作bonus表中数据为例),提供的数据格式如下(仅做示例,我就不弄太多数据了):

    SMITH,CLEAK,3904

    ALLEN,"SALER,M",2891

    WARD,"SALER,""S""",3128

    KING,PRESIDENT,2523

  示例保存为数据文件ldr_case2.dat。

  修改控制文件,注意下列示例代码中的粗体字符,OPTIONALLY ENCLOSED BY参数指明定界符(专业词汇哟)为双引号(CSV格式文件默认定界符就是双引号,你可以根据实际情况修改OPTIONALLY的参数值),如下所示:

    LOAD DATA

    INFILE ldr_case2.dat

    TRUNCATE INTO TABLE BONUS

    FIELDS TERMINATED BY ","  OPTIONALLY ENCLOSED BY  ' " '

    (ENAME,JOB,SAL)

  示例代码保存为控制文件ldr_case2.ctl。

  运行SQLLDR:

    F:\oracle\script> SQLLDR SCOTT/TIGER CONTROL=LDR_CASE2.CTL

    SQL*Loader: Release 10.2.0.1.0 - Production on Tue Mar 17 14:25:21 2009

    Copyright (c) 1982, 2007, Oracle.  All rights reserved.

    Commit point reached - logical record count 3

    Commit point reached - logical record count 4

  查询结果如下:

    SQL>  SELECT * FROM BONUS;

    ENAME      JOB          SAL     COMM 

    ---------- -------------------- ----------  ----------

    SMITH      CLEAK                3904

    ALLEN      SALER,M              2891

    WARD       SALER,"S"             3128

    KING       PRESIDENT            2523

  是你想要的结果吗?

5.3.4 数据文件没有分隔符怎么办

  例如:提供数据文件中的数据都是以下的格式:

    SMITH  CLEAK      3904

    ALLEN  SALESMAN   2891

    WARD   SALESMAN   3128

    KING   PRESIDENT  2523

  示例代码保存为数据文件ldr_case3.dat。

  按照专业的叫法,这是定长字符串,不要紧的,SQLLDR中处理定长字符串也轻而易举。针对此例,我们将控制文件修改如下:

    LOAD DATA

    INFILE ldr_case3.dat

    TRUNCATE INTO TABLE BONUS

    (

    ENAME position(1:5),

    JOB position(7:15),

    SAL position(17:20)

    )

  示例代码保存为控制文件ldr_case3.ctl。

  position关键字用来指定列的开始和结束位置,如 JOB position (7:15)是指从第7个字符开始截止到第15个字符作为ENAME列的列值。position的写法也很灵活,要实现上述功能还可以换成下列几种形式:

  • position(*+2:15) :直接指定数值的方式叫作绝对偏移量,如果使用*号,专业名词叫相对偏移量,表示上一个字段从哪里结束,这次就从哪里开始,相对偏移量也可以再做运算,比如position(*+2:15)就表示从上次结束的位置+2的地方开始。
  • position(*) char(9) :这种相对偏移量+类型和长度的优势在于,你只需要为第一列指定开始位置,其他列只需要指定列长度就可以了,实际使用中比较省事。

  执行 SQLLDR 命令:

    F:\oracle\script> SQLLDR SCOTT/TIGER CONTROL=LDR_CASE3.CTL

    SQL*Loader: Release 10.2.0.1.0 - Production on 星期三 3月 11 16:56:20 2009

    Copyright (c) 1982, 2007, Oracle.  All rights reserved.

    达到提交点 - 逻辑记录计数 3

    达到提交点 - 逻辑记录计数 4

  SQL*Plus 中查看导入结果:

    SQL>  SELECT * FROM BONUS;

    ENAME    JOB         SAL  COMM

    ---------- ---------  ---------- ----------

    SMITH    CLEAK               3904

    ALLEN    SALESMAN           2891

    WARD    SALESMAN           3128

    KING      PRESIDENT           2523

=================================================
全书目录:http://space.itpub.net/7607759/viewspace-622699
样书预览:http://space.itpub.net/7607759/viewspace-622515
马上购买:


阅读(1605) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~