【问题标题】:Header formatting while spooling a csv file in sqlplus在 sqlplus 中假脱机 csv 文件时的标题格式
【发布时间】: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


    【解决方案1】:

    拥有一个只有一个标题的 csv 的一种简单方法是这样做

    set embedded on
    set pagesize 0
    set colsep '|'
    set echo off
    set feedback off
    set linesize 1000
    set trimspool on
    set headsep off
    

    embedded 是一个隐藏选项,但只有一个标题很重要

    【讨论】:

    • 我很难理解这是对这里提出的问题的回答。
    • 这是怎么回答的???他清楚地说,我确认添加 colsep 并不总是有效
    【解决方案2】:

    这就是我创建标题的方式:

    set heading off
    
    /* header */
    SELECT '"'||PCL_CARRIER_NAME||'","'||SITETX_EQUIP_ID||'","'||SITETX_SITE_STAT||'","'||SITETX_CREATE_DATE||'","'||ADVTX_VEH_WT||'"'
    FROM
    (
            SELECT  'PCL_CARRIER_NAME'   AS PCL_CARRIER_NAME
            ,       'SITETX_EQUIP_ID'    AS SITETX_EQUIP_ID
            ,       'SITETX_SITE_STAT'   AS SITETX_SITE_STAT
            ,       'SITETX_CREATE_DATE' AS SITETX_CREATE_DATE
            ,       'ADVTX_VEH_WT'       AS ADVTX_VEH_WT
            FROM    DUAL
    )
    UNION ALL
    SELECT '"'||PCL_CARRIER_NAME||'","'||SITETX_EQUIP_ID||'","'||SITETX_SITE_STAT||'","'||SITETX_CREATE_DATE||'","'||ADVTX_VEH_WT||'"'
    FROM
    (
            /* first row */
            SELECT  to_char(123)                    AS PCL_CARRIER_NAME
            ,       to_char(sysdate, 'yyyy-mm-dd')  AS SITETX_EQUIP_ID
            ,       'value3'                        AS SITETX_SITE_STAT
            ,       'value4'                        AS SITETX_CREATE_DATE
            ,       'value5'                        AS ADVTX_VEH_WT
            FROM    DUAL
            UNION ALL
            /* second row */
            SELECT  to_char(456)                     AS PCL_CARRIER_NAME
            ,       to_char(sysdate-1, 'yyyy-mm-dd') AS SITETX_EQUIP_ID
            ,       'value3'                         AS SITETX_SITE_STAT
            ,       'value4'                         AS SITETX_CREATE_DATE
            ,       'value5'                         AS ADVTX_VEH_WT
            FROM    DUAL
    ) MISSING_HOST_SITE_TX_IDS;
    

    【讨论】:

      【解决方案3】:

      这是向 SQL 语句添加管道分隔标头的方法。一旦你把它弄出来,“东西”就不会在那里

      -- this creates the header
      select 'header_column1|header_column2|header_column3' as something
      From dual
      Union all
      -- this is where you run the actual sql statement with pipes in it
      select 
      rev.value1 ||'|'||
      rev.value2 ||'|'|| 
      'related_Rel' as something
      from
      ...
      

      【讨论】:

        猜你喜欢
        • 2018-05-22
        • 2010-10-13
        • 1970-01-01
        • 1970-01-01
        • 2017-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多