最近在用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请大家帮我解决一下,谢谢!
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.建立中间表 score_test
2.将txt数据全部导入到score_test
3.组织sql语句插入或更新到目的表。
例如:
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