如何把excel數據導入數據庫


這里介紹2種把excel數據導入oracle數據庫的方法。

 

1. 在excel中生成sql語句。

 

1)在數據列的右側,第一行的任何位置輸入="insert into table(xx,yyy..) values('"&A2&"', '"&B2&"'….);"

注意:

  •  整個sql語句用雙引號套着。
  • values值中使用 "&A2&"  來引用A列的第二行數據,再外面的單引號是因為values中的值(varchar型)需要單引號。

2)寫完一行后往下拖,自動生成其他行的sql。

3)把這些sql copy到pl/sql dev工具中執行。

 

這種方法適合數據量不太大,且只含有varchar(或者說轉入數據庫中都為varchar類型字段)這種簡單的數據類型的數據。對於含有日期類型的要注意,如果excel格式中有日期類型的,使用這種方法引用出來的值是個浮點數。需要首先把日期格式轉換成文本格式。再寫sql語句,它才能引用正確的日期格式的值。insert into user_test(seq, msisdn,user_name,dt,comment1,comment2) values('1','13597093898','張三42',to_date('2013/2/8 20:00:01','yyyy/mm/dd HH24:mi:ss'),'yyyy','yyyyy');

 

 

但存在以下情況不建議用這種方法了。

1. 對於數據量很大,幾十萬,上百萬的數據。

2. 如果數據庫表存在由序列生成的列。

3. 存在日期格式列的excel。——我沒有找到很方便的直接把日期格式轉為文本格式的方法(如直接轉換成文本,它會顯示成浮點),因此存在日期格式的excel列不建議采用這種方法。

 

當然第二點,還是可以通過其他方法解決的,就是寫觸發器。

在寫insert語句插入的列不包含序列的列,寫觸發器,當表進行insert之前生成序列號插入。

 

假設數據庫表如下

 

create table user_test ( seq number(10) primary key, msisdn varchar2(11) not null, user_name varchar2(50) not null, dt date, comment1 varchar2(50), comment2 varchar2(50) ); create sequence user_test_seq INCREMENT BY 1 -- 每次加幾個
 START WITH 1 -- 從1開始計數
 insert變成這樣寫: insert into user_test(msisdn,user_name,dt,comment1,comment2) values('13597093898','張三42',to_date('2013/2/8 20:00:01','yyyy/mm/dd HH24:mi:ss'),'yyyy','yyyyy'); 

 

 

觸發器:

 

CREATE OR REPLACE TRIGGER my_trigger BEFORE INSERT

  ON user_test  FOR EACH ROW WHEN (new.seq is null) BEGIN

  SELECT user_test_seq.nextval INTO :new.seq  FROM DUAL; END my_trigger;

 

 

其中:new.seq是指新列中的seq字段。

 

 

為更好的解決這些問題, 下面介紹第二種方法。

 

2. 寫loader

 

1) 把excel中的數據另存為.csv文件,字段逗號分隔。假設保存為gov.csv

2 )寫ctl文件:

 

 gov.ctl

LOAD DATA INFILE 'gov.csv' APPEND INTO TABLE user_test FIELDS TERMINATED BY ',' trailing nullcols //下面列先后順序同文件中數據字段的順序。 ( seq "user_test_seq.nextval", MSISDN, user_name, DT date "yyyy/mm/dd HH24:mi", comment1 , comment2 )

 

 

3) 寫par文件, 假設名為test.par,其內容為:

userid=用戶/密碼 control=./gov.ctl log=./t.log bad=./t.bad skip=1            //跳過第一行標題 rows=10000   //每n行commit一次

 

 

4)sqlldr parfile=test.par

 

在我的服務器上,導入百多萬的數據應該是一分鍾之內的事。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM