方法一:使用spool進行保存
- SQL> spool emp.txt
- SQL> select empno||','||ename||','||job||','||mgr||','||sal from emp;
- EMPNO||','||ENAME||','||JOB||','||MGR||','||SAL
- ----------------------------------------------------------------------------------------------------
- 7369,SMITH,CLERK,7902,800
- 7499,ALLEN,SALESMAN,7698,1600
- 7521,WARD,SALESMAN,7698,1250
- 7566,JONES,MANAGER,7839,2975
- 7654,MARTIN,SALESMAN,7698,1250
- 7698,BLAKE,MANAGER,7839,2850
- 7782,CLARK,MANAGER,7839,2450
- 7788,SCOTT,ANALYST,7566,3000
- 7839,KING,PRESIDENT,,5000
- 7844,TURNER,SALESMAN,7698,1500
- 7876,ADAMS,CLERK,7788,1100
- 7900,JAMES,CLERK,7698,950
- 7902,FORD,ANALYST,7566,3000
- 7934,MILLER,CLERK,7782,1300
- 14 rows selected.
- SQL> spool off;
自己寫了簡單腳本進行導出指定表到外部文本:
- #!/bin/bash
- ##jxp
- ##導出指定表結構
- tname=$1
- sqlplus -S scott/tiger <<EOF
- spool tname1.txt
- desc $tname
- spool off
- exit
- EOF
- ##截取表內字段名
- sed -n '3,$p' tname1.txt| awk '{print$1}' |sed '$d' >tname2.txt
- ##使用abcd.sed把字段名進行列轉行輸出並使用'||'作爲分隔符傳入tname_1
- tname_1=`sed -f abcd.sed tname2.txt`
- #echo $tname_1
- ##傳入表名,在sqlplus中進行選擇數據
- new_tname=$tname
- sqlplus -S scott/tiger <<EOF
- set pagesize 0;
- set linesize 300;
- set feedback off;
- alter session set nls_date_format='YYYY-MM-DD hh24:mi:ss'
- spool $new_tname.txt
- select $tname_1 from $new_tname;
- spool off
- exit;
- EOF
- ##刪除產生的臨時文件
- rm -rf tname*.txt
- #
需要修改的可能是登陸數據庫的用戶名了。其中腳本中用到了abcd.sed文件,下面列出此文件內容和作用:
- {
- N
- s/\n/\|\|\'||\'\|\|/g
- }
- {
- N
- s/\n/\|\|\'||\'\|\|/g
- }
- {
- N
- s/\n/\|\|\'||\'\|\|/g
- }
- {
- N
- s/\n/\|\|\'||\'\|\|/g
- }
- {
- N
- s/\n/\|\|\'||\'\|\|/g
- }
- {
- N
- s/\n/\|\|\'||\'\|\|/g
- }
此處指列出abcd.sed(abcd是隨便起的名字)的簡單幾行,如果導出的表的字段較多的話,需要補充abcd.sed的內容,直接複製粘貼以上內容就Ok。
abcd.sed的主要作用就是把需要導出表的字段進行合併使用“||”連接爲一行。分隔符“||”可以自己指定其他的符號替代。
腳本的使用:
把exp_table.sh和abcd.sed放到一個目錄下直接運行sh腳本,後面跟用戶下的表名
- [oracle@jxpred test_dir]$ nohup ./exp_table.sh dept
- [oracle@jxpred test_dir]$ cat dept.txt
- 10||ACCOUNTING||NEW YORK
- 20||RESEARCH||DALLAS
- 30||SALES||CHICAGO
- 40||OPERATIONS||BOSTON
方法二:使用oracle中的UTL_FILE
conn sys/oracle as sysdba
--在初始化參數文件中加入下面一行
utl_file_dir=d:\bk
- alter system set utl_file_dir='/home/oracle/exp' scope=spfile;
這個需要重啓數據庫,比較嚴重哦。
--其中\n爲換行
--%s爲替代字符,將來會被後面的1到5個參數替代,默認值爲NULL
--NEW_LINE 過程建立一個新的空行
- -------------------案例:將DEPT表的數據導入到文本中-----------------------------
- declare
- v_filehandle UTL_FILE.FILE_TYPE;
- begin
- v_filehandle:=utl_file.fopen('/home/oracle/exp','dept.txt','w');
- UTL_FILE.PUTF (v_filehandle,'表DEPT的文本數據,導出時間爲:%s\n', SYSDATE);
- UTL_FILE.NEW_LINE (v_filehandle);
- for i in(select * from scott.dept) loop
- UTL_FILE.PUTF (v_filehandle, '%s ,%s, %s\n',i.deptno,i.dname,i.loc);
- end loop;
- UTL_FILE.FCLOSE (v_filehandle);
- end;
- /
此方法需要將表的所用的字段都寫到UTL_FILE.PUTF後 :
- UTL_FILE.PUTF (out_file, '%s||%s||%s||%s||%s||',i.TYPEID,i.SYSTEMID,i.SOURCEID,i.SOURCENAME,i.DESTINATIONID);
- UTL_FILE.PUTF (out_file, '%s||%s||%s||%s||%s||',i.DESTINATIONNAME,i.REMARK,i.OPRTR,i.OPRT_TIME,i.SORT_NO);
- UTL_FILE.PUTF (out_file, '%s\n',i.PARENTID);
而且每個UTL_FILE.PUTF中最多只能有5個%s替代符。多的字段需要換行繼續寫UTL_FILE.PUTF內容。此處使用的是“||”作爲 分隔符,可以替換其他分隔符。
以上是oracle較常用的兩種導出表到文本的方法。