Форматирование заголовка при буферизации CSV-файла в sqlplus

Мне необходимо выполнить буферизацию csv из таблицы в Oracle, используя sqlplus. Ниже приведен требуемый формат:

"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 столбцов, и в настоящее время я запускаю сценарий для около 4 миллионов записей, разбивая их партиями по 10 КБ каждая. Я был бы очень признателен за любые предложения, даже если они полностью отличаются от моего подхода - я программист в процессе обучения.


person Tech_Coder    schedule 31.07.2013    source источник


Ответы (3)


Один из простых способов получить 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 - это скрытый параметр, но важно иметь ТОЛЬКО один заголовок

person higuita    schedule 03.07.2014
comment
Мне трудно понять, как это ответ на заданный здесь вопрос. - person Andrew Barber; 03.07.2014
comment
как это ответ ??? он четко сказал, и я подтверждаю, что кольцеп не работает все время - person Sam B; 03.12.2020

Вот как я создал заголовок:

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;
person the_slk    schedule 01.08.2013

Вот как вы добавляете заголовок, разделенный вертикальной чертой, в операторы 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
...
person Sam B    schedule 03.12.2020