原理:用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;