【发布时间】:2013-08-01 13:10:02
【问题描述】:
我需要使用 sqlplus 从 Oracle 中的表中假脱机 csv。以下是所需的格式:
"HOST_SITE_TX_ID","SITE_ID","SITETX_TX_ID","SITETX_HELP_ID"
"664436565","16","2195301","0"
"664700792","52","1099970","0"
以下是我编写的 shell 脚本的相关部分:
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) 使用 colsep
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 的一批。我非常感谢任何建议,即使与我的方法完全不同 - 我是一名正在学习的程序员。
【问题讨论】:
标签: oracle header sqlplus spool