一定要UTL_FILE做? create or replace procedure test as f UTL_FILE.file_type; s varchar2(200); a varchar2(200); path varchar2(50); begin path:='c:'; f:=utl_file.fopen('c:','aa.CSV','R'); loop utl_file.get_line(f,s); N:=INSTR(S,',',1,1); a := substr(s,.....) select count(*) into i from aa where aa = a; if i > 0 then update .... set ... else insert into ..... end if; end loop; utl_file.fclose(f); COMMIT; EXCEPTION when NO_DATA_FOUND then utl_file.fclose(f); rollback; end; / 写到这里自己修改一吧。
虽然会慢一些,但为了保证安全性,因为你的原表里也有很多数据~~SQLloader是直接写入数据文件,而不使用回滚段的
即是说:SQLloader写入数据是没办法rollback的
为什么不可以用UTL_FILE来得到数据,然后插入到数据表中
utl_file包读文件有弊端的:
1:文件必须在数据库服务器上
2:utl_file读文件必须一行一行的读,小文件还可以
但象楼主说的100万条数据的文件,读取速度是你所无法接受的
create or replace procedure test as
f UTL_FILE.file_type;
s varchar2(200);
a varchar2(200);
path varchar2(50);
begin
path:='c:';
f:=utl_file.fopen('c:','aa.CSV','R');
loop
utl_file.get_line(f,s);
N:=INSTR(S,',',1,1);
a := substr(s,.....)
select count(*) into i from aa where aa = a;
if i > 0 then
update .... set ...
else
insert into .....
end if;
end loop;
utl_file.fclose(f);
COMMIT;
EXCEPTION
when NO_DATA_FOUND then
utl_file.fclose(f);
rollback;
end;
/
写到这里自己修改一吧。
我这个更新程序每天要运行一次,做法是不是这样:先把文件数据导入到临时表,然后再作一个存储过程让临时表和正式表比较,进行更新和插入操作。拜托各位存储过程该怎么写,因为我一直用mysql。谢谢各位!