spool用法: 在PL/SQL developer 里面打開(kāi)COMMAND Windown(命令窗口): SQL> spool d:\1.txt Started spooling to d:\1.txt SQL>(輸入查詢(xún)SQL) SQL>spool off Stopped spooling to d:\1.txt 就可以在d盤(pán)找到文件1.txt,文件里有查詢(xún)SQL所查詢(xún)的數(shù)據(jù)了。 執(zhí)行SQL文件: SQL>start d:\1.sql 就可以運(yùn)行1.sql文件中的語(yǔ)句了。
關(guān)于SPOOL(SPOOL是SQLPLUS的命令,不是SQL語(yǔ)法里面的東西。)
對(duì)于SPOOL數(shù)據(jù)的SQL,最好要自己定義格式,以方便程序直接導(dǎo)入,SQL語(yǔ)句如: select taskindex||'|'||commonindex||'|'||tasktype||'|'||to_number(to_char(sysdate,'YYYYMMDD')) from ssrv_sendsms_task;
spool常用的設(shè)置 set colsep' '; //域輸出分隔符 set echo off; //顯示start啟動(dòng)的腳本中的每個(gè)sql命令,缺省為on set feedback off; //回顯本次sql命令處理的記錄條數(shù),缺省為on set heading off; //輸出域標(biāo)題,缺省為on set pagesize 0; //輸出每頁(yè)行數(shù),缺省為24,為了避免分頁(yè),可設(shè)定為0。 set termout off; //顯示腳本中的命令的執(zhí)行結(jié)果,缺省為on set trimout on; //去除標(biāo)準(zhǔn)輸出每行的拖尾空格,缺省為off set trimspool on; //去除重定向(spool)輸出每行的拖尾空格,缺省為off
導(dǎo)出文本數(shù)據(jù)的建議格式: SQL*PLUS環(huán)境設(shè)置SET NEWPAGE NONE SET HEADING OFF SET SPACE 0 SET PAGESIZE 0 SET TRIMOUT ON SET TRIMSPOOL ON SET LINESIZE 2500
注:LINESIZE要稍微設(shè)置大些,免得數(shù)據(jù)被截?cái)?,它?yīng)和相應(yīng)的TRIMSPOOL結(jié)合使用防止導(dǎo)出的文本有太多的尾部空格。但是如果LINESIZE設(shè)置太大,會(huì)大大降低導(dǎo)出的速度,另外在WINDOWS下導(dǎo)出最好不要用PLSQL導(dǎo)出,速度比較慢,直接用COMMEND下的SQLPLUS命令最小化窗口執(zhí)行。
對(duì)于字段內(nèi)包含很多回車(chē)換行符的應(yīng)該給與過(guò)濾,形成比較規(guī)矩的文本文件。通常情況下,我們使用SPOOL方法,將數(shù)據(jù)庫(kù)中的表導(dǎo)出為文本文件的時(shí)候會(huì)采用兩種方法,如下述:
方法一:采用以下格式腳本 set colsep '|' --設(shè)置|為列分隔符 set trimspool on set linesize 120 set pagesize 2000 set newpage 1 set heading off set term off set num 18 set feedback off spool 路徑+文件名 select * from tablename; spool off
方法二:采用以下腳本 set trimspool on set linesize 120 set pagesize 2000 set newpage 1 set heading off set term off spool 路徑+文件名 select col1||','||col2||','||col3||','||col4||'..' from tablename; spool off
比較以上方法,即方法一采用設(shè)定分隔符然后由sqlplus自己使用設(shè)定的分隔符對(duì)字段進(jìn)行分割,方法二將分隔符拼接在SELECT語(yǔ)句中,即手工控制輸出格式。
在實(shí)踐中,發(fā)現(xiàn)通過(guò)方法一導(dǎo)出來(lái)的數(shù)據(jù)具有很大的不確定性,這種方法導(dǎo)出來(lái)的數(shù)據(jù)再由sqlldr導(dǎo)入的時(shí)候出錯(cuò)的可能性在95%以上,尤其對(duì)大批量的數(shù)據(jù)表,如100萬(wàn)條記錄的表更是如此,而且導(dǎo)出的數(shù)據(jù)文件狂大。
而方法二導(dǎo)出的數(shù)據(jù)文件格式很規(guī)整,數(shù)據(jù)文件的大小可能是方法一的1/4左右。經(jīng)這種方法導(dǎo)出來(lái)的數(shù)據(jù)文件再由sqlldr導(dǎo)入時(shí),出錯(cuò)的可能性很小,基本都可以導(dǎo)入成功。
因此,實(shí)踐中我建議大家使用方法二手工去控制spool文件的格式,這樣可以減小出錯(cuò)的可能性,避免走很多彎路。
自測(cè)例:將ssrv_sendsms_task表中的數(shù)據(jù)導(dǎo)出到文本(數(shù)據(jù)庫(kù)Oracle 9i 操作系統(tǒng) SUSE LINUX Enterprise Server 9)
spool_test.sh腳本如下: #!/bin/sh DB_USER=zxdbm_ismp #DB USER DB_PWD=zxin_smap #DB PASSWORD DB_SERV=zx10_40_43_133 #DB SERVICE NAME
sqlplus -s $DB_USER/$DB_PWD@$DB_SERV<<EOF # -s 參數(shù)屏蔽打印到屏幕上的其他信息,只顯示sql執(zhí)行后從DB中查詢(xún)出來(lái)的信息,過(guò)濾掉spool函數(shù)執(zhí)行時(shí)在文件中寫(xiě)入的其他信息。 set trimspool on set linesize 120 set pagesize 2000 set newpage 1 set heading off set term off spool promt.txt select taskindex||'|'||commonindex||'|'||tasktype||'|'||to_number(to_char(sysdate,'YYYYMMDD')) from ssrv_sendsms_task; spool off EOF
執(zhí)行./spool_test.sh后生成sp_test.txt,內(nèi)容如下: 83|115|1|20080307 85|115|11|20080307 86|115|10|20080307 84|115|2|20080307 6|5|14|20080307 7|5|12|20080307 9|5|15|20080307
注:上面自測(cè)例中,spool
promt.txt中的目標(biāo)生成文件promt.txt,在HP-UNX環(huán)境下的shell腳本中調(diào)用Oracle的spool函數(shù),如果將上述邏輯代碼封裝為一個(gè)function,然后來(lái)調(diào)用這個(gè)function的話,則在shell腳本中最終是不會(huì)生成promt.txt文件的。只能直接執(zhí)行邏輯代碼,封裝后則spool函數(shù)失效。
對(duì)于promt.txt在相對(duì)路徑下,下面2中方法在shell環(huán)境中執(zhí)行時(shí),兩者只能擇一,兩者并存則spool函數(shù)會(huì)失效。假設(shè)promt.txt文件生成的路徑為:/home/zxin10/zhuo/batchoperate/spoolfile 方式[1] echo "start spool in shell.."
sqlplus -s zxdbm_ismp/zxin_smap<<EOF set pagesize 0 set echo off feed off term off heading off trims off set colsep '|' set trimspool on set linesize 10000 set trimspool on set linesize 120 set newpage 1 spool /home/zxin10/zhuo/batchoperate/spoolfile/promt.txt select
batchindex||'|'||productid||'|'||contentid||'|'||optype||'|'||uploadfile
from zxdbm_700.s700_batch_operation where status=1; spool off EOF echo "end.." 方式[2] echo "start spool in shell.." cd /home/zxin10/zhuo/batchoperate/spoolfile sqlplus -s zxdbm_ismp/zxin_smap<<EOF set pagesize 0 set echo off feed off term off heading off trims off set colsep '|' set trimspool on set linesize 10000 set trimspool on set linesize 120 set newpage 1 spool promt.txt select
batchindex||'|'||productid||'|'||contentid||'|'||optype||'|'||uploadfile
from zxdbm_700.s700_batch_operation where status=1; spool off EOF echo "end.."
|