sqlplus を使用して、Oracle のテーブルから csv をスプールする必要があります。必要な形式は次のとおりです。
"HOST_SITE_TX_ID","SITE_ID","SITETX_TX_ID","SITETX_HELP_ID"
"664436565","16","2195301","0"
"664700792","52","1099970","0"
以下は、私が書いたシェル スクリプトの関連部分です。
sqlplus -s $sql_user/$sql_password@$sid << eof >> /dev/null
set feedback off
set term off
set linesize 1500
set pagesize 11000
--set colsep ,
--set colsep '","'
set trimspool on
set underline off
set heading on
--set headsep $
set newpage none
spool "$folder$filename$ext"
select '"'||PCL_CARRIER_NAME||'","'||SITETX_EQUIP_ID||'","'||SITETX_SITE_STAT||'","'||SITETX_CREATE_DATE||'","'||ADVTX_VEH_WT||'"'
from cvo_admin.MISSING_HOST_SITE_TX_IDS;
spool off
(私が試したがうまくいかなかったことを示すために、いくつかのコメント付きステートメントを使用しました)
私が受け取る出力は次のとおりです。
'"'||PCL_CARRIER_NAME||'","'||SITETX_EQUIP_ID||'","'||SITETX_SITE_STAT||'","'||SITETX_CREATE_DATE||'","'||ADVTX_VEH_WT||'"'
"TRANSPORT INC","113","00000000","25-JAN-13 10.17.51 AM",""
"TRANSPORT INC","1905","00000000","25-JAN-13 05.06.44 PM","0"
これは、ヘッダーが台無しになっていることを示しています。表示されているデータの場合と同様に、SQL ステートメントとして解釈されるはずだった文字列全体を文字通り出力しています。
私が検討しているオプション:
1) コルセップの使用
set colsep '","'
spool
select * from TABLE
spool off
これにより、データの先頭と末尾にスペースがあり、ファイルの最初と最後の値が引用符で囲まれていないため、他の問題が発生します
HOST_SITE_TX_ID"," SITE_ID"
" 12345"," 16"
" 12345"," 21
この方法は、以前に説明した方法よりも胸やけが多くなるという結論に達しました。
2) ファイルを取得し、正規表現を使用してヘッダーを変更します。
3) スクリプトを使用して、ヘッダーを完全に残し、ファイルの先頭に手動でヘッダー文字列を追加する
オプション 2 はより実行可能ですが、何らかの方法でヘッダーをフォーマットするより良い方法があるかどうかを尋ねることにまだ興味があったため、通常の csv (カンマ区切り、二重引用符で囲まれた) 形式で提供されます。
ハードコーディングをできるだけ少なくすることを検討しています-エクスポートしているテーブルには約40列があり、現在約400万レコードのスクリプトを実行しています-それぞれ約10Kのバッチでそれらを分割しています. 私のアプローチとはまったく異なる提案があれば、本当に感謝しています-私は学習のプログラマーです。