將oracle庫中表導出爲外部文本並指定分隔符

 方法一:使用spool進行保存sql

 

 

  
  
  
  
  1. SQL> spool emp.txt 
  2.  
  3. SQL> select empno||','||ename||','||job||','||mgr||','||sal from emp; 
  4.  
  5.  
  6.  
  7. EMPNO||','||ENAME||','||JOB||','||MGR||','||SAL 
  8.  
  9. ---------------------------------------------------------------------------------------------------- 
  10.  
  11. 7369,SMITH,CLERK,7902,800 
  12.  
  13. 7499,ALLEN,SALESMAN,7698,1600 
  14.  
  15. 7521,WARD,SALESMAN,7698,1250 
  16.  
  17. 7566,JONES,MANAGER,7839,2975 
  18.  
  19. 7654,MARTIN,SALESMAN,7698,1250 
  20.  
  21. 7698,BLAKE,MANAGER,7839,2850 
  22.  
  23. 7782,CLARK,MANAGER,7839,2450 
  24.  
  25. 7788,SCOTT,ANALYST,7566,3000 
  26.  
  27. 7839,KING,PRESIDENT,,5000 
  28.  
  29. 7844,TURNER,SALESMAN,7698,1500 
  30.  
  31. 7876,ADAMS,CLERK,7788,1100 
  32.  
  33. 7900,JAMES,CLERK,7698,950 
  34.  
  35. 7902,FORD,ANALYST,7566,3000 
  36.  
  37. 7934,MILLER,CLERK,7782,1300 
  38.  
  39.  
  40.  
  41. 14 rows selected. 
  42.  
  43.  
  44.  
  45. SQL> spool off; 

本身寫了簡單腳本進行導出指定表到外部文本:數據庫

 

 

  
  
  
  
  1. #!/bin/bash 
  2.  
  3. ##jxp    
  4.  
  5. ##導出指定表結構 
  6.  
  7. tname=$1 
  8.  
  9. sqlplus -S scott/tiger <<EOF 
  10.  
  11. spool tname1.txt 
  12.  
  13. desc $tname 
  14.  
  15. spool off 
  16.  
  17. exit 
  18.  
  19. EOF 
  20.  
  21.  
  22.  
  23. ##截取表內字段名 
  24.  
  25. sed -n '3,$p' tname1.txt| awk '{print$1}' |sed '$d' >tname2.txt 
  26.  
  27.  
  28.  
  29. ##使用abcd.sed把字段名進行列轉行輸出並使用'||'做爲分隔符傳入tname_1 
  30.  
  31.  
  32.  
  33. tname_1=`sed -f abcd.sed tname2.txt` 
  34.  
  35. #echo $tname_1 
  36.  
  37. ##傳入表名,在sqlplus中進行選擇數據 
  38.  
  39. new_tname=$tname 
  40.  
  41. sqlplus -S scott/tiger <<EOF 
  42.  
  43. set pagesize 0; 
  44.  
  45. set linesize 300; 
  46.  
  47. set feedback off; 
  48.  
  49. alter session set nls_date_format='YYYY-MM-DD hh24:mi:ss' 
  50.  
  51.  
  52.  
  53. spool $new_tname.txt 
  54.  
  55. select $tname_1  from  $new_tname; 
  56.  
  57. spool off 
  58.  
  59. exit; 
  60.  
  61. EOF 
  62.  
  63. ##刪除產生的臨時文件 
  64.  
  65. rm -rf tname*.txt 
  66.  

 

須要修改的多是登錄數據庫的用戶名了。其中腳本中用到了abcd.sed文件,下面列出此文件內容和做用:
 
  
  
  
  
  1. s/\n/\|\|\'||\'\|\|/g 
  2. s/\n/\|\|\'||\'\|\|/g 
  3. s/\n/\|\|\'||\'\|\|/g 
  4. s/\n/\|\|\'||\'\|\|/g 
  5. s/\n/\|\|\'||\'\|\|/g 
  6. s/\n/\|\|\'||\'\|\|/g 
此處指列出abcd.sed(abcd是隨便起的名字)的簡單幾行,若是導出的表的字段較多的話,須要補充abcd.sed的內容,直接複製粘貼以上內容就Ok。
abcd.sed的主要做用就是把須要導出表的字段進行合併使用「||」鏈接爲一行。分隔符「||」能夠本身指定其餘的符號替代。

 

腳本的使用:bash

把exp_table.sh和abcd.sed放到一個目錄下直接運行sh腳本,後面跟用戶下的表名session

  
  
  
  
  1. [oracle@jxpred test_dir]$ nohup ./exp_table.sh dept 
  2.  
  3. [oracle@jxpred test_dir]$ cat dept.txt  
  4.  
  5. 10||ACCOUNTING||NEW YORK 
  6.  
  7. 20||RESEARCH||DALLAS 
  8.  
  9. 30||SALES||CHICAGO 
  10.  
  11. 40||OPERATIONS||BOSTON 

 

 

方法二:使用oracle中的UTL_FILEoracle

conn sys/oracle as sysdbaide

--在初始化參數文件中加入下面一行oop

utl_file_dir=d:\bkspa

  
  
  
  
  1. alter system set utl_file_dir='/home/oracle/exp' scope=spfile

這個須要重啓數據庫,比較嚴重哦。orm

 

--其中\n爲換行xml

--%s爲替代字符,未來會被後面的1到5個參數替代,默認值爲NULL

--NEW_LINE 過程創建一個新的空行

 
  
  
  
  
  1. -------------------案例:將DEPT表的數據導入到文本中----------------------------- 
  2. declare 
  3. v_filehandle UTL_FILE.FILE_TYPE; 
  4. begin 
  5. v_filehandle:=utl_file.fopen('/home/oracle/exp','dept.txt','w'); 
  6. UTL_FILE.PUTF (v_filehandle,'表DEPT的文本數據,導出時間爲:%s\n', SYSDATE); 
  7. UTL_FILE.NEW_LINE (v_filehandle); 
  8. for i in(select * from scott.dept) loop 
  9. UTL_FILE.PUTF (v_filehandle, '%s ,%s, %s\n',i.deptno,i.dname,i.loc); 
  10. end loop; 
  11. UTL_FILE.FCLOSE (v_filehandle); 
  12. end; 
 
此方法須要將表的所用的字段都寫到 UTL_FILE.PUTF後 :
 
  
  
  
  
  1. UTL_FILE.PUTF (out_file, '%s||%s||%s||%s||%s||',i.TYPEID,i.SYSTEMID,i.SOURCEID,i.SOURCENAME,i.DESTINATIONID); 
  2. UTL_FILE.PUTF (out_file, '%s||%s||%s||%s||%s||',i.DESTINATIONNAME,i.REMARK,i.OPRTR,i.OPRT_TIME,i.SORT_NO); 
  3. UTL_FILE.PUTF (out_file, '%s\n',i.PARENTID); 
並且每一個UTL_FILE.PUTF中最多隻能有5個%s替代符。多的字段須要換行繼續寫UTL_FILE.PUTF內容。此處使用的是「||」做爲 分隔符,能夠替換其餘分隔符。

以上是oracle較經常使用的兩種導出表到文本的方法。

相關文章
相關標籤/搜索