loyou

导航

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;


posted on 2009-11-19 20:45  loyou  阅读(611)  评论(0编辑  收藏  举报