spool用法小結


まず、投稿を見てください.http://www.itpub.net/thread-317699-1-1.html
SQLPLUSのSPOOL機能を使用すると、非常に強力で豊富なレポート出力を得ることができます.SQLPLUSは極めて複雑なフォーマット情報を設定できますが、多くの場合、あなたが望んでいない情報があります.
生産では、比較的大きなテーブル値をローカルテキストファイルにインポートする必要があることがよくあります.方法はいろいろありますが、一般的に使われているのはspoolコマンドです.このコマンドの実装と、2つの実装方法の比較について説明します.
要求されたフォーマットに合致するデータファイルを出力するには、select時に文字接続でフォーマットを規範化するだけです.例えば次の表があります
SQL>; select id,username,password from myuser;//   
1 John       1234
2 Jack       12345
3 Rose       2345
4 Joe        384657
5 Tom        384655
6 Jordan     384455

1,John,1234に適合するデータフォーマットを出力するには、select id|','||username|','||password|','from myuserという文を使用します.
SQL>; select id||','||username||','||password||',' from myuser;
1,John,1234,
2,Jack,12345,

次のようなスクリプトを書けば、要求されたフォーマットに合致するデータをファイルに出力できます.他に不要なものは含まれません.データ部分だけです.
-スクリプトファイル名はexpmyusr.sqlで、eディスクの下に保存されます.
 データを格納するファイル名はe:exp.txt
set echo on            --             
set feedback off       --     *   rows   selected  
set heading off        --         
set verify off         --                。fil
set trimspool off      --     
set pagesize 1000      --    
set linesize 50//linesize           ,         
define fil= 'e:\exp.txt'
prompt *** Spooling to &fil
spool &fil
select id||','||username||','||'"'||password||'"' from myuser;
spool off;
-実行プロセスSQL>;@e:\expmyusr.sql *** Spooling to e:\exp.txt 1,John,"1234"2,Jack,"12345"3,Rose,"2345"4,Joe,"384657"5,Tom,"384655"6,Jordan,"384455"
検査の結果、要求に合致することが分かった.
私自身のテスト結果は以下の通りです.
まずexptest.sqlスクリプトをeディスクの下に作成します.その内容は次のとおりです.
set echo on set feedback on set heading on set verify off set trimspool off set pagesize 1000 set linesize 50 define fil= 'e:\exp.txt' prompt *** Spooling to &fil spool &fil select object_id||','||object_name||','||'"'||owner||'"' from t; spool off; 
上記のスクリプトを実行します.
SQL> @e:\exptest.sql SQL> set echo on  SQL> set feedback on SQL> set heading on SQL> set verify off SQL> set trimspool off SQL> set pagesize 1000 SQL> set linesize 50 SQL> define fil= 'e:\exp.txt' SQL> prompt *** Spooling to &fil *** Spooling to e:\exp.txt SQL> spool &fil SQL> select object_id||','||object_name||','||'"'||owner||'"' from t; OBJECT_ID||','||OBJECT_NAME||','||'"'||OWNER||'"' -------------------------------------------------- 20,ICOL$,"SYS"44,I_USER1,"SYS"28,CON$,"SYS"15,UNDO$,"SYS"29,C_COBJ#,"SYS"3,I_OBJ#,"SYS"25,PROXY_ROLE_DATA$,"SYS"39,I_IND1,"SYS"51,I_CDEF2,"SYS"26,I_PROXY_ROLE_DATA$_1,"SYS"17,FILE$,"SYS"13,UET$,"SYS"9,I_FILE#_BLOCK#,"SYS"41,I_FILE1,"SYS"48,I_CON1,"SYS"38,I_OBJ3,"SYS"7,I_TS#,"SYS"53,I_CDEF 4、SYS 19、IND$、SYS 14、SEG$、SYS 20行が選択されています.SQL> spool off;
——スクリプト実行終了
Oracle SPOOLの2つの方法の比較 
通常、SPOOLメソッドを使用して、データベース内のテーブルをテキストファイルにエクスポートする場合は、次の2つの方法が使用されます.
方法1:以下のフォーマットスクリプトを使用する
set colsep '' ------      
set trimspool on
set linesize 120
set pagesize 2000
set newpage 1
set heading off
set term off
spool   +   
select * from tablename;
spool off

方法2:以下のスクリプトを採用する
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

以上の方法を比較すると,方法1は区切り記号を設定してからsqlplus自身が設定した区切り記号を用いてフィールドを分割し,方法2は区切り記号をSELECT文に接合する,すなわち出力フォーマットを手動で制御する.
実際には、方法によって導出されたデータには大きな不確実性があることを発見しました.この方法で導出されたデータがsql ldrからインポートされたときにエラーが発生する可能性は95%以上で、特に大量のデータテーブル、例えば100万個の記録されたテーブルに対してはなおさらで、導出されたデータファイルは狂っています.
メソッド2でエクスポートされるデータファイルのフォーマットは整然としており、データファイルのサイズはメソッド1の1/4程度である可能性があります.この方法で導出したデータファイルをsqlldrからインポートすると,エラーの可能性は小さく,基本的にインポートに成功する.
そこで、実際には、spoolファイルのフォーマットを手動で制御する方法をお勧めします.これにより、エラーの可能性を低減し、多くの曲がり角を避けることができます. 
spoolに関するいくつかの紹介を参照してください.http://space.itpub.net/action-tag-tagname-spool