程序人生

          記錄編程中的點點滴滴

          Oracle sqllder 數據導入

          操作環境

          客戶端 Oracle 10g

          服務端 Oracle 11g

          1、數據準備

          1.1、在sqlplus下將相關表將相關待導入數據導出為txt文件

          --sqlplus腳本
          Set linesize 3000    --每行長3000
          Set pagesize 0       --指定不分頁
          Set heading off      --不輸出標題行
          Set feedback off     --不輸出反饋信息
          Set echo off         --不顯示命令本身
          Set termout off      --不顯示終端信息
          Set trimout On       --截斷終端顯示空格
          Set trimspool On     --截斷輸出至日志空格
          spool c:\a.txt       --指定屏幕輸出到相關文件
          spool off            --關閉指定輸出

          以上腳本控制sqlplus控制臺輸出打印效果, 同時指定屏幕的打印輸出將轉錄入到何文件中

          實際腳本

          sqlplus zhsj/zhsj@zhsj
          Set linesize 3000   
          Set pagesize 0      
          Set heading off     
          Set feedback off    
          Set echo off        
          Set termout off     
          Set trimout On      
          Set trimspool On    
          spool c:\a.txt      
          select employee_id||'|'||employee_name||'|'||employee_salary from t_employee;
          spool off           

          以上會將t_employee表中的 employee_id、employee_name、employee_salary 三列數據以如下形式寫入c:\a.txt 文件中

          1|znp|80000.00
          2|zhsj|40000.00
          3|xxx|30000.00

          數據準備完成后編寫sqlldr要用到的ctl文件,用于將txt文件中的數據導入到數據庫中,腳本如下 (--部分實際腳本中須刪險)

          -- a.ctl
          Load data   --加載數據
          infile a.txt    --加載數據文件名稱(現在是相對路徑,可以寫成絕對路徑c:\bak.txt)
          badfile a.bad                   --失敗數據寫入文件
          append                     -- append 追加  truncate truncate delete 刪除
          into table t_employee_bak    --插入操作表
          FIELDS TERMINATED BY '|'                 --根據指定標識符隔斷各字段值 OPTIONALLY ENCLOSED BY '"'  過濾掉指定的標識符,如"等
          (employee_id,                                 --指定插入字段及數據
          employee_name,
          employee_salary)

          準備完成后,在cmd下輸入

          sqlldr -userid zhsj/zhsj@zhsj control=c:\a.ctl  

          執行,在t_employee_bak表中可以見到a.txt中的數據已導入

          在執行過程如果出現數據沒有導入的情況,可能原因會有以下幾種情況

          1、在導出的數據文件中存在同時打印輸出的命令行,將命令行刪除后重新保存文件即可將數據正常插入到數據庫中
          2、雖然文本中已是正確的數據但仍然無法導入,此時在執行的SQL腳本中增加一個間隔符的輸出,即

          select employee_id||'|'||employee_name||'|'||employee_salary from t_employee;

          改為

          select employee_id||'|'||employee_name||'|'||employee_salary||'|' from t_employee;

          此時將會正常導入,這是因為列值存在空數據導致間隔計算問題

          以上為txt格式數據文件導出

          對于異質數據庫,可以采用sqldeveloper等工具將相關數據庫中數據以csv格式導出,此時在編寫執行腳本時須變更如下

          -- a.ctl
          Load data   --加載數據
          infile a.txt    --加載數據文件名稱(現在是相對路徑,可以寫成絕對路徑c:\bak.txt)
          badfile a.bad                   --失敗數據寫入文件
          append                           -- append 追加  truncate truncate delete 刪除
          into table t_employee_bak    --插入操作表
          FIELDS TERMINATED BY ','   OPTIONALLY ENCLOSED BY '"'   --根據指定標識符隔斷各字段值 OPTIONALLY ENCLOSED BY '"'  過濾掉指定的標識符,如"等
          (employee_id,                                 --指定插入字段及數據
          employee_name,
          employee_salary)

          因為csv格式文件在用txt打開可以看到數據文件格式為"1","znp","80000.00",需要將' " '標識符去掉,才可以正常導入

          大數據量時csv格式文件會比txt格式文件大3倍左右,且導入時可能出現問題,所以盡量采用txt文件方式導入



          posted on 2010-12-24 09:49 zhaonp 閱讀(1338) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 台州市| 长治市| 福建省| 寻乌县| 平原县| 沙洋县| 赣州市| 克山县| 霸州市| 台北市| 曲水县| 玉山县| 万全县| 罗定市| 义马市| 深州市| 化州市| 鄂托克旗| 苍梧县| 任丘市| 凉城县| 博兴县| 宜宾县| 阿合奇县| 华安县| 自贡市| 麻栗坡县| 台东市| 昌江| 东乡族自治县| 中江县| 自治县| 开江县| 衡东县| 河南省| 达拉特旗| 石河子市| 罗江县| 兰西县| 洱源县| 建宁县|