最近在用sqlldr 将txt 文档中的数据上传到oracle 数据库中,在这个过程中有几个问题请大家帮我解决一下。比如我的ctl 文件如下:LOAD DATA
INFILE 'C:\T_STUDENT.TXT'
REPLACE
INTO TABLE T_STUDENT
FIELDS TERMINATED BY "|" TRAILING NULLCOLS
(ID,NAME,SCORE)数据如下:0001|marry|90.00
          0002|jim|85.50
          0003|rose|问题1: 如果0001 已经在数据t_student中存在则不上传,否则上传。(id 是主键)
问题2: 如何实现只上传score 大于86的记录
问题3: 我的score为数据类型为number 0003 会报错,因为这条记录的scroe 为null请大家帮我解决一下,谢谢!

解决方案 »

  1.   

    建议:
    1.建立中间表 score_test
    2.将txt数据全部导入到score_test
    3.组织sql语句插入或更新到目的表。
      

  2.   

    用中间表也有问题的,比如我可能是分批loader 数据,每次上传10万笔,这样可能造成很多数据重复!
      

  3.   

    建议加一个view和instead触发器,sqlldr数据到view中间,然后通过instead触发器判断是否需要插入到表中。
    例如:
    SQL> create table t_student(id char(4), name varchar2(20), score number(5,2), constraint pk_student primary key(id));表已创建。SQL> insert into t_student values('0001','aaa',89);已创建 1 行。SQL> insert into t_student values('0005','bbb',95);已创建 1 行。SQL> commit;提交完成。SQL> l
      1  create or replace trigger tri_v_student
      2  instead of insert on v_student for each row
      3  declare
      4    i number;
      5  begin
      6    if :new.score>=86 then
      7      select count(*) into i from t_student where id=:new.id;
      8      if i=0 then
      9        insert into t_student(id,name,score) values(:new.id, :new.name, :new.score);
     10      end if;
     11    end if;
     12* end;
    SQL> /触发器已创建SQL> select * from t_student;ID   NAME                      SCORE
    ---- -------------------- ----------
    0001 aaa                          89
    0005 bbb                          95SQL> host type t_student.txt
    0001|marry|90.00
    0002|jim|85.50
    0003|rose|
    0011|tom|86.00SQL> host type student.ctl
    LOAD DATA
    INFILE 'T_STUDENT.TXT'
    append
    INTO TABLE V_STUDENT
    FIELDS TERMINATED BY "|" TRAILING NULLCOLS
    (ID,NAME,SCORE)
    SQL> host sqlldr userid=fang/fang control=student.ctl log=student.logSQL*Loader: Release 10.2.0.1.0 - Production on 星期二 6月 17 14:13:02 2008Copyright (c) 1982, 2005, Oracle.  All rights reserved.达到提交点 - 逻辑记录计数 4SQL> select * from t_student;ID   NAME                      SCORE
    ---- -------------------- ----------
    0011 tom                          86
    0001 aaa                          89
    0005 bbb                          95