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

 方法一:使用spool進行保存

 

 

  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的主要作用就是把需要導出表的字段進行合併使用“||”連接爲一行。分隔符“||”可以自己指定其他的符號替代。

 

腳本的使用:

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

  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_FILE

conn sys/oracle as sysdba

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

utl_file_dir=d:\bk

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

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

 

--其中\n爲換行

--%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較常用的兩種導出表到文本的方法。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章