我现在遇到的问题的具体情况是这样的,我先将要加载的数据写入一个buffer文件,然后利用sqlldr将文件里面的数据导入数据库,sqlldr结束之后将buffer文件删除,在这个过程中,有部分数据既没有写入数据库,也没有写入bad文件,请问这样的情况是什么原因产生的?

解决方案 »

  1.   

    用了这么多年,从来没有遇到过这种问题。建议把sqlldr用到的ctl文件贴出来
      

  2.   

    应该是你的控制文件的问题,把ctl贴出来看看。
      

  3.   

    怎么会这样呢。sqlldr倒入的话没有导入的会有日志的阿。
    当然还可以设置允许错误的数量。errors。默认是50。
    你说的什么buffer文件。这个不管的。只要有控制文件*.ctl。里面配置好就好。你的数据源文件txt,csv,...逗可以的阿。只要格式是以你控制文件中指定的分割就好(符号,长度==)
      

  4.   

    CTL文件应该没有问题,我是在用一个脚本统计sqlldr产生的日志文件的时候,发现数目不对。我把CTL文件和我的脚本的主要语句都贴上来,请各位帮忙看下有什么问题
    CTL文件:
    OPTIONS ( ERRORS=100000, ROWS=100000, BINDSIZE=10000, SKIP_UNUSABLE_INDEXES=TRUE, DATE_CACHE=5000)
    LOAD DATA
    INFILE '/home/oracle/data.dat'
    BADFILE '/home/oracle/bad.bad'
    DISCARDFILE '/home/oracle/dsc.dsc'
    DISCARDMAX 100000000APPEND INTO TABLE "DIV_STA"
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\''
    (a_id char(100) ,
     b_id char(100) ,
     name char(50) ,
     time DATE(19) "YYYY/MM/DD HH24:MI:SS" ,
     received DECIMAL EXTERNAL(40),
     success DECIMAL EXTERNAL(40),
     failed DECIMAL EXTERNAL(40)
    )脚本主要是根据sqlldr产生的日志文件中的成功和失败的数目来统计:path变量是存放日志的路径,db是统计数据要写入的数据库
    loaded=`cat $path | grep " successfully loaded." | awk '{print $db}'`;
    error1=`cat $path | grep " not loaded due to data errors." | awk '{print $db}'`;
    error2=`cat $path | grep "not loaded because all WHEN clauses were failed." | awk '{print $db}'`
    error3=`cat $path | grep " not loaded because all fields were null." | awk '{print $db}'`