c#配合oracle快速导入excel方法--原创(6万条记录5分钟左右)
原理:用c#采用读取Excel数据源方式将数据读入c#的datatable,循环datatable,将datatable中的数据用stringbuilder拼成insert into (字段名) valus (值);每5条插入一个@符号(作用是将sql字符串限制在4000字符以内),然后将拼成的字符串上传到数据库(实际上并没有上传到表中,只是保存在clob变量中),最后按@分隔符循环读取clob变量中的字符串,循环插入数据库,如下oracle存储过程
PROCEDURE p_exe_sql( p_sql in clob, p_editby IN VARCHAR2)ISv_text varchar2(4000);--每次读取的数据 --v_lob clob;lastpos integer :=1;inx integer;amt integer;--每次读取的字节数 len integer; exesql varchar2(4000);
BEGIN
--插入到臨時表INSURANCE_EMP_HISTORY
delete from INSURANCE_EMP_HISTORY;
commit;
len := dbms_lob.getlength(p_sql);
loop
begin
inx := dbms_lob.instr(p_sql,'@',lastpos,1);
amt := inx - lastpos;
if (inx =0) then
amt := len - lastpos;
if (amt <=0) then
exit; --對于最后一個字符剛好是@符號的情況
end if;
dbms_lob.read(p_sql,amt,lastpos,v_text);
else
dbms_lob.read(p_sql,amt,lastpos,v_text);
lastpos := inx + 1;
end if;
exesql := 'begin' || chr(10);
exesql:= exesql || replace(v_text,'\n',chr(10)) || chr(10);
exesql:= exesql || 'end;';
execute immediate exesql;
commit;
if (inx = 0) then
exit; -- 退出循环
end if;
EXCEPTION
when others then
raise;
end;
end loop;
END p_exe_sql;