将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较常用的两种导出表到文本的方法。

 

 

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