日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

oracle spool 用法及執(zhí)行.sql文件

 安素暖 2019-06-27

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.." 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多