sqlldr導入數據(以PostgreSql>>>Oracle為例)


1.在目標數據庫中創建表

  1.1點擊源表,復制創建語句

  1.2 修改數據類型以匹配目標數據庫,如:

    字符串類型:character varying(20)>>>varchar2(20)

    數字類型:numeric(19,2)>>>number(19,2)

    時間戳:timestamp without time zone>>>timestamp或date

  1.3 其他

    一般字符串類型需要加長長度,不然有時會插不進去數據,不知為什么;

    P和O數據庫的not null default * 語句位置剛好相反;

2.導出csv格式數據

  copy call to '/tmp/call.csv' DELIMITER ',' NULL '' CSV [QUOTE '"' FORCE QUOTE 跟這個表的所有列名]

 

這樣就可以將數據導出了,需要注意的是:

  ①有時數據量較大會出現導出失敗,如

解決辦法:用select的方式導出

  ②[QUOTE '"' FORCE QUOTE 跟這個表的所有列名的數組形式]

    沒用過,表示給每個列的數據都加上“”,在PostgreSql中,獲取表的所有列名的數組形式的語句如下:

1  SELECT array_to_string(array(    
2             select attname from pg_attribute where attrelid = '表名稱' ::regclass and attnum > 0
3             and attisdropped = 'f'   
4             ), ',') as name

  有興趣可以試試。

3.下載csv文件

4.編輯*.ctl控制文件

 1 load data
 2 CHARACTERSET UTF8
 3 infile "/home/oracle/hthhf.csv"
 4 truncate
 5 into table t_yw_hthhf_old
 6 fields terminated by ","
 7 OPTIONALLY ENCLOSED BY '"'
 8 trailing nullcols
 9 (
10   列名1 integer external ,
11   列名2 timestamp "YYYY-MM-DD hh24:mi:ss" ,
12   列名3,13   列名4 float  external
14 )

表示將/home/oracle/hthhf.csv的數據傳入表t_yw_hthhf_old中,用逗號分割。需要注意的是下面括號中的部分,字符串型不加修飾,整型和浮點型分別加integer/float external,日期加timestamp "YYYY-MM-DD hh24:mi:ss"。

5.上傳csv和ctl文件至目標服務器(略);

6.在目標服務器切換成oracle用戶,並執行一下命令:

sqlldr userid=用戶名/密碼 control=ctl文件的全路徑;

比如我上傳到/home/oracle下了,則control=/home/oracle/hthhf.ctl

7.其他問題

導入后需要查看目標數據庫,檢查是否全部導入,如果數據不全,或在執行命令時異常,需要查看與ctl文件同目錄下的log,與ctl同名,里面會記錄錯誤原因。目前見過的錯誤有:字段中的內容含有換行或字段長度不夠等等,依次解決即可。

 


免責聲明!

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



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